123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 |
- """
- ***************************************************************************
- DbmsAlgorithm.py
- ---------------------
- Date : August 2012
- Copyright : (C) 2012 by Victor Olaya
- Email : volayaf at gmail dot com
- ***************************************************************************
- * *
- * This program is free software; you can redistribute it and/or modify *
- * it under the terms of the GNU General Public License as published by *
- * the Free Software Foundation; either version 2 of the License, or *
- * (at your option) any later version. *
- * *
- ***************************************************************************
- """
- __author__ = 'Victor Olaya'
- __date__ = 'August 2012'
- __copyright__ = '(C) 2012, Victor Olaya'
- import os
- import re
- import numpy as np
- from qgis.PyQt.QtCore import QUrl, QCoreApplication
- from qgis.core import (QgsApplication,
- QgsProject,
- QgsVectorFileWriter,
- QgsProcessingFeatureSourceDefinition,
- QgsProcessingAlgorithm,
- QgsProcessingContext,
- QgsProcessingFeedback,
- QgsProviderRegistry,
- QgsDataSourceUri)
- from processing.algs.gdal.DbmsAlgorithmDialog import DbmsAlgorithmDialog
- from processing.algs.gdal.GdalUtils import GdalUtils
- from processing.tools.PostgreSQL.PostgreSQL import PostgreSQL
- from processing.tools.GeoServer.Geoserver import Geoserver
- from processing.tools.GeoServer.GeoService import GeoService
- from processing.tools.QGS.QgsProjectUtils import QgsProjectUtils
- from processing.tools.PrintUtils import getLastPrint
- from processing.tools.FileListPrintUtils import getFileListPrint
- from processing.tools.SubprocessUtils import RunSubprocess
- pluginPath = os.path.normpath(os.path.join(
- os.path.split(os.path.dirname(__file__))[0], os.pardir))
- class DbmsAlgorithm(QgsProcessingAlgorithm):
- def __init__(self):
- super().__init__()
- self.output_values = {}
- def icon(self):
- return QgsApplication.getThemeIcon("/providerGdal.svg")
- def tags(self):
- return ['ogr', 'gdal', self.commandName()]
- def svgIconPath(self):
- return QgsApplication.iconPath("providerGdal.svg")
- def createInstance(self, config={}):
- return self.__class__()
- def createCustomParametersWidget(self, parent):
- return DbmsAlgorithmDialog(self, parent=parent)
- def getConsoleCommands(self, parameters, context, feedback, executing=True):
- return None
- 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 = f"WFS:{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 setOutputValue(self, name, value):
- self.output_values[name] = value
- def processAlgorithm(self, parameters, context, feedback):
- # TODO wanger GeoServer服务发布
- if parameters.get("Publish_Service") is not None:
- zymlbsm = getLastPrint()
- if zymlbsm == None or zymlbsm == '':
- return {
- "Error": "资源目录未选择!"
- }
- print("zymlbsm====" + zymlbsm)
- layer_group_join = ""
- if parameters.get("LAYER_GROUP_JOIN") is not None:
- layer_group_join = self.groups[parameters.get("LAYER_GROUP_JOIN")]
- commands = self.getConsoleCommands(parameters, context, feedback, executing=True)
- geoSer = GeoService()
- result = geoSer.publishGeoService(parameters, context, feedback, commands, zymlbsm, layer_group_join)
- return result
- # === 获取gdal命令参数执行并输出log开始 ===
- commands = self.getConsoleCommands(parameters, context, feedback, executing=True)
- # if np.isin("raster2pgsql.exe", commands) or np.isin("raster2pgsql", commands):
- # RunSubprocess(command=' '.join(commands))
- # else:
- # GdalUtils.runGdal(commands, feedback)
- GdalUtils.runGdal(commands, feedback)
- print(commands)
- results = {}
- for o in self.outputDefinitions():
- if o.name() in parameters:
- results[o.name()] = parameters[o.name()]
- for k, v in self.output_values.items():
- results[k] = v
- # === 获取gdal命令参数执行并输出log结束 ===
- # TODO wanger 元数据入库
- if parameters.get("Metadata_storage") is not None and parameters.get("Metadata_storage") == True:
- # 所属行政区划
- ssxzqh = getLastPrint()
- print("ssxzqh====" + ssxzqh)
- # 获取附件列表
- fileliststr = getFileListPrint()
- pgconn = PostgreSQL(schema='base')
- pgconn.metadataStorage(parameters, ssxzqh, fileliststr, self.ywlxs[parameters.get("VECTOR_YWLX")],
- self.depts[parameters.get("VECTOR_GLBM")])
- pgconn.close()
- return results
- def commandName(self):
- parameters = {
- param.name(): "1"
- for param in self.parameterDefinitions()
- }
- context = QgsProcessingContext()
- feedback = QgsProcessingFeedback()
- name = self.getConsoleCommands(parameters, context, feedback, executing=False)[0]
- if name.endswith(".py"):
- name = name[:-3]
- return name
- def tr(self, string, context=''):
- if context == '':
- context = self.__class__.__name__
- return QCoreApplication.translate(context, string)
|