recdbf_toadd[ntag] = int() else: recdbf_toadd[ntag] = int(valtag) elif dbf_recc_type[ntag] == 'decimal': if valtag == 'None' or valtag == '': recdbf_toadd[ntag] = float() else: recdbf_toadd[ntag] = float(valtag) elif dbf_recc_type[ntag] == 'string': recdbf_toadd[ntag] = str(valtag) dbf.write_record(k, recdbf_toadd) recdbf_toadd.clear dbf.close() #Fill metadata gml_generator = GMLGenerator(user_enc) input_metadata = utOpen(gml_file) retMetadata = meta_import(input_metadata.read()) l_file = open(os.path.join(FILES_PATH, '%s%s' % (name, '.xml')), 'wb') l_file.write(gml_generator.fillExportMetadata(retMetadata, name)) l_file.close() #Fill projection input_prj = utOpen(gml_file) retProjection = prj_import(input_prj.read()) l_file = open(os.path.join(FILES_PATH, '%s%s' % (name, '.prj')), 'wb') l_file.write(str(retProjection)) l_file.close()
def shp_to_gml(filename, in_schema, user_enc="utf-8", temp_name=None): #generate name name_tmp = os.path.split(filename)[1] if '.' in name_tmp: name = name_tmp[:name_tmp.rfind('.')] else: name = name_tmp if temp_name: meta_filename = temp_name else: meta_filename = name # Creates the GML file inputfilepath = os.path.join(FILES_PATH, filename) shp = shapelib.ShapeFile(inputfilepath) dbf = dbflib.DBFFile(inputfilepath) # GML output gml_generator = GMLGenerator(user_enc) # Some alias shp_read = shp.read_object #file read if not in_schema: in_schema = XSD_FILE input_schema = utOpen(in_schema) # Fill schema(dbf) information conv_gml = gml_sd_import(input_schema.read()) #Read metadata retMetadata = {} try: input_metadata = utOpen("%s.xml" % os.path.join(FILES_PATH, name)) retMetadata = meta_import(input_metadata.read()) except: for k in METADATA_LABELS: retMetadata[k] = '' #Read projection try: input_prj = utOpen("%s.prj" % os.path.join(FILES_PATH, name)).read() except: input_prj = '' dbf_filter = {} for j in range(len(conv_gml.getRec_dbf())): ttype, tname, tlen, tdecc = (conv_gml.getRec_dbf())[j] dbf_filter[tname] = {'type':ttype, 'len':tlen, 'decc':tdecc} gml_data = gml_generator.fillHeader(in_schema) gml_data += gml_generator.fillMetadata(retMetadata, meta_filename) gml_data += gml_generator.fillProjection(input_prj) gml_data += gml_generator.fillBoundingBox(shp.info()[2][0], shp.info()[2][1], shp.info()[3][0], shp.info()[3][1]) for j in range(dbf.record_count()): dbf_ready = {} for k,v in ((dbf.read_record(j)).items()): if k in dbf_filter: if dbf_filter[k]['type'] == 'string': if len(v) is not 0: if len(v) > int(dbf_filter[k]['len']): v = v[:int(dbf_filter[k]['len'])] if dbf_filter[k]['type'] == 'decimal': if not len(str(v)) == 0: if not '.' in str(v): v = float(str(v) + ".0") whole,decimal = str(v).split('.') if len(whole) > int(dbf_filter[k]['len']): whole = whole[:int(dbf_filter[k]['len'])] if len(decimal) > int(dbf_filter[k]['decc']): decimal = decimal[:int(dbf_filter[k]['decc'])] v = whole + '.' + decimal if dbf_filter[k]['type'] == 'integer': if not len(v) == 0: if len(v) > int(dbf_filter[k]['len']): v = v[:int(dbf_filter[k]['len'])] dbf_ready[k] = v # Add rest of the records as null for kf in dbf_filter: if kf not in dbf_ready: dbf_ready[kf] = '' # Geometry types # Point if shp.info()[1] == 1: gml_data += gml_generator.fillFeatureMemberPoint("F%s" % j, shp_read(j).vertices()[0][0], shp_read(j).vertices()[0][1], dbf_ready) # Polyline elif shp.info()[1] == 3: gml_data += gml_generator.fillFeatureMemberLine("F%s" % j, shp_read(j).vertices(), dbf_ready) # Polygon elif shp.info()[1] == 5: gml_data += gml_generator.fillFeatureMemberPolygon("F%s" % j, shp_read(j).vertices(), dbf_ready) gml_data += gml_generator.fillFooter() shp.close() dbf.close() return gml_data