From f3dd5150c75311afdf79fd590e66c422df5ece7b Mon Sep 17 00:00:00 2001 From: Matthias Kuhn Date: Sun, 6 Oct 2019 10:55:18 +0200 Subject: [PATCH] [db_manager] Detect CRS in advanced add layer --- .../plugins/db_manager/db_plugins/plugin.py | 9 ++++++++- .../db_plugins/postgis/connector.py | 19 ++++++++++++++++++- .../db_manager/db_plugins/postgis/plugin.py | 3 +++ 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/python/plugins/db_manager/db_plugins/plugin.py b/python/plugins/db_manager/db_plugins/plugin.py index 071cd8b2506..aff34afe651 100644 --- a/python/plugins/db_manager/db_plugins/plugin.py +++ b/python/plugins/db_manager/db_plugins/plugin.py @@ -52,7 +52,8 @@ from qgis.core import ( QgsVectorLayer, QgsRasterLayer, QgsProject, - QgsMessageLog + QgsMessageLog, + QgsCoordinateReferenceSystem ) from qgis.gui import ( @@ -745,6 +746,11 @@ class Table(DbItemObject): uri.setDataSource(schema, self.name, geomCol if geomCol else None, None, uniqueCol.name if uniqueCol else "") return uri + def crs(self): + """Returns the CRS of this table or an invalid CRS if this is not a spatial table + This should be overwritten by any additional db plugins""" + return QgsCoordinateReferenceSystem() + def mimeUri(self): layerType = "raster" if self.type == Table.RasterType else "vector" return u"%s:%s:%s:%s" % (layerType, self.database().dbplugin().providerName(), self.name, self.uri().uri(False)) @@ -1144,6 +1150,7 @@ class VectorTable(Table): layout.addRow(zCheckBox) layout.addRow(mCheckBox) crsSelector = QgsProjectionSelectionWidget() + crsSelector.setCrs(self.crs()) layout.addRow(self.tr('CRS'), crsSelector) def selectedGeometryType(): diff --git a/python/plugins/db_manager/db_plugins/postgis/connector.py b/python/plugins/db_manager/db_plugins/postgis/connector.py index e88af5b9bf0..4bf83b4c83c 100644 --- a/python/plugins/db_manager/db_plugins/postgis/connector.py +++ b/python/plugins/db_manager/db_plugins/postgis/connector.py @@ -27,7 +27,7 @@ from builtins import range from functools import cmp_to_key from qgis.PyQt.QtCore import QRegExp, QFile, QCoreApplication -from qgis.core import Qgis, QgsCredentials, QgsDataSourceUri +from qgis.core import Qgis, QgsCredentials, QgsDataSourceUri, QgsCoordinateReferenceSystem from ..connector import DBConnector from ..plugin import ConnectionError, DbError, Table @@ -642,6 +642,23 @@ class PostGisDBConnector(DBConnector): self._close_cursor(c) return res[0] if res is not None else None + def getCrs(self, srid): + if not self.has_spatial: + return QgsCoordinateReferenceSystem() + + try: + c = self._execute(None, "SELECT proj4text FROM spatial_ref_sys WHERE srid = '%d'" % srid) + except DbError: + return QgsCoordinateReferenceSystem() + res = self._fetchone(c) + self._close_cursor(c) + if res is None: + return QgsCoordinateReferenceSystem() + + proj4text = res[0] + crs = QgsCoordinateReferenceSystem.fromProj4(proj4text) + return crs + def getSpatialRefInfo(self, srid): if not self.has_spatial: return diff --git a/python/plugins/db_manager/db_plugins/postgis/plugin.py b/python/plugins/db_manager/db_plugins/postgis/plugin.py index 0a1bc85492b..26471120db6 100644 --- a/python/plugins/db_manager/db_plugins/postgis/plugin.py +++ b/python/plugins/db_manager/db_plugins/postgis/plugin.py @@ -269,6 +269,9 @@ class PGTable(Table): return PGTableInfo(self) + def crs(self): + return self.database().connector.getCrs(self.srid) + def tableDataModel(self, parent): from .data_model import PGTableDataModel