mirror of
https://github.com/qgis/QGIS.git
synced 2025-10-07 00:15:48 -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'
|
||||
__copyright__ = '(C) 2016, Hugo Mercier'
|
||||
|
||||
from qgis.core import (QgsVirtualLayerDefinition,
|
||||
from qgis.core import (Qgis,
|
||||
QgsVirtualLayerDefinition,
|
||||
QgsVectorLayer,
|
||||
QgsWkbTypes,
|
||||
QgsProcessingAlgorithm,
|
||||
@ -76,6 +77,16 @@ class ExecuteSQL(QgisAlgorithm):
|
||||
def __init__(self):
|
||||
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):
|
||||
return super().flags() | QgsProcessingAlgorithm.FlagNoThreading
|
||||
|
||||
@ -92,17 +103,10 @@ class ExecuteSQL(QgisAlgorithm):
|
||||
self.addParameter(QgsProcessingParameterString(name=self.INPUT_GEOMETRY_FIELD,
|
||||
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.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.tr('CRS'), optional=True))
|
||||
@ -120,7 +124,9 @@ class ExecuteSQL(QgisAlgorithm):
|
||||
query = self.parameterAsString(parameters, self.INPUT_QUERY, context)
|
||||
uid_field = self.parameterAsString(parameters, self.INPUT_UID_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)
|
||||
|
||||
df = QgsVirtualLayerDefinition()
|
||||
@ -150,13 +156,13 @@ class ExecuteSQL(QgisAlgorithm):
|
||||
if uid_field:
|
||||
df.setUid(uid_field)
|
||||
|
||||
if geometry_type == 1: # no geometry
|
||||
df.setGeometryWkbType(QgsWkbTypes.NoGeometry)
|
||||
if geometry_type == Qgis.WkbType.NoGeometry:
|
||||
df.setGeometryWkbType(Qgis.WkbType.NoGeometry)
|
||||
else:
|
||||
if geometry_field:
|
||||
df.setGeometryField(geometry_field)
|
||||
if geometry_type > 1:
|
||||
df.setGeometryWkbType(geometry_type - 1)
|
||||
if geometry_type is not None:
|
||||
df.setGeometryWkbType(geometry_type)
|
||||
if geometry_crs.isValid():
|
||||
df.setGeometrySrid(geometry_crs.postgisSrid())
|
||||
|
||||
@ -167,8 +173,12 @@ class ExecuteSQL(QgisAlgorithm):
|
||||
if vLayer.wkbType() == QgsWkbTypes.Unknown:
|
||||
raise QgsProcessingException(self.tr("Cannot find geometry field"))
|
||||
|
||||
(sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
|
||||
vLayer.fields(), vLayer.wkbType() if geometry_type != 1 else 1, vLayer.crs())
|
||||
(sink, dest_id) = self.parameterAsSink(parameters,
|
||||
self.OUTPUT,
|
||||
context,
|
||||
vLayer.fields(),
|
||||
vLayer.wkbType(),
|
||||
vLayer.crs())
|
||||
if sink is None:
|
||||
raise QgsProcessingException(self.invalidSinkError(parameters, self.OUTPUT))
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user