mirror of
https://github.com/qgis/QGIS.git
synced 2025-10-08 00:05:09 -04:00
Cleanup Execute SQL geometry type handling
And fix exception when "no geometry" type is selected Fixes #54833
This commit is contained in:
parent
7b93febd79
commit
33bb769b91
@ -19,7 +19,8 @@ __author__ = 'Hugo Mercier'
|
|||||||
__date__ = 'January 2016'
|
__date__ = 'January 2016'
|
||||||
__copyright__ = '(C) 2016, Hugo Mercier'
|
__copyright__ = '(C) 2016, Hugo Mercier'
|
||||||
|
|
||||||
from qgis.core import (QgsVirtualLayerDefinition,
|
from qgis.core import (Qgis,
|
||||||
|
QgsVirtualLayerDefinition,
|
||||||
QgsVectorLayer,
|
QgsVectorLayer,
|
||||||
QgsWkbTypes,
|
QgsWkbTypes,
|
||||||
QgsProcessingAlgorithm,
|
QgsProcessingAlgorithm,
|
||||||
@ -76,6 +77,16 @@ class ExecuteSQL(QgisAlgorithm):
|
|||||||
def __init__(self):
|
def __init__(self):
|
||||||
super().__init__()
|
super().__init__()
|
||||||
|
|
||||||
|
self.geometry_types = [
|
||||||
|
(None, self.tr('Autodetect')),
|
||||||
|
(Qgis.WkbType.NoGeometry, self.tr('No geometry')),
|
||||||
|
(Qgis.WkbType.Point, self.tr('Point')),
|
||||||
|
(Qgis.WkbType.LineString, self.tr('LineString')),
|
||||||
|
(Qgis.WkbType.Polygon, self.tr('Polygon')),
|
||||||
|
(Qgis.WkbType.MultiPoint, self.tr('MultiPoint')),
|
||||||
|
(Qgis.WkbType.MultiLineString, self.tr('MultiLineString')),
|
||||||
|
(Qgis.WkbType.MultiPolygon, self.tr('MultiPolygon'))]
|
||||||
|
|
||||||
def flags(self):
|
def flags(self):
|
||||||
return super().flags() | QgsProcessingAlgorithm.FlagNoThreading
|
return super().flags() | QgsProcessingAlgorithm.FlagNoThreading
|
||||||
|
|
||||||
@ -92,17 +103,10 @@ class ExecuteSQL(QgisAlgorithm):
|
|||||||
self.addParameter(QgsProcessingParameterString(name=self.INPUT_GEOMETRY_FIELD,
|
self.addParameter(QgsProcessingParameterString(name=self.INPUT_GEOMETRY_FIELD,
|
||||||
description=self.tr('Geometry field'), optional=True))
|
description=self.tr('Geometry field'), optional=True))
|
||||||
|
|
||||||
self.geometryTypes = [
|
|
||||||
self.tr('Autodetect'),
|
|
||||||
self.tr('No geometry'),
|
|
||||||
'Point',
|
|
||||||
'LineString',
|
|
||||||
'Polygon',
|
|
||||||
'MultiPoint',
|
|
||||||
'MultiLineString',
|
|
||||||
'MultiPolygon']
|
|
||||||
self.addParameter(QgsProcessingParameterEnum(self.INPUT_GEOMETRY_TYPE,
|
self.addParameter(QgsProcessingParameterEnum(self.INPUT_GEOMETRY_TYPE,
|
||||||
self.tr('Geometry type'), options=self.geometryTypes, defaultValue=0))
|
self.tr('Geometry type'),
|
||||||
|
options=[t[1] for t in self.geometry_types],
|
||||||
|
defaultValue=0))
|
||||||
|
|
||||||
self.addParameter(QgsProcessingParameterCrs(self.INPUT_GEOMETRY_CRS,
|
self.addParameter(QgsProcessingParameterCrs(self.INPUT_GEOMETRY_CRS,
|
||||||
self.tr('CRS'), optional=True))
|
self.tr('CRS'), optional=True))
|
||||||
@ -120,7 +124,9 @@ class ExecuteSQL(QgisAlgorithm):
|
|||||||
query = self.parameterAsString(parameters, self.INPUT_QUERY, context)
|
query = self.parameterAsString(parameters, self.INPUT_QUERY, context)
|
||||||
uid_field = self.parameterAsString(parameters, self.INPUT_UID_FIELD, context)
|
uid_field = self.parameterAsString(parameters, self.INPUT_UID_FIELD, context)
|
||||||
geometry_field = self.parameterAsString(parameters, self.INPUT_GEOMETRY_FIELD, context)
|
geometry_field = self.parameterAsString(parameters, self.INPUT_GEOMETRY_FIELD, context)
|
||||||
geometry_type = self.parameterAsEnum(parameters, self.INPUT_GEOMETRY_TYPE, context)
|
geometry_type = self.geometry_types[
|
||||||
|
self.parameterAsEnum(parameters, self.INPUT_GEOMETRY_TYPE, context)
|
||||||
|
][0]
|
||||||
geometry_crs = self.parameterAsCrs(parameters, self.INPUT_GEOMETRY_CRS, context)
|
geometry_crs = self.parameterAsCrs(parameters, self.INPUT_GEOMETRY_CRS, context)
|
||||||
|
|
||||||
df = QgsVirtualLayerDefinition()
|
df = QgsVirtualLayerDefinition()
|
||||||
@ -150,13 +156,13 @@ class ExecuteSQL(QgisAlgorithm):
|
|||||||
if uid_field:
|
if uid_field:
|
||||||
df.setUid(uid_field)
|
df.setUid(uid_field)
|
||||||
|
|
||||||
if geometry_type == 1: # no geometry
|
if geometry_type == Qgis.WkbType.NoGeometry:
|
||||||
df.setGeometryWkbType(QgsWkbTypes.NoGeometry)
|
df.setGeometryWkbType(Qgis.WkbType.NoGeometry)
|
||||||
else:
|
else:
|
||||||
if geometry_field:
|
if geometry_field:
|
||||||
df.setGeometryField(geometry_field)
|
df.setGeometryField(geometry_field)
|
||||||
if geometry_type > 1:
|
if geometry_type is not None:
|
||||||
df.setGeometryWkbType(geometry_type - 1)
|
df.setGeometryWkbType(geometry_type)
|
||||||
if geometry_crs.isValid():
|
if geometry_crs.isValid():
|
||||||
df.setGeometrySrid(geometry_crs.postgisSrid())
|
df.setGeometrySrid(geometry_crs.postgisSrid())
|
||||||
|
|
||||||
@ -167,8 +173,12 @@ class ExecuteSQL(QgisAlgorithm):
|
|||||||
if vLayer.wkbType() == QgsWkbTypes.Unknown:
|
if vLayer.wkbType() == QgsWkbTypes.Unknown:
|
||||||
raise QgsProcessingException(self.tr("Cannot find geometry field"))
|
raise QgsProcessingException(self.tr("Cannot find geometry field"))
|
||||||
|
|
||||||
(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
|
(sink, dest_id) = self.parameterAsSink(parameters,
|
||||||
vLayer.fields(), vLayer.wkbType() if geometry_type != 1 else 1, vLayer.crs())
|
self.OUTPUT,
|
||||||
|
context,
|
||||||
|
vLayer.fields(),
|
||||||
|
vLayer.wkbType(),
|
||||||
|
vLayer.crs())
|
||||||
if sink is None:
|
if sink is None:
|
||||||
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))
|
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user