Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
    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)
Ejemplo n.º 4
0
    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)
Ejemplo n.º 5
0
    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())
Ejemplo n.º 6
0
    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())
Ejemplo n.º 7
0
    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())
Ejemplo n.º 8
0
    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())
Ejemplo n.º 9
0
    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())
Ejemplo n.º 10
0
    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())
Ejemplo n.º 11
0
""""
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())
Ejemplo n.º 12
0
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()
Ejemplo n.º 13
0
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
Ejemplo n.º 14
0
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)