Example #1
0
 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)
Example #2
0
    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
Example #3
0
    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()
Example #4
0
 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
Example #5
0
    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")
Example #6
0
    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
Example #7
0
    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()
Example #8
0
    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