def getOgrCompatibleSource(self, parameter_name, parameters, context, feedback): """ Interprets a parameter as an OGR compatible source and layer name """ input_layer = self.parameterAsVectorLayer(parameters, parameter_name, context) ogr_data_path = None ogr_layer_name = None if input_layer is None: # parameter is not a vector layer - try to convert to a source compatible with OGR # and extract selection if required ogr_data_path = self.parameterAsCompatibleSourceLayerPath(parameters, parameter_name, context, QgsVectorFileWriter.supportedFormatExtensions(), feedback=feedback) ogr_layer_name = GdalUtils.ogrLayerName(ogr_data_path) elif input_layer.dataProvider().name() == 'ogr': # parameter is a vector layer, with OGR data provider # so extract selection if required ogr_data_path = self.parameterAsCompatibleSourceLayerPath(parameters, parameter_name, context, QgsVectorFileWriter.supportedFormatExtensions(), feedback=feedback) ogr_layer_name = GdalUtils.ogrLayerName(input_layer.dataProvider().dataSourceUri()) else: # vector layer, but not OGR - get OGR compatible path # TODO - handle "selected features only" mode!! ogr_data_path = GdalUtils.ogrConnectionString(input_layer.dataProvider().dataSourceUri(), context)[1:-1] ogr_layer_name = GdalUtils.ogrLayerName(input_layer.dataProvider().dataSourceUri()) return ogr_data_path, ogr_layer_name
def getConsoleCommands(self, parameters, context, feedback): inLayer = self.getParameterValue(self.INPUT_LAYER) ogrLayer = GdalUtils.ogrConnectionString(inLayer, context)[1:-1] clipLayer = self.getParameterValue(self.CLIP_LAYER) ogrClipLayer = GdalUtils.ogrConnectionString(clipLayer, context)[1:-1] output = self.getOutputFromName(self.OUTPUT_LAYER) outFile = output.value output = GdalUtils.ogrConnectionString(outFile, context) options = str(self.getParameterValue(self.OPTIONS)) arguments = [] arguments.append('-clipsrc') arguments.append(ogrClipLayer) arguments.append("-clipsrclayer") arguments.append(GdalUtils.ogrLayerName(clipLayer)) if options is not None and len(options.strip()) > 0: arguments.append(options) arguments.append(output) arguments.append(ogrLayer) arguments.append(GdalUtils.ogrLayerName(inLayer)) commands = [] if isWindows(): commands = ['cmd.exe', '/C ', 'ogr2ogr.exe', GdalUtils.escapeAndJoin(arguments)] else: commands = ['ogr2ogr', GdalUtils.escapeAndJoin(arguments)] return commands
def getOgrCompatibleSource(self, parameter_name, parameters, context, feedback, executing): """ Interprets a parameter as an OGR compatible source and layer name :param executing: """ if not executing and parameter_name in parameters and isinstance(parameters[parameter_name], QgsProcessingFeatureSourceDefinition): # if not executing, then we throw away all 'selected features only' settings # since these have no meaning for command line gdal use, and we don't want to force # an export of selected features only to a temporary file just to show the command! parameters = {parameter_name: parameters[parameter_name].source} input_layer = self.parameterAsVectorLayer(parameters, parameter_name, context) ogr_data_path = None ogr_layer_name = None if input_layer is None or input_layer.dataProvider().name() == 'memory': if executing: # parameter is not a vector layer - try to convert to a source compatible with OGR # and extract selection if required ogr_data_path = self.parameterAsCompatibleSourceLayerPath(parameters, parameter_name, context, QgsVectorFileWriter.supportedFormatExtensions(), feedback=feedback) ogr_layer_name = GdalUtils.ogrLayerName(ogr_data_path) else: #not executing - don't waste time converting incompatible sources, just return dummy strings #for the command preview (since the source isn't compatible with OGR, it has no meaning anyway and can't #be run directly in the command line) ogr_data_path = 'path_to_data_file' ogr_layer_name = 'layer_name' elif input_layer.dataProvider().name() == 'ogr': if executing and isinstance(parameters[parameter_name], QgsProcessingFeatureSourceDefinition) and parameters[parameter_name].selectedFeaturesOnly: # parameter is a vector layer, with OGR data provider # so extract selection if required ogr_data_path = self.parameterAsCompatibleSourceLayerPath(parameters, parameter_name, context, QgsVectorFileWriter.supportedFormatExtensions(), feedback=feedback) parts = QgsProviderRegistry.instance().decodeUri('ogr', ogr_data_path) ogr_data_path = parts['path'] if 'layerName' in parts and parts['layerName']: ogr_layer_name = parts['layerName'] else: ogr_layer_name = GdalUtils.ogrLayerName(ogr_data_path) else: #either not using the selection, or #not executing - don't worry about 'selected features only' handling. It has no meaning #for the command line preview since it has no meaning outside of a QGIS session! ogr_data_path = GdalUtils.ogrConnectionStringAndFormatFromLayer(input_layer)[0] ogr_layer_name = GdalUtils.ogrLayerName(input_layer.dataProvider().dataSourceUri()) else: # vector layer, but not OGR - get OGR compatible path # TODO - handle "selected features only" mode!! ogr_data_path = GdalUtils.ogrConnectionStringFromLayer(input_layer) ogr_layer_name = GdalUtils.ogrLayerName(input_layer.dataProvider().dataSourceUri()) return ogr_data_path, ogr_layer_name
def getConsoleCommands(self, parameters, context, feedback): inLayer = self.getParameterValue(self.INPUT_LAYER) geometry = self.getParameterValue(self.GEOMETRY) distance = self.getParameterValue(self.RADIUS) leftright = self.getParameterValue(self.LEFTRIGHT) dissolveall = self.getParameterValue(self.DISSOLVEALL) field = self.getParameterValue(self.FIELD) multi = self.getParameterValue(self.MULTI) options = self.getParameterValue(self.OPTIONS) ogrLayer = GdalUtils.ogrConnectionString(inLayer, context)[1:-1] layername = GdalUtils.ogrLayerName(inLayer) output = self.getOutputFromName(self.OUTPUT_LAYER) outFile = output.value output = GdalUtils.ogrConnectionString(outFile, context) layername = GdalUtils.ogrLayerName(inLayer) arguments = [] arguments.append(output) arguments.append(ogrLayer) arguments.append('-dialect') arguments.append('sqlite') arguments.append('-sql') if dissolveall or field is not None: sql = "SELECT ST_Union(ST_SingleSidedBuffer({}, {}, {})), * FROM '{}'".format(geometry, distance, leftright, layername) else: sql = "SELECT ST_SingleSidedBuffer({},{},{}), * FROM '{}'".format(geometry, distance, leftright, layername) if field is not None: sql = '"{} GROUP BY {}"'.format(sql, field) arguments.append(sql) if field is not None and multi: arguments.append('-explodecollections') if options is not None and len(options.strip()) > 0: arguments.append(options) commands = [] if isWindows(): commands = ['cmd.exe', '/C ', 'ogr2ogr.exe', GdalUtils.escapeAndJoin(arguments)] else: commands = ['ogr2ogr', GdalUtils.escapeAndJoin(arguments)] return commands
def getConsoleCommands(self, parameters, context, feedback, executing=True): arguments = [] inLayer = self.parameterAsRasterLayer(parameters, self.INPUT, context) if inLayer is None: raise QgsProcessingException(self.invalidRasterError(parameters, self.INPUT)) arguments.append(inLayer.source()) outFile = self.parameterAsOutputLayer(parameters, self.OUTPUT, context) output, outFormat = GdalUtils.ogrConnectionStringAndFormat(outFile, context) arguments.append(output) if self.parameterAsBool(parameters, self.EIGHT_CONNECTEDNESS, context): arguments.append('-8') arguments.append('-b') arguments.append(str(self.parameterAsInt(parameters, self.BAND, context))) if outFormat: arguments.append('-f {}'.format(outFormat)) arguments.append(GdalUtils.ogrLayerName(output)) arguments.append(self.parameterAsString(parameters, self.FIELD, context)) commands = [] if isWindows(): commands = ['cmd.exe', '/C ', self.commandName() + '.bat', GdalUtils.escapeAndJoin(arguments)] else: commands = [self.commandName() + '.py', GdalUtils.escapeAndJoin(arguments)] return commands
def getConsoleCommands(self, parameters, context, feedback): arguments = [] inLayer = self.parameterAsRasterLayer(parameters, self.INPUT, context) arguments.append(inLayer.source()) outFile = self.parameterAsOutputLayer(parameters, self.OUTPUT, context) output, outFormat = GdalUtils.ogrConnectionStringAndFormat(outFile, context) arguments.append(output) if self.parameterAsBool(parameters, self.EIGHT_CONNECTEDNESS, context): arguments.append('-8') arguments.append('-b') arguments.append(str(self.parameterAsInt(parameters, self.BAND, context))) if outFormat: arguments.append('-f {}'.format(outFormat)) arguments.append(GdalUtils.ogrLayerName(output)) arguments.append(self.parameterAsString(parameters, self.FIELD, context)) commands = [] if isWindows(): commands = ['cmd.exe', '/C ', 'gdal_polygonize.bat', GdalUtils.escapeAndJoin(arguments)] else: commands = ['gdal_polygonize.py', GdalUtils.escapeAndJoin(arguments)] return commands
def getOgrCompatibleSource(self, parameter_name, parameters, context, feedback, executing): """ Interprets a parameter as an OGR compatible source and layer name :param executing: """ input_layer = self.parameterAsVectorLayer(parameters, parameter_name, context) ogr_data_path = None ogr_layer_name = None if input_layer is None: if executing: # parameter is not a vector layer - try to convert to a source compatible with OGR # and extract selection if required ogr_data_path = self.parameterAsCompatibleSourceLayerPath(parameters, parameter_name, context, QgsVectorFileWriter.supportedFormatExtensions(), feedback=feedback) ogr_layer_name = GdalUtils.ogrLayerName(ogr_data_path) else: #not executing - don't waste time converting incompatible sources, just return dummy strings #for the command preview (since the source isn't compatible with OGR, it has no meaning anyway and can't #be run directly in the command line) ogr_data_path = 'path_to_data_file' ogr_layer_name = 'layer_name' elif input_layer.dataProvider().name() == 'ogr': if executing: # parameter is a vector layer, with OGR data provider # so extract selection if required ogr_data_path = self.parameterAsCompatibleSourceLayerPath(parameters, parameter_name, context, QgsVectorFileWriter.supportedFormatExtensions(), feedback=feedback) ogr_layer_name = GdalUtils.ogrLayerName(input_layer.dataProvider().dataSourceUri()) else: #not executing - don't worry about 'selected features only' handling. It has no meaning #for the command line preview since it has no meaning outside of a QGIS session! ogr_data_path = GdalUtils.ogrConnectionString(input_layer.dataProvider().dataSourceUri(), context)[1:-1] ogr_layer_name = GdalUtils.ogrLayerName(input_layer.dataProvider().dataSourceUri()) else: # vector layer, but not OGR - get OGR compatible path # TODO - handle "selected features only" mode!! ogr_data_path = GdalUtils.ogrConnectionString(input_layer.dataProvider().dataSourceUri(), context)[1:-1] ogr_layer_name = GdalUtils.ogrLayerName(input_layer.dataProvider().dataSourceUri()) return ogr_data_path, ogr_layer_name
def getConsoleCommands(self, parameters, context, feedback): inLayer = self.getParameterValue(self.INPUT_LAYER) geometry = self.getParameterValue(self.GEOMETRY) distance = self.getParameterValue(self.RADIUS) options = self.getParameterValue(self.OPTIONS) ogrLayer = GdalUtils.ogrConnectionString(inLayer, context)[1:-1] layername = "'" + GdalUtils.ogrLayerName(inLayer) + "'" output = self.getOutputFromName(self.OUTPUT_LAYER) outFile = output.value output = GdalUtils.ogrConnectionString(outFile, context) layername = GdalUtils.ogrLayerName(inLayer) arguments = [] arguments.append(output) arguments.append(ogrLayer) arguments.append('-dialect') arguments.append('sqlite') arguments.append('-sql') sql = "SELECT ST_OffsetCurve({}, {}), * FROM '{}'".format(geometry, distance, layername) arguments.append(sql) if options is not None and len(options.strip()) > 0: arguments.append(options) commands = [] if isWindows(): commands = ['cmd.exe', '/C ', 'ogr2ogr.exe', GdalUtils.escapeAndJoin(arguments)] else: commands = ['ogr2ogr', GdalUtils.escapeAndJoin(arguments)] return commands
def testOgrLayerNameExtraction(self): outdir = tempfile.mkdtemp() self.cleanup_paths.append(outdir) def _copyFile(dst): shutil.copyfile(os.path.join(testDataPath, 'custom', 'grass7', 'weighted.csv'), dst) # OGR provider - single layer _copyFile(os.path.join(outdir, 'a.csv')) name = GdalUtils.ogrLayerName(outdir) self.assertEqual(name, 'a') # OGR provider - multiple layers _copyFile(os.path.join(outdir, 'b.csv')) name1 = GdalUtils.ogrLayerName(outdir + '|layerid=0') name2 = GdalUtils.ogrLayerName(outdir + '|layerid=1') self.assertEqual(sorted([name1, name2]), ['a', 'b']) name = GdalUtils.ogrLayerName(outdir + '|layerid=2') self.assertIsNone(name) # OGR provider - layername takes precedence name = GdalUtils.ogrLayerName(outdir + '|layername=f') self.assertEqual(name, 'f') name = GdalUtils.ogrLayerName(outdir + '|layerid=0|layername=f') self.assertEqual(name, 'f') name = GdalUtils.ogrLayerName(outdir + '|layername=f|layerid=0') self.assertEqual(name, 'f') # SQLiite provider name = GdalUtils.ogrLayerName('dbname=\'/tmp/x.sqlite\' table="t" (geometry) sql=') self.assertEqual(name, 't') # PostgreSQL provider name = GdalUtils.ogrLayerName( 'port=5493 sslmode=disable key=\'edge_id\' srid=0 type=LineString table="city_data"."edge" (geom) sql=') self.assertEqual(name, 'city_data.edge')
def getConsoleCommands(self, parameters, context, feedback, executing=True): context = dataobjects.createContext() inLayer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT), context) inRasterLayer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT_RASTER), context) ogrLayer = GdalUtils.ogrConnectionString(inLayer, context)[1:-1] ogrRasterLayer = GdalUtils.ogrConnectionString(inRasterLayer, context)[1:-1] arguments = [] arguments.append('-a') arguments.append(str(self.getParameterValue(self.FIELD))) arguments.append('-l') arguments.append(GdalUtils.ogrLayerName(inLayer)) arguments.append(ogrLayer) arguments.append(ogrRasterLayer) return ['gdal_rasterize', GdalUtils.escapeAndJoin(arguments)]
def getConsoleCommands(self, parameters, context, feedback): inLayer = self.getParameterValue(self.INPUT_LAYER) ogrLayer = GdalUtils.ogrConnectionString(inLayer, context)[1:-1] output = self.getOutputFromName(self.OUTPUT_LAYER) outFile = output.value formatIdx = self.getParameterValue(self.FORMAT) outFormat = FORMATS[formatIdx] ext = EXTS[formatIdx] if not outFile.endswith(ext): outFile += ext output.value = outFile output = GdalUtils.ogrConnectionString(outFile, context) options = str(self.getParameterValue(self.OPTIONS)) if outFormat == 'SQLite' and os.path.isfile(output): os.remove(output) arguments = [] arguments.append('-f') arguments.append(outFormat) if options is not None and len(options.strip()) > 0: arguments.append(options) arguments.append(output) arguments.append(ogrLayer) arguments.append(GdalUtils.ogrLayerName(inLayer)) commands = [] if isWindows(): commands = ['cmd.exe', '/C ', 'ogr2ogr.exe', GdalUtils.escapeAndJoin(arguments)] else: commands = ['ogr2ogr', GdalUtils.escapeAndJoin(arguments)] return commands
def getConsoleCommands(self, parameters, context, feedback): inLayer = self.getParameterValue(self.INPUT_LAYER) ogrLayer = GdalUtils.ogrConnectionString(inLayer, context)[1:-1] clipExtent = self.getParameterValue(self.CLIP_EXTENT) if not clipExtent: clipExtent = QgsProcessingUtils.combineLayerExtents([inLayer]) output = self.getOutputFromName(self.OUTPUT_LAYER) outFile = output.value output = GdalUtils.ogrConnectionString(outFile, context) options = str(self.getParameterValue(self.OPTIONS)) arguments = [] regionCoords = clipExtent.split(',') arguments.append('-spat') arguments.append(regionCoords[0]) arguments.append(regionCoords[2]) arguments.append(regionCoords[1]) arguments.append(regionCoords[3]) arguments.append('-clipsrc spat_extent') if options is not None and len(options.strip()) > 0: arguments.append(options) arguments.append(output) arguments.append(ogrLayer) arguments.append(GdalUtils.ogrLayerName(inLayer)) commands = [] if isWindows(): commands = ['cmd.exe', '/C ', 'ogr2ogr.exe', GdalUtils.escapeAndJoin(arguments)] else: commands = ['ogr2ogr', GdalUtils.escapeAndJoin(arguments)] return commands
def processAlgorithm(self, parameters, context, feedback): inLayer = self.parameterAsVectorLayer(parameters, self.INPUT_LAYER, context) ogrLayer = GdalUtils.ogrConnectionStringFromLayer(inLayer) layername = GdalUtils.ogrLayerName( inLayer.dataProvider().dataSourceUri()) dsUri = QgsDataSourceUri(inLayer.source()) geomColumn = dsUri.geometryColumn() srid = inLayer.crs().postgisSrid() fields = self.parameterAsFields(parameters, self.FIELDS, context) dissfield = self.parameterAsString(parameters, self.DISSFIELD, context) schema = self.parameterAsString(parameters, self.SCHEMA, context) table = self.parameterAsString(parameters, self.TABLE, context) options = self.parameterAsString(parameters, self.OPTIONS, context) distance = str( self.parameterAsDouble(parameters, self.DISTANCE, context)) dissolveall = self.parameterAsBool(parameters, self.DISSOLVEALL, context) single = self.parameterAsBool(parameters, self.SINGLE, context) if len(fields) > 0: fieldstring = ",".join(fields) + "," else: fieldstring = "" if dissolveall: if single: query = '-sql "SELECT (ST_Dump(ST_Multi(ST_Union(ST_Buffer(' + geomColumn + ',' + distance + '))))).geom::geometry(POLYGON,' + str( srid ) + ') AS geom FROM ' + layername + '" -nln ' + schema + '.' + table + ' -nlt POLYGON -lco FID=gid -lco GEOMETRY_NAME=geom --config PG_USE_COPY YES' else: query = '-sql "SELECT (ST_Multi(ST_Union(ST_Buffer(' + geomColumn + ',' + distance + '))))::geometry(MULTIPOLYGON,' + str( srid ) + ') AS geom FROM ' + layername + '" -nln ' + schema + '.' + table + ' -nlt MULTIPOLYGON -lco FID=gid -lco GEOMETRY_NAME=geom --config PG_USE_COPY YES' else: if dissfield is None: if single: query = '-sql "SELECT ' + dissfield + ',(ST_Dump(ST_Union(ST_Buffer(' + geomColumn + ',' + distance + ')))).geom::geometry(POLYGON,' + str( srid ) + ') AS geom FROM ' + layername + ' GROUP BY ' + dissfield + '" -nln ' + schema + '.' + table + ' -nlt POLYGON -lco FID=gid -lco GEOMETRY_NAME=geom --config PG_USE_COPY YES' else: query = '-sql "SELECT ' + dissfield + ',(ST_Multi(ST_Union(ST_Buffer(' + geomColumn + ',' + distance + '))))::geometry(MULTIPOLYGON,' + str( srid ) + ') AS geom FROM ' + layername + ' GROUP BY ' + dissfield + '" -nln ' + schema + '.' + table + ' -nlt MULTIPOLYGON -lco FID=gid -lco GEOMETRY_NAME=geom --config PG_USE_COPY YES' else: if single: query = '-sql "SELECT ' + fieldstring + '(ST_Dump(ST_Multi(ST_Buffer(' + geomColumn + ',' + distance + ')))).geom::geometry(POLYGON,' + str( srid ) + ') AS geom FROM ' + layername + '" -nln ' + schema + '.' + table + ' -nlt POLYGON -lco FID=gid -lco GEOMETRY_NAME=geom --config PG_USE_COPY YES' else: query = '-sql "SELECT ' + fieldstring + '(ST_Multi(ST_Buffer(' + geomColumn + ',' + distance + ')))::geometry(MULTIPOLYGON,' + str( srid ) + ') AS geom FROM ' + layername + '" -nln ' + schema + '.' + table + ' -nlt MULTIPOLYGON -lco FID=gid -lco GEOMETRY_NAME=geom --config PG_USE_COPY YES' arguments = [] arguments.append('-f') arguments.append('PostgreSQL') arguments.append(ogrLayer) arguments.append(ogrLayer) arguments.append(query) arguments.append('-overwrite') if len(options) > 0: arguments.append(options) commands = ['ogr2ogr', GdalUtils.escapeAndJoin(arguments)] GdalUtils.runGdal(commands, feedback) return {}
def getConsoleCommands(self, parameters, context, feedback): inLayer = self.getParameterValue(self.INPUT_LAYER) geometry = self.getParameterValue(self.GEOMETRY) field = self.getParameterValue(self.FIELD) multi = self.getParameterValue(self.MULTI) fields = self.getParameterValue(self.FIELDS) count = self.getParameterValue(self.COUNT) area = self.getParameterValue(self.AREA) stats = self.getParameterValue(self.STATS) statsatt = self.getParameterValue(self.STATSATT) options = self.getParameterValue(self.OPTIONS) ogrLayer = GdalUtils.ogrConnectionString(inLayer, context)[1:-1] layername = GdalUtils.ogrLayerName(inLayer) output = self.getOutputFromName(self.OUTPUT_LAYER) outFile = output.value output = GdalUtils.ogrConnectionString(outFile, context) arguments = [] arguments.append(output) arguments.append(ogrLayer) arguments.append('-dialect') arguments.append('sqlite') arguments.append('-sql') sql = "SELECT ST_Union({})".format(geometry) sqlOpts = '' if fields: sqlOpts += ',*' else: sqlOpts += ',{}'.format(field) if count: sqlOpts += ", COUNT({}) AS count".format(geometry) if stats: sqlOpts += ", SUM({0}) AS sum_diss, MIN({0}) AS min_diss, MAX({0}) AS max_diss, AVG({0}) AS avg_diss".format(statsatt) if area: sqlOpts += ", SUM(ST_Area({0})) AS area_diss, ST_Perimeter(ST_Union({0})) AS peri_diss".format(geometry) sql = '{}{} FROM {} GROUP BY {}'.format(sql, sqlOpts, layername, field) arguments.append(sql) if not multi: arguments.append('-explodecollections') if options is not None and len(options.strip()) > 0: arguments.append(options) commands = [] if isWindows(): commands = ['cmd.exe', '/C ', 'ogr2ogr.exe', GdalUtils.escapeAndJoin(arguments)] else: commands = ['ogr2ogr', GdalUtils.escapeAndJoin(arguments)] return commands
def getConsoleCommands(self, parameters, context, feedback): inLayer = self.parameterAsSource(parameters, self.INPUT, context) ogrLayer, layername = self.getOgrCompatibleSource(self.INPUT, parameters, context, feedback) shapeEncoding = self.parameterAsString(parameters, self.SHAPE_ENCODING, context) ssrs = self.parameterAsCrs(parameters, self.S_SRS, context).authid() tsrs = self.parameterAsCrs(parameters, self.T_SRS, context).authid() asrs = self.parameterAsCrs(parameters, self.A_SRS, context).authid() table = self.parameterAsString(parameters, self.TABLE, context) schema = self.parameterAsString(parameters, self.SCHEMA, context) pk = self.parameterAsString(parameters, self.PK, context) pkstring = "-lco FID=" + pk primary_key = self.parameterAsString(parameters, self.PRIMARY_KEY, context) geocolumn = self.parameterAsString(parameters, self.GEOCOLUMN, context) geocolumnstring = "-lco GEOMETRY_NAME=" + geocolumn dim = self.DIMLIST[self.parameterAsEnum(parameters, self.DIM, context)] dimstring = "-lco DIM=" + dim simplify = self.parameterAsString(parameters, self.SIMPLIFY, context) segmentize = self.parameterAsString(parameters, self.SEGMENTIZE, context) spat = self.parameterAsExtent(parameters, self.SPAT, context) if spat.isNull(): spat = inLayer.sourceExtent() clip = self.parameterAsBool(parameters, self.CLIP, context) where = self.parameterAsString(parameters, self.WHERE, context) wherestring = '-where "' + where + '"' gt = self.parameterAsString(parameters, self.GT, context) overwrite = self.parameterAsBool(parameters, self.OVERWRITE, context) append = self.parameterAsBool(parameters, self.APPEND, context) addfields = self.parameterAsBool(parameters, self.ADDFIELDS, context) launder = self.parameterAsBool(parameters, self.LAUNDER, context) launderstring = "-lco LAUNDER=NO" index = self.parameterAsBool(parameters, self.INDEX, context) indexstring = "-lco SPATIAL_INDEX=OFF" skipfailures = self.parameterAsBool(parameters, self.SKIPFAILURES, context) promotetomulti = self.parameterAsBool(parameters, self.PROMOTETOMULTI, context) precision = self.parameterAsBool(parameters, self.PRECISION, context) options = self.parameterAsString(parameters, self.OPTIONS, context) arguments = [] arguments.append('-progress') arguments.append('--config PG_USE_COPY YES') if len(shapeEncoding) > 0: arguments.append('--config') arguments.append('SHAPE_ENCODING') arguments.append('"' + shapeEncoding + '"') arguments.append('-f') arguments.append('PostgreSQL') arguments.append('PG:"') arguments.append(self.getConnectionString(parameters, context)) arguments.append('"') arguments.append(dimstring) arguments.append(ogrLayer) arguments.append(GdalUtils.ogrLayerName(inLayer)) if index: arguments.append(indexstring) if launder: arguments.append(launderstring) if append: arguments.append('-append') if addfields: arguments.append('-addfields') if overwrite: arguments.append('-overwrite') if len(self.GEOMTYPE[self.parameterAsEnum(parameters, self.GTYPE, context)]) > 0: arguments.append('-nlt') arguments.append(self.GEOMTYPE[self.parameterAsEnum(parameters, self.GTYPE, context)]) if len(geocolumn) > 0: arguments.append(geocolumnstring) if len(pk) > 0: arguments.append(pkstring) elif primary_key is not None: arguments.append("-lco FID=" + primary_key) if len(table) == 0: table = GdalUtils.ogrLayerName(inLayer).lower() if schema: table = '{}.{}'.format(schema, table) arguments.append('-nln') arguments.append(table) if len(ssrs) > 0: arguments.append('-s_srs') arguments.append(ssrs) if len(tsrs) > 0: arguments.append('-t_srs') arguments.append(tsrs) if len(asrs) > 0: arguments.append('-a_srs') arguments.append(asrs) if not spat.isNull(): arguments.append('-spat') arguments.append(spat.xMinimum()) arguments.append(spat.yMinimum()) arguments.append(spat.xMaximum()) arguments.append(spat.yMaximum()) if clip: arguments.append('-clipsrc spat_extent') if skipfailures: arguments.append('-skipfailures') if where: arguments.append(wherestring) if len(simplify) > 0: arguments.append('-simplify') arguments.append(simplify) if len(segmentize) > 0: arguments.append('-segmentize') arguments.append(segmentize) if len(gt) > 0: arguments.append('-gt') arguments.append(gt) if promotetomulti: arguments.append('-nlt PROMOTE_TO_MULTI') if precision is False: arguments.append('-lco PRECISION=NO') if len(options) > 0: arguments.append(options) commands = [] if isWindows(): commands = ['cmd.exe', '/C ', 'ogr2ogr.exe', GdalUtils.escapeAndJoin(arguments)] else: commands = ['ogr2ogr', GdalUtils.escapeAndJoin(arguments)] return commands
def processAlgorithm(self, parameters, context, feedback): inLayerA = self.parameterAsVectorLayer(parameters, self.INPUT_LAYER_A, context) ogrLayerA = GdalUtils.ogrConnectionStringFromLayer(inLayerA) layernameA = GdalUtils.ogrLayerName( inLayerA.dataProvider().dataSourceUri()) inLayerB = self.parameterAsVectorLayer(parameters, self.INPUT_LAYER_B, context) ogrLayerB = GdalUtils.ogrConnectionStringFromLayer(inLayerB) layernameB = GdalUtils.ogrLayerName( inLayerB.dataProvider().dataSourceUri()) fieldsB = self.parameterAsFields(parameters, self.FIELDS_B, context) uri = QgsDataSourceUri(inLayerA.source()) geomColumnA = uri.geometryColumn() uri = QgsDataSourceUri(inLayerB.source()) geomColumnB = uri.geometryColumn() geomTypeB = inLayerB.geometryType() sridB = inLayerB.crs().postgisSrid() schema = self.parameterAsString(parameters, self.SCHEMA, context) table = self.parameterAsString(parameters, self.TABLE, context) options = self.parameterAsString(parameters, self.OPTIONS, context) single = self.parameterAsBool(parameters, self.SINGLE, context) keep = self.parameterAsBool(parameters, self.KEEP, context) bufferdist = self.parameterAsDouble(parameters, self.BUFFER, context) if len(fieldsB) > 0: fieldstringB = ', '.join(["g2.{}".format(f) for f in fieldsB]) fieldstringB = ", " + fieldstringB else: fieldstringB = "" if geomTypeB == QgsWkbTypes.PointGeometry: type = "POINT" elif geomTypeB == QgsWkbTypes.LineGeometry: type = "LINESTRING" else: type = "POLYGON" if single: multistring = "-nlt " + type caststring = type st_function = "ST_Dump" castgeom = ".geom" else: multistring = "-nlt MULTI" + type caststring = "MULTI" + type st_function = "ST_Multi" castgeom = "" if geomTypeB == QgsWkbTypes.PointGeometry: if bufferdist == 0.0: sqlstring = "-sql \"SELECT (" + st_function + "(g2." + geomColumnB + "))" + castgeom + "::geometry(" + caststring + "," + str( sridB ) + ") AS geom" + fieldstringB + " FROM " + layernameA + " AS g1, " + layernameB + " AS g2 WHERE ST_Intersects(g2." + geomColumnB + ",g1." + geomColumnA + ") is true\" -nln " + schema + "." + table + " -lco FID=gid " + multistring + " -lco GEOMETRY_NAME=geom --config PG_USE_COPY YES" else: if keep: sqlstring = "-sql \"SELECT (" + st_function + "(g2." + geomColumnB + "))" + castgeom + "::geometry(" + caststring + "," + str( sridB ) + ") AS geom" + fieldstringB + " FROM " + layernameA + " AS g1, " + layernameB + " AS g2 WHERE (ST_Intersects(ST_Buffer(g1." + geomColumnA + "," + bufferdist + "),g2." + geomColumnB + ")) is true OR (ST_Touches(ST_Buffer(g1." + geomColumnA + "," + bufferdist + "),g2." + geomColumnB + ")) is true\" -nln " + schema + "." + table + " -lco FID=gid " + multistring + " -lco GEOMETRY_NAME=geom --config PG_USE_COPY YES" else: sqlstring = "-sql \"SELECT (" + st_function + "(g2." + geomColumnB + "))" + castgeom + "::geometry(" + caststring + "," + str( sridB ) + ") AS geom" + fieldstringB + " FROM " + layernameA + " AS g1, " + layernameB + " AS g2 WHERE (ST_Intersects(ST_Buffer(g1." + geomColumnA + "," + bufferdist + "),g2." + geomColumnB + ")) is true AND (ST_Touches(ST_Buffer(g1." + geomColumnA + "," + bufferdist + "),g2." + geomColumnB + ")) is false\" -nln " + schema + "." + table + " -lco FID=gid " + multistring + " -lco GEOMETRY_NAME=geom --config PG_USE_COPY YES" elif geomTypeB == QgsWkbTypes.LineGeometry: if bufferdist == 0.0: sqlstring = "-sql \"SELECT (" + st_function + "(g2." + geomColumnB + "))" + castgeom + "::geometry(" + caststring + "," + str( sridB ) + ") AS geom" + fieldstringB + " FROM " + layernameA + " AS g1, " + layernameB + " AS g2 WHERE ST_Intersects(g2." + geomColumnB + ",g1." + geomColumnA + ") is true\" -nln " + schema + "." + table + " -lco FID=gid " + multistring + " -lco GEOMETRY_NAME=geom --config PG_USE_COPY YES" else: if keep: sqlstring = "-sql \"SELECT (" + st_function + "(g2." + geomColumnB + "))" + castgeom + "::geometry(" + caststring + "," + str( sridB ) + ") AS geom" + fieldstringB + " FROM " + layernameA + " AS g1, " + layernameB + " AS g2 WHERE (ST_Intersects(ST_Buffer(g1." + geomColumnA + "," + bufferdist + "),g2." + geomColumnB + ")) is true OR (ST_Touches(ST_Buffer(g1." + geomColumnA + "," + bufferdist + "),g2." + geomColumnB + ")) is true\" -nln " + schema + "." + table + " -lco FID=gid " + multistring + " -lco GEOMETRY_NAME=geom --config PG_USE_COPY YES" else: sqlstring = "-sql \"SELECT (" + st_function + "(g2." + geomColumnB + "))" + castgeom + "::geometry(" + caststring + "," + str( sridB ) + ") AS geom" + fieldstringB + " FROM " + layernameA + " AS g1, " + layernameB + " AS g2 WHERE (ST_Intersects(ST_Buffer(g1." + geomColumnA + "," + bufferdist + "),g2." + geomColumnB + ")) is true AND (ST_Touches(ST_Buffer(g1." + geomColumnA + "," + bufferdist + "),g2." + geomColumnB + ")) is false\" -nln " + schema + "." + table + " -lco FID=gid " + multistring + " -lco GEOMETRY_NAME=geom --config PG_USE_COPY YES" else: if bufferdist == 0.0: if keep: sqlstring = "-sql \"SELECT (" + st_function + "(g2." + geomColumnB + "))" + castgeom + "::geometry(" + caststring + "," + str( sridB ) + ") AS geom" + fieldstringB + " FROM " + layernameA + " AS g1, " + layernameB + " AS g2 WHERE ST_Intersects(g2." + geomColumnB + ",g1." + geomColumnA + ") is true\" -nln " + schema + "." + table + " -lco FID=gid " + multistring + " -lco GEOMETRY_NAME=geom --config PG_USE_COPY YES" else: sqlstring = "-sql \"SELECT (" + st_function + "(g2." + geomColumnB + "))" + castgeom + "::geometry(" + caststring + "," + str( sridB ) + ") AS geom" + fieldstringB + " FROM " + layernameA + " AS g1, " + layernameB + " AS g2 WHERE ST_Within(g1." + geomColumnA + ",g2." + geomColumnB + ") is true\" -nln " + schema + "." + table + " -lco FID=gid " + multistring + " -lco GEOMETRY_NAME=geom --config PG_USE_COPY YES" else: if keep: sqlstring = "-sql \"SELECT (" + st_function + "(g2." + geomColumnB + "))" + castgeom + "::geometry(" + caststring + "," + str( sridB ) + ") AS geom" + fieldstringB + " FROM " + layernameA + " AS g1, " + layernameB + " AS g2 WHERE (ST_Intersects(ST_Buffer(g1." + geomColumnA + "," + bufferdist + "),g2." + geomColumnB + ")) is true OR ST_Contains(g2." + geomColumnB + ",ST_Buffer(g1." + geomColumnA + "," + bufferdist + ")) is true\" -nln " + schema + "." + table + " -lco FID=gid " + multistring + " -lco GEOMETRY_NAME=geom --config PG_USE_COPY YES" else: sqlstring = "-sql \"SELECT (" + st_function + "(g2." + geomColumnB + "))" + castgeom + "::geometry(" + caststring + "," + str( sridB ) + ") AS geom" + fieldstringB + " FROM " + layernameA + " AS g1, " + layernameB + " AS g2 WHERE (ST_Contains(ST_Buffer(g1." + geomColumnA + "," + bufferdist + "),g2." + geomColumnB + ")) is true OR ST_Overlaps(ST_Buffer(g1." + geomColumnA + "," + bufferdist + "),g2." + geomColumnB + ") is true OR ST_Contains(g2." + geomColumnB + ",ST_Buffer(g1." + geomColumnA + "," + bufferdist + ")) is true\" -nln " + schema + "." + table + " -lco FID=gid " + multistring + " -lco GEOMETRY_NAME=geom --config PG_USE_COPY YES" arguments = [] arguments.append('-f') arguments.append('PostgreSQL') arguments.append(ogrLayerA) arguments.append(ogrLayerA) arguments.append(sqlstring) arguments.append('-overwrite') if len(options) > 0: arguments.append(options) commands = ['ogr2ogr', GdalUtils.escapeAndJoin(arguments)] GdalUtils.runGdal(commands, feedback) return {}
def getConsoleCommands(self, parameters, context, feedback, executing=True): connection = self.DB_CONNECTIONS[self.getParameterValue(self.DATABASE)] uri = uri_from_name(connection) if executing: # to get credentials input when needed uri = GeoDB(uri=uri).uri inLayer = self.getParameterValue(self.INPUT_LAYER) ogrLayer = GdalUtils.ogrConnectionString(inLayer, context)[1:-1] shapeEncoding = self.getParameterValue(self.SHAPE_ENCODING) schema = str(self.getParameterValue(self.SCHEMA)) table = str(self.getParameterValue(self.TABLE)) pk = str(self.getParameterValue(self.PK)) pkstring = "-lco FID=" + pk primary_key = self.getParameterValue(self.PRIMARY_KEY) where = str(self.getParameterValue(self.WHERE)) wherestring = '-where "' + where + '"' gt = str(self.getParameterValue(self.GT)) overwrite = self.getParameterValue(self.OVERWRITE) append = self.getParameterValue(self.APPEND) addfields = self.getParameterValue(self.ADDFIELDS) launder = self.getParameterValue(self.LAUNDER) launderstring = "-lco LAUNDER=NO" skipfailures = self.getParameterValue(self.SKIPFAILURES) precision = self.getParameterValue(self.PRECISION) options = str(self.getParameterValue(self.OPTIONS)) arguments = [] arguments.append('-progress') arguments.append('--config PG_USE_COPY YES') if len(shapeEncoding) > 0: arguments.append('--config') arguments.append('SHAPE_ENCODING') arguments.append('"' + shapeEncoding + '"') arguments.append('-f') arguments.append('PostgreSQL') arguments.append('PG:"') for token in uri.connectionInfo(executing).split(' '): arguments.append(token) arguments.append('active_schema={}'.format(schema or 'public')) arguments.append('"') arguments.append(ogrLayer) arguments.append('-nlt NONE') arguments.append(GdalUtils.ogrLayerName(inLayer)) if launder: arguments.append(launderstring) if append: arguments.append('-append') if addfields: arguments.append('-addfields') if overwrite: arguments.append('-overwrite') if len(pk) > 0: arguments.append(pkstring) elif primary_key is not None: arguments.append("-lco FID=" + primary_key) if len(table) == 0: table = GdalUtils.ogrLayerName(inLayer).lower() if schema: table = '{}.{}'.format(schema, table) arguments.append('-nln') arguments.append(table) if skipfailures: arguments.append('-skipfailures') if where: arguments.append(wherestring) if len(gt) > 0: arguments.append('-gt') arguments.append(gt) if not precision: arguments.append('-lco PRECISION=NO') if len(options) > 0: arguments.append(options) commands = [] if isWindows(): commands = ['cmd.exe', '/C ', 'ogr2ogr.exe', GdalUtils.escapeAndJoin(arguments)] else: commands = ['ogr2ogr', GdalUtils.escapeAndJoin(arguments)] return commands
def processAlgorithm(self, parameters, context, feedback): inLayerA = self.parameterAsVectorLayer(parameters, self.INPUT_LAYER_A, context) ogrLayerA = GdalUtils.ogrConnectionStringFromLayer(inLayerA) layernameA = GdalUtils.ogrLayerName( inLayerA.dataProvider().dataSourceUri()) inLayerB = self.parameterAsVectorLayer(parameters, self.INPUT_LAYER_B, context) ogrLayerB = GdalUtils.ogrConnectionStringFromLayer(inLayerB) layernameB = GdalUtils.ogrLayerName( inLayerB.dataProvider().dataSourceUri()) #fieldsA = self.parameterAsFields(parameters, self.FIELD_A, context) fieldsA = self.parameterAsFields(parameters, self.FIELDS_A, context) fieldA = self.parameterAsString(parameters, self.FIELD_A, context) fieldB = self.parameterAsString(parameters, self.FIELD_B, context) uri = QgsDataSourceUri(inLayerA.source()) geomColumnA = uri.geometryColumn() uri = QgsDataSourceUri(inLayerB.source()) geomColumnB = uri.geometryColumn() sridA = inLayerA.crs().postgisSrid() schema = self.parameterAsString(parameters, self.SCHEMA, context) table = self.parameterAsString(parameters, self.TABLE, context) options = self.parameterAsString(parameters, self.OPTIONS, context) single = self.parameterAsBool(parameters, self.SINGLE, context) if len(fieldsA) > 0: fieldstringA = ', '.join(["g1.{}".format(f) for f in fieldsA]) fieldstringA = ", " + fieldstringA else: fieldstringA = "" type = "POINT" if single: multistring = "-nlt " + type caststring = type st_function = "ST_Dump" castgeom = ".geom" else: multistring = "-nlt MULTI" + type caststring = "MULTI" + type st_function = "ST_Multi" castgeom = "" sqlstring = "-sql \"SELECT (" + st_function + "(g1." + geomColumnA + "))" + castgeom + "::geometry(" + caststring + "," + str( sridA ) + ") AS geom, g2." + fieldB + " AS " + fieldA + fieldstringA + " FROM " + layernameA + " AS g1, " + layernameB + " AS g2 WHERE ST_Intersects(g2." + geomColumnB + ",g1." + geomColumnA + ") is true\" -nln " + schema + "." + table + " -lco FID=gid " + multistring + " -lco GEOMETRY_NAME=geom --config PG_USE_COPY YES" arguments = [] arguments.append('-f') arguments.append('PostgreSQL') arguments.append(ogrLayerA) arguments.append(ogrLayerA) arguments.append(sqlstring) arguments.append('-overwrite') if len(options) > 0: arguments.append(options) commands = ['ogr2ogr', GdalUtils.escapeAndJoin(arguments)] GdalUtils.runGdal(commands, feedback) return {}
def getConsoleCommands(self, parameters, context, feedback, executing=True): connection = self.DB_CONNECTIONS[self.getParameterValue(self.DATABASE)] uri = uri_from_name(connection) if executing: # to get credentials input when needed uri = GeoDB(uri=uri).uri inLayer = self.getParameterValue(self.INPUT_LAYER) ogrLayer = GdalUtils.ogrConnectionStringFromLayer(inLayer) shapeEncoding = self.getParameterValue(self.SHAPE_ENCODING) schema = str(self.getParameterValue(self.SCHEMA)) table = str(self.getParameterValue(self.TABLE)) pk = str(self.getParameterValue(self.PK)) pkstring = "-lco FID=" + pk primary_key = self.getParameterValue(self.PRIMARY_KEY) where = str(self.getParameterValue(self.WHERE)) wherestring = '-where "' + where + '"' gt = str(self.getParameterValue(self.GT)) overwrite = self.getParameterValue(self.OVERWRITE) append = self.getParameterValue(self.APPEND) addfields = self.getParameterValue(self.ADDFIELDS) launder = self.getParameterValue(self.LAUNDER) launderstring = "-lco LAUNDER=NO" skipfailures = self.getParameterValue(self.SKIPFAILURES) precision = self.getParameterValue(self.PRECISION) options = str(self.getParameterValue(self.OPTIONS)) arguments = [] arguments.append('-progress') arguments.append('--config PG_USE_COPY YES') if len(shapeEncoding) > 0: arguments.append('--config') arguments.append('SHAPE_ENCODING') arguments.append('"' + shapeEncoding + '"') arguments.append('-f') arguments.append('PostgreSQL') arguments.append('PG:"') for token in uri.connectionInfo(executing).split(' '): arguments.append(token) arguments.append('active_schema={}'.format(schema or 'public')) arguments.append('"') arguments.append(ogrLayer) arguments.append('-nlt NONE') arguments.append(GdalUtils.ogrLayerName(inLayer)) if launder: arguments.append(launderstring) if append: arguments.append('-append') if addfields: arguments.append('-addfields') if overwrite: arguments.append('-overwrite') if len(pk) > 0: arguments.append(pkstring) elif primary_key is not None: arguments.append("-lco FID=" + primary_key) if len(table) == 0: table = GdalUtils.ogrLayerName(inLayer).lower() if schema: table = '{}.{}'.format(schema, table) arguments.append('-nln') arguments.append(table) if skipfailures: arguments.append('-skipfailures') if where: arguments.append(wherestring) if len(gt) > 0: arguments.append('-gt') arguments.append(gt) if not precision: arguments.append('-lco PRECISION=NO') if len(options) > 0: arguments.append(options) commands = [] if isWindows(): commands = ['cmd.exe', '/C ', 'ogr2ogr.exe', GdalUtils.escapeAndJoin(arguments)] else: commands = ['ogr2ogr', GdalUtils.escapeAndJoin(arguments)] return commands
def getOgrCompatibleSource(self, parameter_name, parameters, context, feedback, executing): """ Interprets a parameter as an OGR compatible source and layer name :param executing: """ if not executing and parameter_name in parameters and isinstance( parameters[parameter_name], QgsProcessingFeatureSourceDefinition): # if not executing, then we throw away all 'selected features only' settings # since these have no meaning for command line gdal use, and we don't want to force # an export of selected features only to a temporary file just to show the command! parameters = {parameter_name: parameters[parameter_name].source} input_layer = self.parameterAsVectorLayer(parameters, parameter_name, context) ogr_data_path = None ogr_layer_name = None if input_layer is None or input_layer.dataProvider().name( ) == 'memory': if executing: # parameter is not a vector layer - try to convert to a source compatible with OGR # and extract selection if required ogr_data_path = self.parameterAsCompatibleSourceLayerPath( parameters, parameter_name, context, QgsVectorFileWriter.supportedFormatExtensions(), feedback=feedback) ogr_layer_name = GdalUtils.ogrLayerName(ogr_data_path) else: #not executing - don't waste time converting incompatible sources, just return dummy strings #for the command preview (since the source isn't compatible with OGR, it has no meaning anyway and can't #be run directly in the command line) ogr_data_path = 'path_to_data_file' ogr_layer_name = 'layer_name' elif input_layer.dataProvider().name() == 'ogr': if executing: # parameter is a vector layer, with OGR data provider # so extract selection if required ogr_data_path = self.parameterAsCompatibleSourceLayerPath( parameters, parameter_name, context, QgsVectorFileWriter.supportedFormatExtensions(), feedback=feedback) ogr_layer_name = GdalUtils.ogrLayerName( input_layer.dataProvider().dataSourceUri()) else: #not executing - don't worry about 'selected features only' handling. It has no meaning #for the command line preview since it has no meaning outside of a QGIS session! ogr_data_path = GdalUtils.ogrConnectionStringAndFormatFromLayer( input_layer)[0] ogr_layer_name = GdalUtils.ogrLayerName( input_layer.dataProvider().dataSourceUri()) else: # vector layer, but not OGR - get OGR compatible path # TODO - handle "selected features only" mode!! ogr_data_path = GdalUtils.ogrConnectionString( input_layer.dataProvider().dataSourceUri(), context) ogr_layer_name = GdalUtils.ogrLayerName( input_layer.dataProvider().dataSourceUri()) return ogr_data_path, ogr_layer_name
# レイヤリスト保存 layers = project.mapLayers() # LayerID:LayerNameのkey:value layerId = {} print("Clipping開始") for layer in layers.values(): if layer.type() == QgsMapLayerType.VectorLayer: print("name:" + layer.name()) print("source:" + layer.source()) print("id:" + layer.id()) # ogrドライバが対応するデータソースかどうかチェックする layername = GdalUtils.ogrLayerName( layer.dataProvider().dataSourceUri()) if not layername: print("未サポートのデータソース:" + layer.name()) break # key:valueにセット layerId[layer.id()] = layername # テストなのでCRS未定義の場合強制的にEPSG:4612に設定 sourceCrs = layer.sourceCrs() if sourceCrs != "EPSG:4612": sourceCrs = "EPSG:4612" # ogrogrコマンド引数 cmd = ("ogr2ogr {} -f \"GPKG\" {} -a_srs \"{}\" -clipsrc {} {}".format( appendSwitch, outputFileName, sourceCrs, clipextent,
def getConsoleCommands(self, parameters, context, feedback): inLayer = self.parameterAsSource(parameters, self.INPUT, context) ogrLayer, layername = self.getOgrCompatibleSource( self.INPUT, parameters, context, feedback) shapeEncoding = self.parameterAsString(parameters, self.SHAPE_ENCODING, context) ssrs = self.parameterAsCrs(parameters, self.S_SRS, context).authid() tsrs = self.parameterAsCrs(parameters, self.T_SRS, context).authid() asrs = self.parameterAsCrs(parameters, self.A_SRS, context).authid() table = self.parameterAsString(parameters, self.TABLE, context) schema = self.parameterAsString(parameters, self.SCHEMA, context) pk = self.parameterAsString(parameters, self.PK, context) pkstring = "-lco FID=" + pk primary_key = self.parameterAsString(parameters, self.PRIMARY_KEY, context) geocolumn = self.parameterAsString(parameters, self.GEOCOLUMN, context) geocolumnstring = "-lco GEOMETRY_NAME=" + geocolumn dim = self.DIMLIST[self.parameterAsEnum(parameters, self.DIM, context)] dimstring = "-lco DIM=" + dim simplify = self.parameterAsString(parameters, self.SIMPLIFY, context) segmentize = self.parameterAsString(parameters, self.SEGMENTIZE, context) spat = self.parameterAsExtent(parameters, self.SPAT, context) if spat.isNull(): spat = inLayer.sourceExtent() clip = self.parameterAsBool(parameters, self.CLIP, context) where = self.parameterAsString(parameters, self.WHERE, context) wherestring = '-where "' + where + '"' gt = self.parameterAsString(parameters, self.GT, context) overwrite = self.parameterAsBool(parameters, self.OVERWRITE, context) append = self.parameterAsBool(parameters, self.APPEND, context) addfields = self.parameterAsBool(parameters, self.ADDFIELDS, context) launder = self.parameterAsBool(parameters, self.LAUNDER, context) launderstring = "-lco LAUNDER=NO" index = self.parameterAsBool(parameters, self.INDEX, context) indexstring = "-lco SPATIAL_INDEX=OFF" skipfailures = self.parameterAsBool(parameters, self.SKIPFAILURES, context) promotetomulti = self.parameterAsBool(parameters, self.PROMOTETOMULTI, context) precision = self.parameterAsBool(parameters, self.PRECISION, context) options = self.parameterAsString(parameters, self.OPTIONS, context) arguments = [] arguments.append('-progress') arguments.append('--config PG_USE_COPY YES') if len(shapeEncoding) > 0: arguments.append('--config') arguments.append('SHAPE_ENCODING') arguments.append('"' + shapeEncoding + '"') arguments.append('-f') arguments.append('PostgreSQL') arguments.append('PG:"') arguments.append(self.getConnectionString(parameters, context)) arguments.append('"') arguments.append(dimstring) arguments.append(ogrLayer) arguments.append(GdalUtils.ogrLayerName(inLayer)) if index: arguments.append(indexstring) if launder: arguments.append(launderstring) if append: arguments.append('-append') if addfields: arguments.append('-addfields') if overwrite: arguments.append('-overwrite') if len(self.GEOMTYPE[self.parameterAsEnum(parameters, self.GTYPE, context)]) > 0: arguments.append('-nlt') arguments.append(self.GEOMTYPE[self.parameterAsEnum( parameters, self.GTYPE, context)]) if len(geocolumn) > 0: arguments.append(geocolumnstring) if len(pk) > 0: arguments.append(pkstring) elif primary_key is not None: arguments.append("-lco FID=" + primary_key) if len(table) == 0: table = GdalUtils.ogrLayerName(inLayer).lower() if schema: table = '{}.{}'.format(schema, table) arguments.append('-nln') arguments.append(table) if len(ssrs) > 0: arguments.append('-s_srs') arguments.append(ssrs) if len(tsrs) > 0: arguments.append('-t_srs') arguments.append(tsrs) if len(asrs) > 0: arguments.append('-a_srs') arguments.append(asrs) if not spat.isNull(): arguments.append('-spat') arguments.append(spat.xMinimum()) arguments.append(spat.yMinimum()) arguments.append(spat.xMaximum()) arguments.append(spat.yMaximum()) if clip: arguments.append('-clipsrc spat_extent') if skipfailures: arguments.append('-skipfailures') if where: arguments.append(wherestring) if len(simplify) > 0: arguments.append('-simplify') arguments.append(simplify) if len(segmentize) > 0: arguments.append('-segmentize') arguments.append(segmentize) if len(gt) > 0: arguments.append('-gt') arguments.append(gt) if promotetomulti: arguments.append('-nlt PROMOTE_TO_MULTI') if precision is False: arguments.append('-lco PRECISION=NO') if len(options) > 0: arguments.append(options) commands = [] if isWindows(): commands = [ 'cmd.exe', '/C ', 'ogr2ogr.exe', GdalUtils.escapeAndJoin(arguments) ] else: commands = ['ogr2ogr', GdalUtils.escapeAndJoin(arguments)] return commands
def getConsoleCommands(self, parameters, context, feedback): inLayer = self.getParameterValue(self.INPUT) noData = self.getParameterValue(self.NO_DATA) rastext = str(self.getParameterValue(self.RAST_EXT)) if not rastext: rastext = QgsProcessingUtils.combineLayerExtents([inLayer]) opts = self.getParameterValue(self.OPTIONS) out = self.getOutputValue(self.OUTPUT) ogrLayer = GdalUtils.ogrConnectionString(inLayer, context)[1:-1] if noData is not None: noData = str(noData) arguments = [] arguments.append('-a') arguments.append(str(self.getParameterValue(self.FIELD))) arguments.append('-ot') arguments.append(self.TYPE[self.getParameterValue(self.RTYPE)]) dimType = self.getParameterValue(self.DIMENSIONS) arguments.append('-of') arguments.append(GdalUtils.getFormatShortNameFromFilename(out)) regionCoords = rastext.split(',') try: rastext = [] rastext.append('-te') rastext.append(regionCoords[0]) rastext.append(regionCoords[2]) rastext.append(regionCoords[1]) rastext.append(regionCoords[3]) except IndexError: rastext = [] if rastext: arguments.extend(rastext) if dimType == 0: # size in pixels arguments.append('-ts') arguments.append(str(self.getParameterValue(self.WIDTH))) arguments.append(str(self.getParameterValue(self.HEIGHT))) else: # resolution in map units per pixel arguments.append('-tr') arguments.append(str(self.getParameterValue(self.WIDTH))) arguments.append(str(self.getParameterValue(self.HEIGHT))) if noData and len(noData) > 0: arguments.append('-a_nodata') arguments.append(noData) if opts: arguments.append('-co') arguments.append(opts) arguments.append('-l') print(GdalUtils.ogrLayerName(inLayer)) arguments.append(GdalUtils.ogrLayerName(inLayer)) arguments.append(ogrLayer) arguments.append(out) return ['gdal_rasterize', GdalUtils.escapeAndJoin(arguments)]
def processAlgorithm(self, parameters, context, feedback): inLayerA = self.parameterAsVectorLayer(parameters, self.INPUT_LAYER_A, context) ogrLayerA = GdalUtils.ogrConnectionStringFromLayer(inLayerA) layernameA = GdalUtils.ogrLayerName( inLayerA.dataProvider().dataSourceUri()) inLayerB = self.parameterAsVectorLayer(parameters, self.INPUT_LAYER_B, context) ogrLayerB = GdalUtils.ogrConnectionStringFromLayer(inLayerB) layernameB = GdalUtils.ogrLayerName( inLayerB.dataProvider().dataSourceUri()) fieldA = self.parameterAsString(parameters, self.FIELD_A, context) fieldB = self.parameterAsString(parameters, self.FIELD_B, context) uri = QgsDataSourceUri(inLayerA.source()) geomColumnA = uri.geometryColumn() uri = QgsDataSourceUri(inLayerB.source()) geomColumnB = uri.geometryColumn() sridA = inLayerA.crs().postgisSrid() fields = self.parameterAsFields(parameters, self.FIELDS, context) multi = self.parameterAsBool(parameters, self.MULTI, context) schema = self.parameterAsString(parameters, self.SCHEMA, context) table = self.parameterAsString(parameters, self.TABLE, context) options = self.parameterAsString(parameters, self.OPTIONS, context) if len(fields) > 0: fieldstring = ','.join(["g1.{}".format(f) for f in fields]) fieldstring = ", " + fieldstring else: fieldstring = "" if multi: sqlstring = "-sql \"WITH temp_table AS (SELECT ST_Union(" + geomColumnB + ") AS geom FROM " + layernameB + ") SELECT (ST_ClosestPoint(g2.geom, g1." + geomColumnA + "))::geometry(POINT," + str( sridA ) + ") AS geom, ST_Distance(g1." + geomColumnA + ",g2.geom) AS distance, g1." + fieldA + " AS id_from" + fieldstring + " FROM " + layernameA + " AS g1, temp_table AS g2\" -nln " + schema + "." + table + " -lco FID=gid -lco GEOMETRY_NAME=geom -nlt POINT --config PG_USE_COPY YES -a_srs EPSG:" + str( sridA) + "" else: sqlstring = "-sql \"SELECT (ST_ClosestPoint(g2." + geomColumnB + ",g1." + geomColumnA + "))::geometry(Point," + str( sridA ) + ") AS geom, ST_Distance(g1." + geomColumnA + ",g2." + geomColumnB + ") AS distance, g1." + fieldA + " AS id_from" + fieldstring + ", g2." + fieldB + " AS id_to FROM " + layernameA + " AS g1, " + layernameB + " AS g2\" -nln " + schema + "." + table + " -lco FID=gid -lco GEOMETRY_NAME=geom -nlt POINT --config PG_USE_COPY YES" arguments = [] arguments.append('-f') arguments.append('PostgreSQL') arguments.append(ogrLayerA) arguments.append(ogrLayerA) arguments.append(sqlstring) arguments.append('-overwrite') if len(options) > 0: arguments.append(options) commands = ['ogr2ogr', GdalUtils.escapeAndJoin(arguments)] GdalUtils.runGdal(commands, feedback) return {}
def getConsoleCommands(self, parameters, context, feedback): connection = self.getParameterValue(self.DATABASE) uri = uri_from_name(connection) if self.processing: # to get credentials input when needed uri = GeoDB(uri=uri).uri inLayer = self.getParameterValue(self.INPUT_LAYER) ogrLayer = GdalUtils.ogrConnectionString(inLayer, context)[1:-1] shapeEncoding = self.getParameterValue(self.SHAPE_ENCODING) ssrs = self.getParameterValue(self.S_SRS) tsrs = self.getParameterValue(self.T_SRS) asrs = self.getParameterValue(self.A_SRS) schema = self.getParameterValue(self.SCHEMA) table = self.getParameterValue(self.TABLE) pk = self.getParameterValue(self.PK) primary_key = self.getParameterValue(self.PRIMARY_KEY) geocolumn = self.getParameterValue(self.GEOCOLUMN) dim = self.DIMLIST[self.getParameterValue(self.DIM)] simplify = self.getParameterValue(self.SIMPLIFY) segmentize = self.getParameterValue(self.SEGMENTIZE) spat = self.getParameterValue(self.SPAT) if not spat: spat = QgsProcessingUtils.combineLayerExtents([inLayer]) clip = self.getParameterValue(self.CLIP) where = self.getParameterValue(self.WHERE) gt = self.getParameterValue(self.GT) overwrite = self.getParameterValue(self.OVERWRITE) append = self.getParameterValue(self.APPEND) addfields = self.getParameterValue(self.ADDFIELDS) launder = self.getParameterValue(self.LAUNDER) index = self.getParameterValue(self.INDEX) skipfailures = self.getParameterValue(self.SKIPFAILURES) promotetomulti = self.getParameterValue(self.PROMOTETOMULTI) precision = self.getParameterValue(self.PRECISION) options = self.getParameterValue(self.OPTIONS) arguments = [] arguments.append('-progress') arguments.append('--config PG_USE_COPY YES') if shapeEncoding: arguments.append('--config') arguments.append('SHAPE_ENCODING') arguments.append('"' + shapeEncoding + '"') arguments.append('-f') arguments.append('PostgreSQL') arguments.append('PG:"') for token in uri.connectionInfo(self.processing).split(' '): arguments.append(token) arguments.append('active_schema={}'.format(schema or 'public')) arguments.append('"') arguments.append("-lco DIM=" + dim) arguments.append(ogrLayer) arguments.append(GdalUtils.ogrLayerName(inLayer)) if index: arguments.append("-lco SPATIAL_INDEX=OFF") if launder: arguments.append("-lco LAUNDER=NO") if append: arguments.append('-append') if addfields: arguments.append('-addfields') if overwrite: arguments.append('-overwrite') if len(self.GEOMTYPE[self.getParameterValue(self.GTYPE)]) > 0: arguments.append('-nlt') arguments.append(self.GEOMTYPE[self.getParameterValue(self.GTYPE)]) if geocolumn: arguments.append("-lco GEOMETRY_NAME=" + geocolumn) if pk: arguments.append("-lco FID=" + pk) elif primary_key is not None: arguments.append("-lco FID=" + primary_key) if not table: table = GdalUtils.ogrLayerName(inLayer).lower() if schema: table = '{}.{}'.format(schema, table) arguments.append('-nln') arguments.append(table) if ssrs: arguments.append('-s_srs') arguments.append(ssrs) if tsrs: arguments.append('-t_srs') arguments.append(tsrs) if asrs: arguments.append('-a_srs') arguments.append(asrs) if spat: regionCoords = spat.split(',') arguments.append('-spat') arguments.append(regionCoords[0]) arguments.append(regionCoords[2]) arguments.append(regionCoords[1]) arguments.append(regionCoords[3]) if clip: arguments.append('-clipsrc spat_extent') if skipfailures: arguments.append('-skipfailures') if where: arguments.append('-where "' + where + '"') if simplify: arguments.append('-simplify') arguments.append(simplify) if segmentize: arguments.append('-segmentize') arguments.append(segmentize) if gt: arguments.append('-gt') arguments.append(gt) if promotetomulti: arguments.append('-nlt PROMOTE_TO_MULTI') if precision is False: arguments.append('-lco PRECISION=NO') if options: arguments.append(options) commands = [] if isWindows(): commands = ['cmd.exe', '/C ', 'ogr2ogr.exe', GdalUtils.escapeAndJoin(arguments)] else: commands = ['ogr2ogr', GdalUtils.escapeAndJoin(arguments)] return commands
def clipAndExport(self): project = QgsProject.instance() self.exportMessage.emit("入力:"+ project.fileName()) # クリッピング範囲 #clipextent = self.extent.toString().replace(","," ").replace(":"," ") #clipextent = ("{},{},{},{}").format( # self.extent.xMinimum(), # 順番に要注意 # self.extent.xMaximum(), # 順番に要注意 # self.extent.yMinimum(), # 順番に要注意 # self.extent.yMaximum()) # 順番に要注意 self.exportMessage.emit("extent:" + self.extent.toString()) # 1ループ目は上書き appendSwitch = "" # レイヤリスト保存 ソースがPostgreSQLの場合はここでx # ソースレイヤのパスが./となっているとErrInvalidLayerになる layers = project.mapLayers() # DBのエクスポートと接続情報書き換えで2倍 cnt = project.count() total = 100 / (cnt * 2) # LayerID:LayerName layerId = {} self.exportMessage.emit("Clipping開始") # Clip用形状を作成する uri = "polygon?crs={}&field=id:integer".format("EPSG:4612"); cliplayer = QgsVectorLayer(uri, "clippolygon", "memory"); fields = cliplayer.fields() feature = QgsFeature(fields) feature.setGeometry(QgsGeometry.fromRect(self.extent)) cliplayer.startEditing() feature['id'] = 1 ret = cliplayer.addFeature(feature) cliplayer.commitChanges() # GeoPackageに出力(デバッグ用) #save_options = QgsVectorFileWriter.SaveVectorOptions() #save_options.actionOnExistingFile = QgsVectorFileWriter.CreateOrOverwriteFile #save_options.fileEncoding = "UTF-8" #save_options.layerName = cliplayer.name() #transform_context = QgsProject.instance().transformContext() #error = QgsVectorFileWriter.writeAsVectorFormatV2(cliplayer, # "c:\\DMP\\overlay.gpkg", # transform_context, # save_options) index = 0 for layer in layers.values(): if layer.type() == QgsMapLayerType.VectorLayer: self.exportMessage.emit("name:" + layer.name()) self.exportMessage.emit("source:" + layer.source()) self.exportMessage.emit("id:" + layer.id()) layername = GdalUtils.ogrLayerName(layer.dataProvider().dataSourceUri()) if not layername: self.exportMessage.emit("未サポートのデータソース:" + layer.name()) break #layerId[layer.id()] = layername # PostGIS->GPKGの場合 gdal:clipvectorbyextent でogr2orすると # [schema].[tablename]->[tablename]とschema名無のテーブル名になるため layerId[layer.id()] = layer.name() outputlayer = QgsProcessingOutputLayerDefinition(self.gpkgPath) #'OPTIONS': -a_srsをつけるとエラーになる option = ("{}".format(appendSwitch)) params = { 'INPUT' : layer, #'EXTENT' : clipextent, 'EXTENT' : cliplayer, 'OPTIONS': option, 'OUTPUT' : outputlayer } res = processing.run('gdal:clipvectorbyextent', params) if not res: self.exportError.emit("processing failed:" + layer.name()) break ''' dataSource = "" sourceProvider = layer.storageType() if sourceProvider == "GPKG": dataSource = layer.source().replace("|layername=", " ") elif sourceProvider.find("PostGIS"): result = layer.source().split() self.exportMessage.emit(result) connection = {} for token in result: token2 = token.split("=") if len(token2) == 2: connection[token2[0]] = token2[1] dbName = connection.get("dbname") hostName = connection.get("host") portNo = connection.get("port") usrName = connection.get("user") passWord = connection.get("password") tableName = connection.get("table") if passWord == None: passWord = usrName dataSource = ("PG:\"host={} port={} dbname={} user={} password={}\" {}". format(hostName, portNo, dbName, usrName, passWord, tableName)) sourceCrs = layer.sourceCrs() cmd = ("ogr2ogr {} -f \"GPKG\" {} -a_srs \"{}\" -clipsrc {} {}". format(appendSwitch, self.gpkgPath, sourceCrs.authid(), clipextent, dataSource)) #runcmd = subprocess.check_call(cmd) runcmd = subprocess.run(cmd, stdout=subprocess.PIPE, stdin=subprocess.DEVNULL, stderr=subprocess.STDOUT, universal_newlines=True) self.exportMessage.emit (runcmd) ''' appendSwitch = "-append" self.exportProcessed.emit(int(index * total)) index += 1 #プロジェクトファイルをrename newproject = QgsProject.instance() newproject.write(self.qgisProjectpath) self.exportMessage.emit("出力:" + newproject.fileName()) # 指定範囲でエクスポートしたDBを再度読み込みsetDataSourceで参照先DBを変更 self.exportMessage.emit("プロジェクトファイルのデータソース書き換え開始") for layerid in layerId.items(): fullname = self.gpkgPath + "|layername=" + layerid[1] display_name = layerid[1] tagetlayer = newproject.mapLayer(layerid[0]) provider_options = QgsDataProvider.ProviderOptions() # Use project's transform context provider_options.transformContext = newproject.transformContext() self.exportMessage.emit("dataSource :" + fullname) self.exportMessage.emit("baseName :" + display_name) self.exportMessage.emit("RelacelayerID:" + tagetlayer.id()) tagetlayer.setDataSource(fullname, display_name, "ogr", provider_options) # min max Zoom level設定をクリアする if self.minmaxclear: if tagetlayer.hasScaleBasedVisibility(): tagetlayer.setScaleBasedVisibility(False) self.exportProcessed.emit(int(index * total)) index += 1 newproject.write() self.exportMessage.emit("プロジェクトファイルのデータソース書き換え終了") self.exportProcessed.emit(100) self.exportFinished.emit()
def getConsoleCommands(self, parameters, context, feedback): connection = self.getParameterValue(self.DATABASE) uri = uri_from_name(connection) if self.processing: # to get credentials input when needed uri = GeoDB(uri=uri).uri inLayer = self.getParameterValue(self.INPUT_LAYER) ogrLayer = GdalUtils.ogrConnectionString(inLayer, context)[1:-1] shapeEncoding = self.getParameterValue(self.SHAPE_ENCODING) ssrs = self.getParameterValue(self.S_SRS) tsrs = self.getParameterValue(self.T_SRS) asrs = self.getParameterValue(self.A_SRS) schema = self.getParameterValue(self.SCHEMA) table = self.getParameterValue(self.TABLE) pk = self.getParameterValue(self.PK) primary_key = self.getParameterValue(self.PRIMARY_KEY) geocolumn = self.getParameterValue(self.GEOCOLUMN) dim = self.DIMLIST[self.getParameterValue(self.DIM)] simplify = self.getParameterValue(self.SIMPLIFY) segmentize = self.getParameterValue(self.SEGMENTIZE) spat = self.getParameterValue(self.SPAT) if not spat: spat = QgsProcessingUtils.combineLayerExtents([inLayer]) clip = self.getParameterValue(self.CLIP) where = self.getParameterValue(self.WHERE) gt = self.getParameterValue(self.GT) overwrite = self.getParameterValue(self.OVERWRITE) append = self.getParameterValue(self.APPEND) addfields = self.getParameterValue(self.ADDFIELDS) launder = self.getParameterValue(self.LAUNDER) index = self.getParameterValue(self.INDEX) skipfailures = self.getParameterValue(self.SKIPFAILURES) promotetomulti = self.getParameterValue(self.PROMOTETOMULTI) precision = self.getParameterValue(self.PRECISION) options = self.getParameterValue(self.OPTIONS) arguments = [] arguments.append('-progress') arguments.append('--config PG_USE_COPY YES') if shapeEncoding: arguments.append('--config') arguments.append('SHAPE_ENCODING') arguments.append('"' + shapeEncoding + '"') arguments.append('-f') arguments.append('PostgreSQL') arguments.append('PG:"') for token in uri.connectionInfo(self.processing).split(' '): arguments.append(token) arguments.append('active_schema={}'.format(schema or 'public')) arguments.append('"') arguments.append("-lco DIM=" + dim) arguments.append(ogrLayer) arguments.append(GdalUtils.ogrLayerName(inLayer)) if index: arguments.append("-lco SPATIAL_INDEX=OFF") if launder: arguments.append("-lco LAUNDER=NO") if append: arguments.append('-append') if addfields: arguments.append('-addfields') if overwrite: arguments.append('-overwrite') if len(self.GEOMTYPE[self.getParameterValue(self.GTYPE)]) > 0: arguments.append('-nlt') arguments.append(self.GEOMTYPE[self.getParameterValue(self.GTYPE)]) if geocolumn: arguments.append("-lco GEOMETRY_NAME=" + geocolumn) if pk: arguments.append("-lco FID=" + pk) elif primary_key is not None: arguments.append("-lco FID=" + primary_key) if not table: table = GdalUtils.ogrLayerName(inLayer).lower() if schema: table = '{}.{}'.format(schema, table) arguments.append('-nln') arguments.append(table) if ssrs: arguments.append('-s_srs') arguments.append(ssrs) if tsrs: arguments.append('-t_srs') arguments.append(tsrs) if asrs: arguments.append('-a_srs') arguments.append(asrs) if spat: regionCoords = spat.split(',') arguments.append('-spat') arguments.append(regionCoords[0]) arguments.append(regionCoords[2]) arguments.append(regionCoords[1]) arguments.append(regionCoords[3]) if clip: arguments.append('-clipsrc spat_extent') if skipfailures: arguments.append('-skipfailures') if where: arguments.append('-where "' + where + '"') if simplify: arguments.append('-simplify') arguments.append(simplify) if segmentize: arguments.append('-segmentize') arguments.append(segmentize) if gt: arguments.append('-gt') arguments.append(gt) if promotetomulti: arguments.append('-nlt PROMOTE_TO_MULTI') if precision is False: arguments.append('-lco PRECISION=NO') if options: arguments.append(options) commands = [] if isWindows(): commands = [ 'cmd.exe', '/C ', 'ogr2ogr.exe', GdalUtils.escapeAndJoin(arguments) ] else: commands = ['ogr2ogr', GdalUtils.escapeAndJoin(arguments)] return commands