def _error_handler(self,err_level, err_no, err_msg): if err_level > gdal.CE_Warning: raise RuntimeError(err_msg) elif err_level == gdal.CE_Debug: VfrLogger.debug(err_msg + os.linesep) else: VfrLogger.warning(err_msg)
def _process_changes(self, ilayer, olayer, column='gml_id'): changes_list = {} ilayer.ResetReading() ifeature = ilayer.GetNextFeature() while ifeature: fcode = ifeature.GetField(column) # check if feature already exists in output layer found = [] olayer.SetAttributeFilter("%s = '%s'" % (column, fcode)) for feature in olayer: found.append(feature.GetFID()) n_feat = len(found) changes_list[ifeature.GetFID()] = (Action.update, found[0]) if n_feat > 0 \ else (Action.add, -1) if n_feat > 1: # TODO: how to handle correctly? VfrLogger.warning("Layer '%s': %d features '%s' found. Duplicated features will be deleted." % \ (olayer.GetName(), n_feat, fcode)) for fid in found[1:]: # delete duplicates olayer.DeleteFeature(fid) ifeature = ilayer.GetNextFeature() # unset attribute filter olayer.SetAttributeFilter(None) return changes_list
def _update_fid_seq(self, table, fid, column = 'ogc_fid'): if not self._conn: VfrLogger.warning("Unable to update FID sequence for table '%s'" % table) return cursor = self._conn.cursor() try: cursor.execute("SELECT setval('%s_%s_seq', %d)" % (table, column, fid)) except StandardError as e: VfrLogger.warning("Unable to update FID sequence for table '%s': %s" % (table, e)) cursor.close()
def _modify_feature(self, feature, geom_idx, ofeature, suppress=False): # set requested geometry if geom_idx > -1: geom = feature.GetGeomFieldRef(geom_idx) if geom: ofeature.SetGeometry(geom.Clone()) else: ofeature.SetGeometry(None) if not suppress: VfrLogger.warning("Feature %d has no geometry (geometry column: %d)" % \ (feature.GetFID(), geom_idx)) return geom_idx
def __init__(self, frmt, dsn, geom_name=None, layers=[], nogeomskip=False, overwrite=False, lco_options=[]): self._check_ogr() self.frmt = frmt self._geom_name = geom_name self._overwrite = overwrite self._layer_list = layers self._nogeomskip = nogeomskip self._lco_options = lco_options self._file_list = [] # input self._idrv = ogr.GetDriverByName("GML") if self._idrv is None: raise VfrError("Unable to select GML driver") self._ids = None # output self.odsn = dsn if not self.odsn: self._odrv = self._ods = None return self._odrv = ogr.GetDriverByName(frmt) if self._odrv is None: raise VfrError("Format '%s' is not supported" % frmt) # try to open datasource self._ods = self._odrv.Open(self.odsn, True) if self._ods is None: # if fails, try to create new datasource self._ods = self._odrv.CreateDataSource(self.odsn) if self._ods is None: raise VfrError("Unable to open or create new datasource '%s'" % self.odsn) self._create_geom = self._ods.TestCapability(ogr.ODsCCreateGeomFieldAfterCreateLayer) if not self._geom_name and \ not self._create_geom: VfrLogger.warning("Driver '%s' doesn't support multiple geometry columns. " "Only first will be used." % self._odrv.GetName()) # OVERWRITE is not support by Esri Shapefile if self._overwrite: if self.frmt != 'ESRI Shapefile': self._lco_options.append("OVERWRITE=YES")
def _get_fid_max(self, table, column='ogc_fid'): if not self._conn: VfrLogger.warning("No DB connection defined." % table) return cursor = self._conn.cursor() try: cursor.execute("SELECT max(%s) FROM %s" % (column, table)) except StandardError as e: cursor.execute('ROLLBACK') cursor.close() return -1 try: fid_max = int(cursor.fetchall()[0][0]) except TypeError: fid_max = -1 cursor.close() return fid_max
def create_indices(self): if not self._conn: return if not self.schema_list: self.schema_list = ['public'] column = "gml_id" cursor = self._conn.cursor() for schema in self.schema_list: for layer in self._layer_list: if layer == 'ZaniklePrvky': # skip deleted features continue if '.' in layer: schema, table = map(lambda x: x.lower(), layer.split('.', 1)) else: table = layer.lower() indexname = "%s_%s_idx" % (table, column) cursor.execute("SELECT COUNT(*) FROM pg_indexes WHERE " "tablename = '%s' and schemaname = '%s' and " "indexname = '%s'" % (table, schema, indexname)) if cursor.fetchall()[0][0] > 0: continue # indices for specified table already exists cursor.execute('BEGIN') try: cursor.execute("CREATE INDEX %s ON %s.%s (%s)" % \ (indexname, schema, table, column)) cursor.execute('COMMIT') except StandardError as e: VfrLogger.warning("Unable to create index %s_%s: %s" % (table, column, e)) cursor.execute('ROLLBACK') cursor.close()
def _process_deleted_features(self, layer): lcode2lname = { 'ST' : 'Staty', 'RS' : 'RegionySoudrznosti', 'KR' : 'Kraje', 'VC' : 'Vusc', 'OK' : 'Okresy', 'OP' : 'Orp', 'PU' : 'Pou', 'OB' : 'Obce', 'SP' : 'SpravniObvody', 'MP' : 'Mop', 'MC' : 'Momc', 'CO' : 'CastiObci', 'KU' : 'KatastralniUzemi', 'ZJ' : 'Zsj', 'UL' : 'Ulice', 'PA' : 'Parcely', 'SO' : 'StavebniObjekty', 'AD' : 'AdresniMista', } column = 'gml_id' dlist = {} for layer_name in lcode2lname.itervalues(): dlist[layer_name] = {} layer.ResetReading() feature = layer.GetNextFeature() layer_previous = None while feature: # determine layer and attribute filter for given feature lcode = feature.GetField("TypPrvkuKod") layer_name = lcode2lname.get(lcode, None) if not layer_name: error("Unknown layer code '%s'" % lcode) feature = layer.GetNextFeature() continue if self._layer_list and layer_name not in self._layer_list: feature = layer.GetNextFeature() continue fcode = "%s.%s" % (lcode, feature.GetField("PrvekId")) if not layer_previous or layer_previous != layer_name: dlayer = self._ods.GetLayerByName('%s' % layer_name) if dlayer is None: error("Layer '%s' not found" % layer_name) feature = layer.GetNextFeature() continue # find features to be deleted (collect their FIDs) n_feat = 0 dlayer.SetAttributeFilter("%s = '%s'" % (column, fcode)) for dfeature in dlayer: fid = dfeature.GetFID() dlist[layer_name][fid] = (Action.delete, fid) n_feat += 1 dlayer.SetAttributeFilter(None) # check for consistency (one feature should be found) if n_feat == 0: VfrLogger.warning("Layer '%s': no feature '%s' found. " "Nothing to delete." % \ (layer_name, fcode)) elif n_feat > 1: VfrLogger.warning("Layer '%s': %d features '%s' found. " "All of them will be deleted." % (layer_name, n_feat, fcode)) layer_previous = layer_name feature = layer.GetNextFeature() # return statistics return dlist