def test_ExpressionFieldEllipsoidLengthCalculation(self): #create a temporary layer temp_layer = QgsVectorLayer("LineString?crs=epsg:3111&field=pk:int", "vl", "memory") self.assertTrue(temp_layer.isValid()) f1 = QgsFeature(temp_layer.dataProvider().fields(), 1) f1.setAttribute("pk", 1) f1.setGeometry(QgsGeometry.fromPolyline([QgsPoint(2484588, 2425722), QgsPoint(2482767, 2398853)])) temp_layer.dataProvider().addFeatures([f1]) # set project CRS and ellipsoid srs = QgsCoordinateReferenceSystem(3111, QgsCoordinateReferenceSystem.EpsgCrsId) QgsProject.instance().writeEntry("SpatialRefSys", "/ProjectCRSProj4String", srs.toProj4()) QgsProject.instance().writeEntry("SpatialRefSys", "/ProjectCRSID", srs.srsid()) QgsProject.instance().writeEntry("SpatialRefSys", "/ProjectCrs", srs.authid()) QgsProject.instance().writeEntry("Measure", "/Ellipsoid", "WGS84") QgsProject.instance().writeEntry("Measurement", "/DistanceUnits", QgsUnitTypes.encodeUnit(QGis.Meters)) idx = temp_layer.addExpressionField('$length', QgsField('length', QVariant.Double)) # NOQA # check value f = temp_layer.getFeatures().next() expected = 26932.156 self.assertAlmostEqual(f['length'], expected, 3) # change project length unit, check calculation respects unit QgsProject.instance().writeEntry("Measurement", "/DistanceUnits", QgsUnitTypes.encodeUnit(QGis.Feet)) f = temp_layer.getFeatures().next() expected = 88360.0918635 self.assertAlmostEqual(f['length'], expected, 3)
def test_ExpressionFieldEllipsoidLengthCalculation(self): #create a temporary layer temp_layer = QgsVectorLayer("LineString?crs=epsg:3111&field=pk:int", "vl", "memory") self.assertTrue(temp_layer.isValid()) f1 = QgsFeature(temp_layer.dataProvider().fields(), 1) f1.setAttribute("pk", 1) f1.setGeometry(QgsGeometry.fromPolyline([QgsPoint(2484588, 2425722), QgsPoint(2482767, 2398853)])) temp_layer.dataProvider().addFeatures([f1]) # set project CRS and ellipsoid srs = QgsCoordinateReferenceSystem(3111, QgsCoordinateReferenceSystem.EpsgCrsId) QgsProject.instance().writeEntry("SpatialRefSys", "/ProjectCRSProj4String", srs.toProj4()) QgsProject.instance().writeEntry("SpatialRefSys", "/ProjectCRSID", srs.srsid()) QgsProject.instance().writeEntry("SpatialRefSys", "/ProjectCrs", srs.authid()) QgsProject.instance().writeEntry("Measure", "/Ellipsoid", "WGS84") QgsProject.instance().writeEntry("Measurement", "/DistanceUnits", QgsUnitTypes.encodeUnit(QGis.Meters)) idx = temp_layer.addExpressionField('$length', QgsField('length', QVariant.Double)) # NOQA # check value f = next(temp_layer.getFeatures()) expected = 26932.156 self.assertAlmostEqual(f['length'], expected, 3) # change project length unit, check calculation respects unit QgsProject.instance().writeEntry("Measurement", "/DistanceUnits", QgsUnitTypes.encodeUnit(QGis.Feet)) f = next(temp_layer.getFeatures()) expected = 88360.0918635 self.assertAlmostEqual(f['length'], expected, 3)
def test_ExpressionFieldEllipsoidAreaCalculation(self): #create a temporary layer temp_layer = QgsVectorLayer("Polygon?crs=epsg:3111&field=pk:int", "vl", "memory") self.assertTrue(temp_layer.isValid()) f1 = QgsFeature(temp_layer.dataProvider().fields(), 1) f1.setAttribute("pk", 1) f1.setGeometry(QgsGeometry.fromPolygon([[QgsPoint(2484588, 2425722), QgsPoint(2482767, 2398853), QgsPoint(2520109, 2397715), QgsPoint(2520792, 2425494), QgsPoint(2484588, 2425722)]])) temp_layer.dataProvider().addFeatures([f1]) # set project CRS and ellipsoid srs = QgsCoordinateReferenceSystem(3111, QgsCoordinateReferenceSystem.EpsgCrsId) QgsProject.instance().writeEntry("SpatialRefSys", "/ProjectCRSProj4String", srs.toProj4()) QgsProject.instance().writeEntry("SpatialRefSys", "/ProjectCRSID", srs.srsid()) QgsProject.instance().writeEntry("SpatialRefSys", "/ProjectCrs", srs.authid()) QgsProject.instance().writeEntry("Measure", "/Ellipsoid", "WGS84") QgsProject.instance().writeEntry("Measurement", "/AreaUnits", QgsUnitTypes.encodeUnit(QgsUnitTypes.SquareMeters)) idx = temp_layer.addExpressionField('$area', QgsField('area', QVariant.Double)) # NOQA # check value f = temp_layer.getFeatures().next() expected = 1009089817.0 self.assertAlmostEqual(f['area'], expected, delta=1.0) # change project area unit, check calculation respects unit QgsProject.instance().writeEntry("Measurement", "/AreaUnits", QgsUnitTypes.encodeUnit(QgsUnitTypes.SquareMiles)) f = temp_layer.getFeatures().next() expected = 389.6117565069 self.assertAlmostEqual(f['area'], expected, 3)
def test_ExpressionFieldEllipsoidAreaCalculation(self): #create a temporary layer temp_layer = QgsVectorLayer("Polygon?crs=epsg:3111&field=pk:int", "vl", "memory") self.assertTrue(temp_layer.isValid()) f1 = QgsFeature(temp_layer.dataProvider().fields(), 1) f1.setAttribute("pk", 1) f1.setGeometry(QgsGeometry.fromPolygon([[QgsPoint(2484588, 2425722), QgsPoint(2482767, 2398853), QgsPoint(2520109, 2397715), QgsPoint(2520792, 2425494), QgsPoint(2484588, 2425722)]])) temp_layer.dataProvider().addFeatures([f1]) # set project CRS and ellipsoid srs = QgsCoordinateReferenceSystem(3111, QgsCoordinateReferenceSystem.EpsgCrsId) QgsProject.instance().writeEntry("SpatialRefSys", "/ProjectCRSProj4String", srs.toProj4()) QgsProject.instance().writeEntry("SpatialRefSys", "/ProjectCRSID", srs.srsid()) QgsProject.instance().writeEntry("SpatialRefSys", "/ProjectCrs", srs.authid()) QgsProject.instance().writeEntry("Measure", "/Ellipsoid", "WGS84") QgsProject.instance().writeEntry("Measurement", "/AreaUnits", QgsUnitTypes.encodeUnit(QgsUnitTypes.SquareMeters)) idx = temp_layer.addExpressionField('$area', QgsField('area', QVariant.Double)) # NOQA # check value f = next(temp_layer.getFeatures()) expected = 1009089817.0 self.assertAlmostEqual(f['area'], expected, delta=1.0) # change project area unit, check calculation respects unit QgsProject.instance().writeEntry("Measurement", "/AreaUnits", QgsUnitTypes.encodeUnit(QgsUnitTypes.SquareMiles)) f = next(temp_layer.getFeatures()) expected = 389.6117565069 self.assertAlmostEqual(f['area'], expected, 3)
def testCrs(self): # test setting/getting the source CRS da = QgsDistanceArea() # try setting using a CRS object crs = QgsCoordinateReferenceSystem(3111, QgsCoordinateReferenceSystem.EpsgCrsId) da.setSourceCrs(crs) self.assertEqual(da.sourceCrs().srsid(), crs.srsid())
def selectProjection(self): dialog = QgsGenericProjectionSelector(self.widget) current_crs = QgsCoordinateReferenceSystem(self.combo.currentText()) if current_crs.isValid(): dialog.setSelectedCrsId(current_crs.srsid()) if dialog.exec_(): self.setValue(dialog.selectedAuthId())
def selectProjection(self): dialog = QgsGenericProjectionSelector(self.widget) current_crs = QgsCoordinateReferenceSystem(self.combo.currentText()) if current_crs.isValid(): dialog.setSelectedCrsId(current_crs.srsid()) if dialog.exec_(): self.setValue(dialog.selectedAuthId())
def testCrs(self): # test setting/getting the source CRS da = QgsDistanceArea() # try setting using a CRS object crs = QgsCoordinateReferenceSystem(3111, QgsCoordinateReferenceSystem.EpsgCrsId) da.setSourceCrs(crs, QgsProject.instance().transformContext()) self.assertEqual(da.sourceCrs().srsid(), crs.srsid())
def testCrs(self): # test setting/getting the source CRS da = QgsDistanceArea() # try setting using a crs id da.setSourceCrs(3452) self.assertEqual(da.sourceCrsId(), 3452) # try setting using a CRS object crs = QgsCoordinateReferenceSystem(3111, QgsCoordinateReferenceSystem.EpsgCrsId) da.setSourceCrs(crs) self.assertEqual(da.sourceCrsId(), crs.srsid())
def crsChange(self): projectionDlg = QgsGenericProjectionSelector(self) projectionDlg.exec_() # print projectionDlg.selectedCrsId() srs = QgsCoordinateReferenceSystem(projectionDlg.selectedCrsId(), QgsCoordinateReferenceSystem.InternalCrsId) self.mCRS = srs.srsid() self.crs = QgsCoordinateReferenceSystem() self.crs.createFromId(self.mCRS, QgsCoordinateReferenceSystem.InternalCrsId ) # authId = projectionDlg.selectedAuthId() # crsId = projectionDlg.selectedCrsId() # if authId != "": # if authId[:4] != "EPSG": # self.crs = QgsCoordinateReferenceSystem(crsId, QgsCoordinateReferenceSystem.InternalCrsId) # else: # self.crs = QgsCoordinateReferenceSystem(crsId, QgsCoordinateReferenceSystem.EpsgCrsId) self.ui.cmbCrs.setCurrentIndex(2) self.ui.txtCrs.setText(self.crs.description())
"""" https://docs.qgis.org/2.18/en/docs/pyqgis_developer_cookbook/crs.html """ from qgis.core import QgsCoordinateReferenceSystem from osgeo import osr if __name__ == '__console__': print("-----------------------------------------------\n\n") # PostGIS SRID 4326 is allocated for WGS84 # If not specified otherwise in second parameter, PostGIS SRID is used by default. crs = QgsCoordinateReferenceSystem(4326, QgsCoordinateReferenceSystem.PostgisCrsId) print("Valid: ", crs.isValid()) print("QGIS CRS ID:", crs.srsid()) print("EPSG ID:", crs.authid()) print("Description:", crs.description()) print("Projection Acronym:", crs.projectionAcronym()) print("Ellipsoid Acronym:", crs.ellipsoidAcronym()) print("Proj4 String:", crs.toProj4()) # check whether it's geographic or projected coordinate system print("Is geographic:", crs.geographicFlag()) # check type of map units in this CRS (values defined in QGis::units enum) print("Map units:", crs.mapUnits()) print("-----------------------------------------------\n\n") wkt = '''GEOGCS["WGS84", DATUM["WGS84", SPHEROID["WGS84", 6378137.0, 298.257223563]], PRIMEM["Greenwich", 0.0], UNIT["degree", 0.017453292519943295], AXIS["Longitude", EAST], AXIS["Latitude", NORTH]]''' crs = QgsCoordinateReferenceSystem(wkt) print("Valid: ", crs.isValid())
class QGISRedLayerManagementDialog(QDialog, FORM_CLASS): # Common variables iface = None NetworkName = "" ProjectDirectory = "" def __init__(self, parent=None): """Constructor.""" super(QGISRedLayerManagementDialog, self).__init__(parent) self.setupUi(self) self.btAccept.clicked.connect(self.accept) self.btSelectCRS.clicked.connect(self.selectCRS) self.btPipes.clicked.connect(lambda: self.createElement("Pipes")) self.btJunctions.clicked.connect( lambda: self.createElement("Junctions")) self.btTanks.clicked.connect(lambda: self.createElement("Tanks")) self.btReservoirs.clicked.connect( lambda: self.createElement("Reservoirs")) self.btValves.clicked.connect(lambda: self.createElement("Valves")) self.btPumps.clicked.connect(lambda: self.createElement("Pumps")) self.btDemands.clicked.connect( lambda: self.createElement("Demands", True)) self.btSources.clicked.connect( lambda: self.createElement("Sources", True)) self.btIsolatedValves.clicked.connect( lambda: self.createElement("IsolationValves", True)) self.btHydrants.clicked.connect( lambda: self.createElement("Hydrants", True)) self.btPurgeValves.clicked.connect( lambda: self.createElement("WashoutValves", True)) self.btAirReleases.clicked.connect( lambda: self.createElement("AirReleaseValves", True)) self.btConnections.clicked.connect( lambda: self.createElement("ServiceConnections", True)) self.btMeters.clicked.connect( lambda: self.createElement("Meters", True)) def config(self, ifac, direct, netw, parent): self.iface = ifac self.parent = parent utils = QGISRedUtils(direct, netw, ifac) self.crs = utils.getProjectCrs() self.originalCrs = self.crs self.tbCRS.setText(self.crs.description()) self.NetworkName = netw self.ProjectDirectory = direct self.setProperties() def setProperties(self): dirList = os.listdir(self.ProjectDirectory) # Visibilities self.btPipes.setVisible(not self.NetworkName + "_Pipes.shp" in dirList) self.btJunctions.setVisible(not self.NetworkName + "_Junctions.shp" in dirList) self.btTanks.setVisible(not self.NetworkName + "_Tanks.shp" in dirList) self.btReservoirs.setVisible(not self.NetworkName + "_Reservoirs.shp" in dirList) self.btValves.setVisible(not self.NetworkName + "_Valves.shp" in dirList) self.btPumps.setVisible(not self.NetworkName + "_Pumps.shp" in dirList) self.btDemands.setVisible(not self.NetworkName + "_Demands.shp" in dirList) self.btSources.setVisible(not self.NetworkName + "_Sources.shp" in dirList) self.btIsolatedValves.setVisible(not self.NetworkName + "_IsolationValves.shp" in dirList) self.btHydrants.setVisible(not self.NetworkName + "_Hydrants.shp" in dirList) self.btPurgeValves.setVisible(not self.NetworkName + "_WashoutValves.shp" in dirList) self.btAirReleases.setVisible(not self.NetworkName + "_AirReleaseValves.shp" in dirList) self.btConnections.setVisible(not self.NetworkName + "_ServiceConnections.shp" in dirList) self.btMeters.setVisible(not self.NetworkName + "_Meters.shp" in dirList) # Enables self.cbDemands.setEnabled(self.NetworkName + "_Demands.shp" in dirList) self.cbSources.setEnabled(self.NetworkName + "_Sources.shp" in dirList) self.cbIsolatedValves.setEnabled(self.NetworkName + "_IsolationValves.shp" in dirList) self.cbHydrants.setEnabled(self.NetworkName + "_Hydrants.shp" in dirList) self.cbPurgeValves.setEnabled(self.NetworkName + "_WashoutValves.shp" in dirList) self.cbAirReleases.setEnabled(self.NetworkName + "_AirReleaseValves.shp" in dirList) self.cbConnections.setEnabled(self.NetworkName + "_ServiceConnections.shp" in dirList) self.cbMeters.setEnabled(self.NetworkName + "_Meters.shp" in dirList) # Los básicos: Enables and checked utils = QGISRedUtils(self.ProjectDirectory, self.NetworkName, self.iface) hasLayer = utils.isLayerOpened("Pipes") self.cbPipes.setChecked(hasLayer) self.cbPipes.setEnabled(self.NetworkName + "_Pipes.shp" in dirList and not hasLayer) hasLayer = utils.isLayerOpened("Junctions") self.cbJunctions.setChecked(hasLayer) self.cbJunctions.setEnabled( self.NetworkName + "_Junctions.shp" in dirList and not hasLayer) hasLayer = utils.isLayerOpened("Tanks") self.cbTanks.setChecked(hasLayer) self.cbTanks.setEnabled(self.NetworkName + "_Tanks.shp" in dirList and not hasLayer) hasLayer = utils.isLayerOpened("Reservoirs") self.cbReservoirs.setChecked(hasLayer) self.cbReservoirs.setEnabled( self.NetworkName + "_Reservoirs.shp" in dirList and not hasLayer) hasLayer = utils.isLayerOpened("Valves") self.cbValves.setChecked(hasLayer) self.cbValves.setEnabled(self.NetworkName + "_Valves.shp" in dirList and not hasLayer) hasLayer = utils.isLayerOpened("Pumps") self.cbPumps.setChecked(hasLayer) self.cbPumps.setEnabled(self.NetworkName + "_Pumps.shp" in dirList and not hasLayer) # Checked self.cbDemands.setChecked(utils.isLayerOpened("Demands")) self.cbSources.setChecked(utils.isLayerOpened("Sources")) self.cbIsolatedValves.setChecked( utils.isLayerOpened("IsolationValves")) self.cbHydrants.setChecked(utils.isLayerOpened("Hydrants")) self.cbPurgeValves.setChecked(utils.isLayerOpened("WashoutValves")) self.cbAirReleases.setChecked(utils.isLayerOpened("AirReleaseValves")) self.cbConnections.setChecked( utils.isLayerOpened("ServiceConnections")) self.cbMeters.setChecked(utils.isLayerOpened("Meters")) def selectCRS(self): projSelector = QgsGenericProjectionSelector() if projSelector.exec_(): crsId = projSelector.crs().srsid() if not crsId == 0: self.crs = QgsCoordinateReferenceSystem() self.crs.createFromId( crsId, QgsCoordinateReferenceSystem.InternalCrsId) self.tbCRS.setText(self.crs.description()) def getLayerPath(self, layer): return QGISRedUtils().getLayerPath(layer) def generatePath(self, folder, fileName): return QGISRedUtils().generatePath(folder, fileName) def getLayers(self): return QGISRedUtils().getLayers() def isInLegend(self, layerName): openedLayers = self.getLayers() for layer in openedLayers: layerPath = self.generatePath( self.ProjectDirectory, self.NetworkName + "_" + layerName + ".shp") if self.getLayerPath(layer) == layerPath: return True return False def createElementsList(self): if self.cbPipes.isChecked(): self.layers.append("Pipes") if self.cbJunctions.isChecked(): self.layers.append("Junctions") if self.cbTanks.isChecked(): self.layers.append("Tanks") if self.cbReservoirs.isChecked(): self.layers.append("Reservoirs") if self.cbValves.isChecked(): self.layers.append("Valves") if self.cbPumps.isChecked(): self.layers.append("Pumps") def createComplementaryList(self): if self.cbDemands.isChecked(): self.layers.append("Demands") if self.cbSources.isChecked(): self.layers.append("Sources") if self.cbIsolatedValves.isChecked(): self.layers.append("Isolation Valves") if self.cbHydrants.isChecked(): self.layers.append("Hydrants") if self.cbPurgeValves.isChecked(): self.layers.append("Washout Valves") if self.cbAirReleases.isChecked(): self.layers.append("AirRelease Valves") if self.cbConnections.isChecked(): self.layers.append("Service Connections") if self.cbMeters.isChecked(): self.layers.append("Meters") def createElement(self, layerName, complementary=False): layer = "" if complementary else layerName complLayer = layerName if complementary else "" # Process QApplication.setOverrideCursor(Qt.WaitCursor) resMessage = GISRed.CreateLayer(self.ProjectDirectory, self.NetworkName, layer, complLayer) QApplication.restoreOverrideCursor() if resMessage == "True": self.parent.openElementLayer(layerName) elif resMessage == "False": self.iface.messageBar().pushMessage( "Warning", "Some issues occurred in the process", level=1, duration=5) else: self.iface.messageBar().pushMessage("Error", resMessage, level=2, duration=5) self.close() def accept(self): self.layers = [] self.createElementsList() self.createComplementaryList() epsg = None if not self.crs.srsid() == self.originalCrs.srsid(): epsg = self.crs.authid().replace("EPSG:", "") self.parent.openRemoveSpecificLayers(self.layers, epsg) self.close()
def get_qgis_crs_transform(sourceCrs, destSrc, CRS_FIX_IDX=0, isSave=False, toLL=False): """ @info: function for fix stored in incorrect projection data. fix_id must be present in PDS projection comment like 'fix_id:1:SomeText' Save for Well(LL) not WORK!!!! only for mapsets Warning!!!!. On save data first you must convert projection to _qgis_ elipsoid(Pulkovo/WGS...) For example to 'layer crs'->PulkovoGK9N->_qgis_ For create user defined CRS can use: a=QgsCoordinateReferenceSystem() a.createFromSrsId(100005) """ from qgis.core import QgsCoordinateReferenceSystem, QgsCoordinateTransform, QgsMessageLog QgsMessageLog.logMessage(u"CRS_FIX_IDX {0}".format(CRS_FIX_IDX), tag="QgisPDS.debug") #------------------------------------------------ if CRS_FIX_IDX == 0 or CRS_FIX_IDX is None: #--- read XY or source=dest if sourceCrs is None or destSrc is None or sourceCrs == destSrc: return None #--- save XY /save LL elif isSave: if sourceCrs.projectionAcronym() == destSrc.projectionAcronym(): return QgsCoordinateTransform(sourceCrs, destSrc, QgsProject.instance()) else: QgsMessageLog.logMessage( u"Please convert layer to '{}' projection before save". format(destSrc.projectionAcronym()), tag="QgisPDS.error") QgsMessageLog.logMessage( u"Warning!!!!.Need realized check of destSrc ellipsoid and conversion of data to it. For example to 'layer crs'->PulkovoGK9N->_qgis_", tag="QgisPDS.error") raise Exception( u"Please convert layer to '{}' projection before save". format(destSrc.projectionAcronym())) #--- read LL else: return QgsCoordinateTransform(sourceCrs, destSrc, QgsProject.instance()) #------------------------------------------------ elif CRS_FIX_IDX == 1: #SHIR. lat/lon entered in Pulkovo_GKZone9N as WGS84_Zone9N and converrted to WGS84. Need convert WGS84->WGS84_Zone9N and read as Pulkovo_GKZone9N X without 9 #--- read XY if sourceCrs is None or destSrc is None: return None #---read LL elif not isSave and sourceCrs.srsid() == QgsCoordinateReferenceSystem( QgisProjectionConfig.get_default_latlon_prj_epsg()).srsid(): QgsMessageLog.logMessage(u"source->dest crs {0}: {1}".format( sourceCrs.srsid(), destSrc.srsid()), tag="QgisPDS.debug") sourceCrs = QgsCoordinateReferenceSystem(WGS84) destSrc = QgsCoordinateReferenceSystem(WGS84_UTM_ZONE9N) QgsMessageLog.logMessage( u"changed to source->dest crs {0}: {1}".format( sourceCrs.srsid(), destSrc.srsid()), tag="QgisPDS.debug") return QgsCoordinateTransform(sourceCrs, destSrc, QgsProject.instance()) #---no need conversion elif sourceCrs == destSrc: return None #---save LL elif isSave and toLL: raise "Not realized yet" # destSrc.srsid()==QgsCoordinateReferenceSystem(QgisProjectionConfig.get_default_latlon_prj_epsg()).srsid(): QgsMessageLog.logMessage(u"source->dest crs {0}: {1}".format( sourceCrs.srsid(), destSrc.srsid()), tag="QgisPDS.debug") sourceCrs = QgsCoordinateReferenceSystem(WGS84_UTM_ZONE9N) destSrc = QgsCoordinateReferenceSystem(WGS84) QgsMessageLog.logMessage( u"Save:\nchanged to source->dest crs {0}: {1}".format( sourceCrs.srsid(), destSrc.srsid()), tag="QgisPDS.debug") return QgsCoordinateTransform(sourceCrs, destSrc, QgsProject.instance()) #---save mapset. Need convert to Pulkovo9N and then save as PDS projection!!!!!! elif isSave and not toLL: # destSrc.srsid()==QgsCoordinateReferenceSystem(QgisProjectionConfig.get_default_latlon_prj_epsg()).srsid(): #sourceCrs=QgsCoordinateReferenceSystem(WGS84_UTM_ZONE9N) sourceCrs_1 = sourceCrs destSrc_1 = QgsCoordinateReferenceSystem(PULKOVO_GK_ZONE9N) sourceCrs_2 = QgsCoordinateReferenceSystem(PULKOVO_GK_ZONE9N) destSrc_2 = destSrc class fake_transform(): def __init__(self): QgsMessageLog.logMessage( u"source->dest crs {0}: {1}".format( sourceCrs_1.srsid(), destSrc_2.srsid()), tag="QgisPDS.debug") self.trans1 = QgsCoordinateTransform( sourceCrs_1, destSrc_1, QgsProject.instance()) QgsMessageLog.logMessage( u"Save:\nchanged to source->dest crs {0}: {1}".format( sourceCrs_1.srsid(), destSrc_1.srsid()), tag="QgisPDS.debug") self.trans2 = QgsCoordinateTransform( sourceCrs_2, destSrc_2, QgsProject.instance()) QgsMessageLog.logMessage( u"Save:\nchanged to source->dest crs {0}: {1}".format( sourceCrs_2.srsid(), destSrc_2.srsid()), tag="QgisPDS.debug") pass def transform(self, geom): return self.trans2.transform(self.trans1.transform(geom)) #QgsMessageLog.logMessage(u"Save:\nchanged to source->dest crs {0}: {1}".format(sourceCrs.srsid(),destSrc.srsid()), tag="QgisPDS.debug") return fake_transform() #------------------------------------------------ elif CRS_FIX_IDX == 2: #BIN #---read XY if not isSave and sourceCrs is None: QgsMessageLog.logMessage(u"source->dest crs {0}: {1}".format( None, destSrc.srsid()), tag="QgisPDS.debug") sourceCrs = QgsCoordinateReferenceSystem(WGS84_UTM_ZONE9N) destSrc = destSrc QgsMessageLog.logMessage( u"changed to source->dest crs {0}: {1}".format( sourceCrs.srsid(), destSrc.srsid()), tag="QgisPDS.debug") return QgsCoordinateTransform(sourceCrs, destSrc, QgsProject.instance()) #---save mapset elif isSave and not toLL: QgsMessageLog.logMessage( u"Save:\nsource->dest crs {0}: {1}".format( sourceCrs.srsid(), destSrc.srsid()), tag="QgisPDS.debug") sourceCrs = sourceCrs destSrc = QgsCoordinateReferenceSystem(WGS84_UTM_ZONE9N) QgsMessageLog.logMessage( u"changed to source->dest crs {0}: {1}".format( sourceCrs.srsid(), destSrc.srsid()), tag="QgisPDS.debug") return QgsCoordinateTransform(sourceCrs, destSrc, QgsProject.instance()) #---save LL elif isSave and toLL: raise "Not realized yet" sourceCrs = QgsCoordinateReferenceSystem(WGS84_UTM_ZONE9N) destSrc = QgsCoordinateReferenceSystem(WGS84) QgsMessageLog.logMessage( u"Save:\nchanged to source->dest crs {0}: {1}".format( sourceCrs.srsid(), destSrc.srsid()), tag="QgisPDS.debug") return QgsCoordinateTransform(sourceCrs, destSrc, QgsProject.instance()) #---no need conversion elif sourceCrs == destSrc: return None #---read LL else: return QgsCoordinateTransform(sourceCrs, destSrc, QgsProject.instance()) #------------------------------------------------ elif CRS_FIX_IDX == 3: #KARAS #--- read XY or source=dest if sourceCrs is None or destSrc is None or sourceCrs == destSrc: return None #--- save XY /save LL elif isSave: sourceCrs_1 = sourceCrs destSrc_1 = QgsCoordinateReferenceSystem(PULKOVO_GK_ZONE9N) sourceCrs_2 = QgsCoordinateReferenceSystem(PULKOVO_GK_ZONE9N) destSrc_2 = destSrc class fake_transform(): def __init__(self): QgsMessageLog.logMessage( u"source->dest crs {0}: {1}".format( sourceCrs_1.srsid(), destSrc_2.srsid()), tag="QgisPDS.debug") self.trans1 = QgsCoordinateTransform( sourceCrs_1, destSrc_1, QgsProject.instance()) QgsMessageLog.logMessage( u"Save:\nchanged to source->dest crs {0}: {1}".format( sourceCrs_1.srsid(), destSrc_1.srsid()), tag="QgisPDS.debug") self.trans2 = QgsCoordinateTransform( sourceCrs_2, destSrc_2, QgsProject.instance()) QgsMessageLog.logMessage( u"Save:\nchanged to source->dest crs {0}: {1}".format( sourceCrs_2.srsid(), destSrc_2.srsid()), tag="QgisPDS.debug") pass def transform(self, geom): return self.trans2.transform(self.trans1.transform(geom)) return fake_transform() #--- read LL else: return QgsCoordinateTransform(sourceCrs, destSrc, QgsProject.instance()) else: return None
def qgsadapt(projectTemplate, qkanDB, epsg, projectFile, setPathToTemplateDir=True, dbtyp=u'SpatiaLite'): '''Lädt eine (Vorlage-) Projektdatei (*.qgs) und adaptiert diese auf eine QKan-Datenbank an. Anschließend wird dieses Projekt geladen. Voraussetzungen: keine :projectTemplate: Vorlage-Projektdatei :type database: String :qkanDB: Ziel-Datenbank, auf die die Projektdatei angepasst werden soll :type qkanDB: String :projectFile: Zu Erzeugende Projektdatei :type projectFile: String :setPathToTemplateDir: Option, ob das Suchverzeichnis auf das Template-Verzeichnis gesetzt werden soll. :type setPathToTemplateDir: Boolean :dbtyp: Typ der Datenbank (SpatiaLite, PostGIS) :type dbtyp: String :returns: void ''' # ------------------------------------------------------------------------------ # Datenbankverbindungen dbQK = DBConnection( dbname=qkanDB, epsg=epsg) # Datenbankobjekt der QKan-Datenbank zum Schreiben if dbQK is None: fehlermeldung( u"Fehler in qgsadapt", u'QKan-Datenbank {:s} wurde nicht gefunden!\nAbbruch!'.format( qkanDB)) iface.messageBar().pushMessage(u"Fehler in qgsadapt", u'QKan-Datenbank {:s} wurde nicht gefunden!\nAbbruch!'.format( \ qkanDB), level=QgsMessageBar.CRITICAL) return None # -------------------------------------------------------------------------- # Zoom-Bereich für die Projektdatei vorbereiten sql = u'''SELECT min(xsch) AS xmin, max(xsch) AS xmax, min(ysch) AS ymin, max(ysch) AS ymax FROM schaechte''' try: dbQK.sql(sql) except BaseException as e: fehlermeldung('SQL-Fehler', str(e)) fehlermeldung("Fehler in qgsadapt", u"\nFehler in sql_zoom: \n" + sql + '\n\n') daten = dbQK.fetchone() try: zoomxmin, zoomxmax, zoomymin, zoomymax = daten except BaseException as e: fehlermeldung('SQL-Fehler', str(e)) fehlermeldung("Fehler in qgsadapt", u"\nFehler in sql_zoom; daten= " + str(daten) + '\n') # -------------------------------------------------------------------------- # Projektionssystem für die Projektdatei vorbereiten sql = """SELECT srid FROM geom_cols_ref_sys WHERE Lower(f_table_name) = Lower('schaechte') AND Lower(f_geometry_column) = Lower('geom')""" if not dbQK.sql(sql, 'importkanaldaten_dyna (37)'): return None srid = dbQK.fetchone()[0] try: crs = QgsCoordinateReferenceSystem( srid, QgsCoordinateReferenceSystem.EpsgCrsId) srsid = crs.srsid() proj4text = crs.toProj4() description = crs.description() projectionacronym = crs.projectionAcronym() if 'ellipsoidacronym' in dir(crs): ellipsoidacronym = crs.ellipsoidacronym() else: ellipsoidacronym = None except BaseException as e: srid, srsid, proj4text, description, projectionacronym, ellipsoidacronym = \ 'dummy', 'dummy', 'dummy', 'dummy', 'dummy', 'dummy' fehlermeldung('\nFehler in "daten"', str(e)) fehlermeldung("Fehler in qgsadapt", u"\nFehler bei der Ermittlung der srid: \n" + str(daten)) # -------------------------------------------------------------------------- # Datenbankverbindungen schliessen del dbQK # -------------------------------------------------------------------------- # Projektdatei schreiben, falls ausgewählt if projectFile is None or projectFile == u'': fehlermeldung(u'Bedienerfehler!', u'Es wurde keine Projektdatei ausgewählt') return False if setPathToTemplateDir: templatepath = os.path.join(pluginDirectory('qkan'), u"database/templates") projectpath = os.path.dirname(projectFile) if os.path.dirname(qkanDB) == projectpath: datasource = qkanDB.replace(os.path.dirname(qkanDB), u'.') else: datasource = qkanDB # Liste der Geotabellen aus QKan, um andere Tabellen von der Bearbeitung auszuschliessen # Liste steht in 3 Modulen: tools.k_tools, importdyna.import_from_dyna, importhe.import_from_he tabliste = [ u'einleit', u'einzugsgebiete', u'flaechen', u'haltungen', u'linkfl', u'linksw', u'pumpen', u'schaechte', u'teilgebiete', u'tezg', u'wehre' ] # Liste der QKan-Formulare, um individuell erstellte Formulare von der Bearbeitung auszuschliessen formsliste = [ 'qkan_abflussparameter.ui', 'qkan_anbindungageb.ui', 'qkan_anbindungeinleit.ui', 'qkan_anbindungflaechen.ui', 'qkan_auslaesse.ui', 'qkan_auslasstypen.ui', 'qkan_aussengebiete.ui', 'qkan_bodenklassen.ui', 'qkan_einleit.ui', 'qkan_einzugsgebiete.ui', 'qkan_entwaesserungsarten.ui', 'qkan_flaechen.ui', 'qkan_haltungen.ui', 'qkan_profildaten.ui', 'qkan_profile.ui', 'qkan_pumpen.ui', 'qkan_pumpentypen.ui', 'qkan_schaechte.ui', 'qkan_simulationsstatus.ui', 'qkan_speicher.ui', 'qkan_speicherkennlinien.ui', 'qkan_swref.ui', 'qkan_teilgebiete.ui', 'qkan_tezg.ui', 'qkan_wehre.ui' ] # Lesen der Projektdatei ------------------------------------------------------------------ qgsxml = ET.parse(projectTemplate) root = qgsxml.getroot() # Projektionssystem anpassen -------------------------------------------------------------- for tag_maplayer in root.findall(u".//projectlayers/maplayer"): tag_datasource = tag_maplayer.find(u"./datasource") tex = tag_datasource.text # Nur QKan-Tabellen bearbeiten if tex[tex.index(u'table="') + 7:].split(u'" ')[0] in tabliste: # <extend> löschen for tag_extent in tag_maplayer.findall(u"./extent"): tag_maplayer.remove(tag_extent) for tag_spatialrefsys in tag_maplayer.findall( u"./srs/spatialrefsys"): tag_spatialrefsys.clear() elem = ET.SubElement(tag_spatialrefsys, u'proj4') elem.text = proj4text elem = ET.SubElement(tag_spatialrefsys, u'srsid') elem.text = u'{}'.format(srsid) elem = ET.SubElement(tag_spatialrefsys, u'srid') elem.text = u'{}'.format(srid) elem = ET.SubElement(tag_spatialrefsys, u'authid') elem.text = u'EPSG: {}'.format(srid) elem = ET.SubElement(tag_spatialrefsys, u'description') elem.text = description elem = ET.SubElement(tag_spatialrefsys, u'projectionacronym') elem.text = projectionacronym if ellipsoidacronym is not None: elem = ET.SubElement(tag_spatialrefsys, u'ellipsoidacronym') elem.text = ellipsoidacronym # Pfad zu Formularen auf plugin-Verzeichnis setzen ----------------------------------------- formspath = os.path.join(pluginDirectory('qkan'), u"forms") for tag_maplayer in root.findall(u".//projectlayers/maplayer"): tag_editform = tag_maplayer.find(u"./editform") dateiname = os.path.basename(tag_editform.text) if dateiname in formsliste: # Nur QKan-Tabellen bearbeiten tag_editform.text = os.path.join(formspath, dateiname) # Zoom für Kartenfenster einstellen ------------------------------------------------------- for tag_extent in root.findall(u".//mapcanvas/extent"): elem = tag_extent.find(u"./xmin") elem.text = u'{:.3f}'.format(zoomxmin) elem = tag_extent.find(u"./ymin") elem.text = u'{:.3f}'.format(zoomymin) elem = tag_extent.find(u"./xmax") elem.text = u'{:.3f}'.format(zoomxmax) elem = tag_extent.find(u"./ymax") elem.text = u'{:.3f}'.format(zoomymax) # Projektionssystem anpassen -------------------------------------------------------------- for tag_spatialrefsys in root.findall( u".//mapcanvas/destinationsrs/spatialrefsys"): tag_spatialrefsys.clear() elem = ET.SubElement(tag_spatialrefsys, u'proj4') elem.text = proj4text elem = ET.SubElement(tag_spatialrefsys, u'srid') elem.text = u'{}'.format(srid) elem = ET.SubElement(tag_spatialrefsys, u'authid') elem.text = u'EPSG: {}'.format(srid) elem = ET.SubElement(tag_spatialrefsys, u'description') elem.text = description elem = ET.SubElement(tag_spatialrefsys, u'projectionacronym') elem.text = projectionacronym if ellipsoidacronym is not None: elem = ET.SubElement(tag_spatialrefsys, u'ellipsoidacronym') elem.text = ellipsoidacronym # Pfad zur QKan-Datenbank anpassen for tag_datasource in root.findall( u".//projectlayers/maplayer/datasource"): text = tag_datasource.text tag_datasource.text = u"dbname='" + datasource + u"' " + text[ text.find(u'table='):] qgsxml.write(projectFile) # writing modified project file logger.debug(u'Projektdatei: {}'.format(projectFile)) # logger.debug(u'encoded string: {}'.format(tex)) # ------------------------------------------------------------------------------ # Abschluss: Ggfs. Protokoll schreiben und Datenbankverbindungen schliessen iface.mainWindow().statusBar().clearMessage() iface.messageBar().pushMessage( "Information", "Projektdatei ist angepasst und muss neu geladen werden!", level=QgsMessageBar.INFO)