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.FIELDS_A, context) uri = QgsDataSourceUri(inLayerA.source()) geomColumnA = uri.geometryColumn() uri = QgsDataSourceUri(inLayerB.source()) geomColumnB = uri.geometryColumn() 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: fieldstring = ', '.join(["g1.{}".format(f) for f in fieldsA]) fieldstring = ", " + fieldstring else: fieldstring = "" if single: sqlstring = "-sql \"SELECT (ST_Dump(ST_Difference(g1." + geomColumnA + ",ST_Union(g2." + geomColumnB + ")))).geom::geometry(Polygon) AS geom" + fieldstring + " FROM " + layernameA + " AS g1, " + layernameB + " AS g2 GROUP BY g1." + geomColumnA + fieldstring + "\"" " -nln " + schema + "." + table + " -lco FID=gid -nlt POLYGON -lco GEOMETRY_NAME=geom --config PG_USE_COPY YES" else: sqlstring = "-sql \"SELECT (ST_Multi(ST_CollectionExtract(ST_Difference(g1." + geomColumnA + ",ST_Union(g2." + geomColumnB + ")),3)))::geometry(MultiPolygon) AS geom" + fieldstring + " FROM " + layernameA + " AS g1, " + layernameB + " AS g2 GROUP BY g1." + geomColumnA + fieldstring + "\"" " -nln " + schema + "." + table + " -lco FID=gid -nlt MULTIPOLYGON -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 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() 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 multi: sqlstring = "-sql \"WITH temp_table AS (SELECT ST_Union(" + geomColumnB + ") AS geom FROM " + layernameB + ") SELECT ST_ShortestLine(g1." + geomColumnA + ",g2.geom) AS geom, ST_Distance(g1." + geomColumnA + ",g2.geom) AS distance, g1." + fieldA + " AS id_from FROM " + layernameA + " AS g1, temp_table AS g2\" -nln " + schema + "." + table + " -lco FID=gid -lco GEOMETRY_NAME=geom -nlt LINESTRING --config PG_USE_COPY YES -a_srs EPSG:" + str( sridA) + "" else: sqlstring = "-sql \"SELECT ST_ShortestLine(g1." + geomColumnA + ",g2." + geomColumnB + ") AS geom, ST_Distance(g1." + geomColumnA + ",g2." + geomColumnB + ") AS distance, g1." + fieldA + " AS id_from, g2." + fieldB + " AS id_to FROM " + layernameA + " AS g1, " + layernameB + " AS g2\" -nln " + schema + "." + table + " -lco FID=gid -lco GEOMETRY_NAME=geom -nlt LINESTRING --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 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(), QgsVectorFileWriter.supportedFormatExtensions()[0], 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) \ or input_layer.subsetString(): # 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()) elif input_layer.dataProvider().name().lower() == 'wfs': uri = QgsDataSourceUri(input_layer.source()) baseUrl = uri.param('url').split('?')[0] ogr_data_path = "WFS:{}".format(baseUrl) ogr_layer_name = uri.param('typename') 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 processAlgorithm(self, parameters, context, feedback): inLayerA = self.parameterAsVectorLayer(parameters, self.INPUT_LAYER_A, context) ogrLayerA = GdalUtils.ogrConnectionStringFromLayer(inLayerA) layernameA = GdalUtils.ogrLayerName( inLayerA.dataProvider().dataSourceUri()) fieldA = self.parameterAsString(parameters, self.FIELD_A, context) dsUriA = QgsDataSourceUri(inLayerA.source()) geomColumnA = dsUriA.geometryColumn() schema = self.parameterAsString(parameters, self.SCHEMA, context) table = self.parameterAsString(parameters, self.TABLE, context) options = self.parameterAsString(parameters, self.OPTIONS, context) sqlstring = "-sql \"SELECT ST_Makeline(g1." + geomColumnA + ",g2." + geomColumnA + ") AS geom, ST_Distance(g1." + geomColumnA + ",g2." + geomColumnA + ") AS distance, g1." + fieldA + " AS id_from, g2." + fieldA + " AS id_to FROM " + layernameA + " AS g1, " + layernameA + " AS g2 WHERE g1." + fieldA + " > " + "g2." + fieldA + "\" -nln " + schema + "." + table + " -lco FID=gid -lco GEOMETRY_NAME=geom -nlt LINESTRING --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): context = dataobjects.createContext() inLayer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT), context) inRasterLayer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT_RASTER), context) ogrLayer = GdalUtils.ogrConnectionStringFromLayer(inLayer) ogrRasterLayer = GdalUtils.ogrConnectionStringFromLayer(inRasterLayer) 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 [self.commandName(), GdalUtils.escapeAndJoin(arguments)]
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 = self.parameterAsString(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 not 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 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 processAlgorithm(self, parameters, context, feedback): inLayer = self.parameterAsVectorLayer(parameters, self.INPUT_LAYER, context) ogrLayer = GdalUtils.ogrConnectionStringFromLayer(inLayer) layername = GdalUtils.ogrLayerName( inLayer.dataProvider().dataSourceUri()) fields = self.parameterAsFields(parameters, self.FIELDS, context) uri = QgsDataSourceUri(inLayer.source()) geomColumn = uri.geometryColumn() wkbType = inLayer.wkbType() srid = inLayer.crs().postgisSrid() 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(fields) else: fieldstring = "" if wkbType == QgsWkbTypes.Polygon: layertype = "POLYGON" sqlstring = "-sql \"SELECT (ST_Dump(ST_MakeValid(g1." + geomColumn + "))).geom::geometry(" + layertype + "," + str( srid ) + ") AS geom" + fieldstring + " FROM " + layername + " AS g1\" -nlt " + layertype + " -nln " + schema + "." + table + " -lco FID=gid -lco GEOMETRY_NAME=geom --config PG_USE_COPY YES" else: layertype = "MULTIPOLYGON" sqlstring = "-sql \"SELECT (ST_MakeValid(g1." + geomColumn + "))::geometry(" + layertype + "," + str( srid ) + ") AS geom" + fieldstring + " FROM " + layername + " AS g1\" -nlt " + layertype + " -nln " + schema + "." + table + " -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(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): arguments = ['-al'] if self.parameterAsBoolean(parameters, self.SUMMARY_ONLY, context): arguments.append('-so') if self.parameterAsBoolean(parameters, self.NO_METADATA, context): arguments.append('-nomd') inLayer = self.parameterAsVectorLayer(parameters, self.INPUT, context) if inLayer is None: raise QgsProcessingException(self.invalidSourceError(parameters, self.INPUT)) connectionString = GdalUtils.ogrConnectionStringFromLayer(inLayer) arguments.append(connectionString) return [self.commandName(), GdalUtils.escapeAndJoin(arguments)]
def getConsoleCommands(self, parameters, context, feedback, executing=True): arguments = ['-al'] if self.parameterAsBool(parameters, self.SUMMARY_ONLY, context): arguments.append('-so') if self.parameterAsBool(parameters, self.NO_METADATA, context): arguments.append('-nomd') inLayer = self.parameterAsVectorLayer(parameters, self.INPUT, context) if inLayer is None: raise QgsProcessingException(self.invalidSourceError(parameters, self.INPUT)) connectionString = GdalUtils.ogrConnectionStringFromLayer(inLayer) arguments.append(connectionString) return [self.commandName(), GdalUtils.escapeAndJoin(arguments)]
def processAlgorithm(self, parameters, context, feedback): input_layers = self.parameterAsLayerList(parameters, self.INPUT, context) unioned = self.parameterAsBoolean(parameters, self.UNIONED, context) vrtPath = self.parameterAsOutputLayer(parameters, self.OUTPUT, context) vrt = '<OGRVRTDataSource>' if unioned: vrt += '<OGRVRTUnionLayer name="UnionedLayer">' total = 100.0 / len(input_layers) if input_layers else 0 for current, layer in enumerate(input_layers): if feedback.isCanceled(): break basePath = GdalUtils.ogrConnectionStringFromLayer(layer) layerName = GdalUtils.ogrLayerName(layer.source()) vrt += '<OGRVRTLayer name="{}">'.format( html.escape(layerName, True)) vrt += '<SrcDataSource>{}</SrcDataSource>'.format( html.escape(basePath, True)) vrt += '<SrcLayer>{}</SrcLayer>'.format( html.escape(layerName, True)) vrt += '</OGRVRTLayer>' feedback.setProgress(int(current * total)) if unioned: vrt += '</OGRVRTUnionLayer>' vrt += '</OGRVRTDataSource>' with open(vrtPath, 'w', encoding='utf-8') as f: f.write(vrt) return {self.OUTPUT: vrtPath, self.VRT_STRING: vrt}
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 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 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: 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_Intersects(g2." + geomColumnB + ",g1." + geomColumnA + ") is true AND ST_Touches(g1." + geomColumnA + ",g2." + geomColumnB + ") is false\" -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_Intersects(g2." + geomColumnB + ",g1." + geomColumnA + ") is true AND ST_Touches(g2." + geomColumnB + ",g1." + geomColumnA + ") is false\" -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 processAlgorithm(self, parameters, context, feedback): inLayerA = self.parameterAsVectorLayer(parameters, self.INPUT_LAYER, context) ogrLayerA = GdalUtils.ogrConnectionStringFromLayer(inLayerA) layernameA = GdalUtils.ogrLayerName( inLayerA.dataProvider().dataSourceUri()) uri = QgsDataSourceUri(inLayerA.source()) geomColumn = uri.geometryColumn() srid = inLayerA.crs().postgisSrid() field = self.parameterAsString(parameters, self.FIELD, context) statsatt = self.parameterAsString(parameters, self.STATSATT, context) stats = self.parameterAsBool(parameters, self.STATS, context) area = self.parameterAsBool(parameters, self.AREA, context) single = self.parameterAsBool(parameters, self.SINGLE, context) count = self.parameterAsBool(parameters, self.COUNT, context) dissolveall = self.parameterAsBool(parameters, self.DISSOLVEALL, context) schema = self.parameterAsString(parameters, self.SCHEMA, context) table = self.parameterAsString(parameters, self.TABLE, context) options = self.parameterAsString(parameters, self.OPTIONS, context) if single: layertype = "POLYGON" else: layertype = "MULTIPOLYGON" if dissolveall: fieldstring = "" else: fieldstring = "," + field if single: layertype = "POLYGON" else: layertype = "MULTIPOLYGON" if dissolveall: fieldstring = "" else: fieldstring = "," + field if single: querystart = '-sql "SELECT (ST_Dump(ST_Union(' + geomColumn + '))).geom::geometry(POLYGON,' + str( srid) + ')' + fieldstring else: querystart = '-sql "SELECT (ST_Multi(ST_Union(' + geomColumn + ')))::geometry(MULTIPOLYGON,' + str( srid) + ')' + fieldstring if dissolveall: queryend = ' FROM ' + layernameA + '"' + " -nln " + schema + "." + table + " -nlt " + layertype + " -lco FID=gid -lco GEOMETRY_NAME=geom --config PG_USE_COPY YES" else: queryend = ' FROM ' + layernameA + ' GROUP BY ' + field + '"' + " -nln " + schema + "." + table + " -nlt " + layertype + " -lco FID=gid -lco GEOMETRY_NAME=geom --config PG_USE_COPY YES" if count: querycount = ", COUNT(" + geomColumn + ") AS count" else: querycount = "" if stats: querystats = ", SUM(" + statsatt + ") AS sum_dissolved, MIN(" + statsatt + ") AS min_dissolved, MAX(" + statsatt + ") AS max_dissolved, AVG(" + statsatt + ") AS avg_dissolved" else: querystats = "" if area: queryarea = ", SUM(ST_area(" + geomColumn + ")) AS area_dissolved, ST_perimeter(ST_union(" + geomColumn + ")) AS perimeter_dissolved" else: queryarea = "" query = querystart + querystats + queryarea + querycount + queryend arguments = [] arguments.append('-f') arguments.append('PostgreSQL') arguments.append(ogrLayerA) arguments.append(ogrLayerA) 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, 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