def set_crs(self, s):
     """Figure out the CRS for layer creation, from the selected options and/or string"""
     if self.dlg.CRSFromProject.isChecked():
         self.crs_source = 'from project'
         self.crs = QgsProject.instance().crs()
     elif self.dlg.CRSFromFile.isChecked() and s:
         self.crs_source = 'from .3d file'
         self.crs = QgsCoordinateReferenceSystem()
         match = search('epsg:([0-9]*)', s)  # check for epsg in proj string
         if match:  # if found, use the EPSG number explicitly
             self.crs.createFromString('EPSG:{}'.format(int(
                 match.group(1))))
         else:  # fall back to proj4
             self.crs.createFromProj4(s)
     else:  # fall back to raising a CRS selection dialog
         self.crs_source = 'from dialog'
         dialog = QgsProjectionSelectionDialog()
         dialog.setMessage('define the CRS for the imported layers')
         dialog.exec()  # run the dialog ..
         self.crs = dialog.crs()  # .. and recover the user input
     if self.crs.isValid():
         msg = 'CRS {} : {}'.format(self.crs_source, self.crs.authid())
         QgsMessageLog.logMessage(msg, tag='Import .3d', level=Qgis.Info)
         QgsMessageLog.logMessage(self.crs.description(),
                                  tag='Import .3d',
                                  level=Qgis.Info)
     else:  # hopefully never happens
         msg = "CRS invalid!"
         QgsMessageLog.logMessage(msg, tag='Import .3d', level=Qgis.Info)
         self.crs = None
示例#2
0
文件: settings.py 项目: co-city/qgyf
 def defineCRS(self):
     projSelector = QgsProjectionSelectionDialog()
     projSelector.exec()
     crs_id = projSelector.crs().authid()
     if crs_id:
         crs_id = ''.join(c for c in crs_id if c.isdigit())
         self.proj.writeEntry("QGYF", "CRS", crs_id)
         print(self.proj.readEntry("QGYF", "CRS")[0])
     self.crs.setText(projSelector.crs().description())
示例#3
0
 def select_crs(self):
     """Shows a dialog to select a new CRS for the model"""
     crs_dialog = QgsProjectionSelectionDialog()
     crs_dialog.setShowNoProjection(True)
     if self.dlg.crsLineEdit.text() != "None":
         old_crs = QgsCoordinateReferenceSystem("EPSG:{}".format(
             self.dlg.crsLineEdit.text()))
         crs_dialog.setCrs(old_crs)
     crs_dialog.exec()
     if crs_dialog.crs().postgisSrid() == 0:
         self.dlg.crsLineEdit.setText("None")
     else:
         self.dlg.crsLineEdit.setText("{}".format(
             crs_dialog.crs().postgisSrid()))
示例#4
0
 def openCrsSelectionDialogForSection(self, section):
     projSelector = QgsProjectionSelectionDialog()
     if (projSelector.exec()):
         if section == CoordinatorDockWidget.SectionInput:
             self.setInputCrs(projSelector.crs())
         elif section == CoordinatorDockWidget.SectionOutput:
             self.setOutputCrs(projSelector.crs())
 def setCrs(self):
     selector = QgsProjectionSelectionDialog(self.iface.mainWindow())
     selector.setCrs(self.crs)
     if selector.exec():
         self.crs = selector.crs()
         self.transform.setDestinationCrs(self.crs)
         if self.crs.mapUnits() == QgsUnitTypes.DistanceDegrees:
             self.userCrsDisplayPrecision = 5
         else:
             self.userCrsDisplayPrecision = 3
示例#6
0
 def crsTriggered(self, action):
     self.crsButton.setDefaultAction(action)
     self.inputProjection = action.data()
     if self.inputProjection == 3:
         selector = QgsProjectionSelectionDialog()
         selector.setCrs(QgsCoordinateReferenceSystem(self.inputCustomCRS))
         if selector.exec():
             self.inputCustomCRS = selector.crs().authid()
         else:
             self.inputCustomCRS = 'EPSG:4326'
     self.saveSettings()
 def crsTriggered(self, action):
     self.crsButton.setDefaultAction(action)
     self.inputProjection = action.data()
     if self.inputProjection == 3:
         selector = QgsProjectionSelectionDialog()
         selector.setCrs(QgsCoordinateReferenceSystem(self.inputCustomCRS))
         if selector.exec():
             self.inputCustomCRS = selector.crs().authid()
         else:
             self.inputCustomCRS = 'EPSG:4326'
     self.saveSettings()
    def selectOtherCrs(self, checked):
        self.l_OtherCrsName.setEnabled(checked)
        self.pb_OtherCrs.setEnabled(checked)

        if checked:
            if self.otherCrsId is None:
                crsSelector = QgsProjectionSelectionDialog()
                crsSelector.setCrs(QgsCoordinateReferenceSystem("EPSG:4326"))
                if crsSelector.exec():
                    self.otherCrsId = crsSelector.crs().srsid()
                    self.featureCrsId = self.otherCrsId
                self.__displayAuthid()
    def reprojectCoords(self):
        self.refreshCoordsMatrix(self.prev_row)

        if self.valueChecker.checkCoordsMatrix(self.coords_matrix):
            srcProj = QgsCoordinateReferenceSystem()
            srcProj.createFromSrsId(self.featureCrsId)

            crsSelectorFrom = QgsProjectionSelectionDialog()
            crsSelectorFrom.setCrs(srcProj)
            crsSelectorFrom.setMessage(
                self.translate_str("Select source coordinates system"))

            if crsSelectorFrom.exec():
                crsSelectorTo = QgsProjectionSelectionDialog()
                crsSelectorTo.setMessage(
                    self.translate_str(
                        "Select destination coordinates system"))

                if crsSelectorTo.exec():
                    rc = ReprojectCoordinates(crsSelectorFrom.crs().srsid(),
                                              crsSelectorTo.crs().srsid(),
                                              self.has_Z, self.has_M)
                    self.coords_matrix = list(
                        rc.reproject(self.coords_matrix, False))

                    self.__part_changing = True
                    self.refreshTable(self.prev_row)
                    self.__part_changing = False

                    self.featureCrsId = crsSelectorTo.crs().srsid()
                    if self.featureCrsId == self.mapCanvas.currentLayer().crs(
                    ).srsid():
                        self.rb_LayerCrs.setChecked(True)
                    elif self.featureCrsId == self.projectCrsId:
                        self.rb_ProjectCrs.setChecked(True)
                    else:
                        self.rb_OtherCrs.blockSignals(True)
                        self.rb_OtherCrs.setChecked(True)
                        self.rb_OtherCrs.blockSignals(False)
                        self.__displayAuthid()
示例#10
0
    def openCrsSelectionDialogForSection(self, section):
        projSelector = QgsProjectionSelectionDialog()
        if (projSelector.exec()):
            selectedCrs = projSelector.crs()

            # workaround for checking if there was no CRS selected
            # but user clicked 'OK': check if authid-string is empty:
            if not selectedCrs.authid():
                return

            if section == CoordinatorDockWidget.SectionInput:
                self.setInputCrs(selectedCrs)
            elif section == CoordinatorDockWidget.SectionOutput:
                self.setOutputCrs(selectedCrs)
 def SelectOtherCrsClicked(self):
     crsSelector = QgsProjectionSelectionDialog()
     if self.otherCrsId is None:
         crsSelector.setCrs(QgsCoordinateReferenceSystem("EPSG:4326"))
     else:
         currentQCRS = QgsCoordinateReferenceSystem()
         if currentQCRS.createFromSrsId(self.otherCrsId):
             crsSelector.setCrs(currentQCRS)
         else:
             crsSelector.setCrs(QgsCoordinateReferenceSystem("EPSG:4326"))
     if crsSelector.exec():
         self.otherCrsId = crsSelector.crs().srsid()
         self.featureCrsId = self.otherCrsId
     self.__displayAuthid()
示例#12
0
class MenuProvider(QgsLayerTreeViewMenuProvider):

    def __init__(self, view, canvas, proj):
        QgsLayerTreeViewMenuProvider.__init__(self)
        self.view = view
        self.canvas = canvas
        self.proj = proj
        self.defActions = QgsLayerTreeViewDefaultActions(self.view)
        self.name = None

    def createContextMenu(self):
        if not self.view.currentLayer():
            return None
        layer = self.view.currentLayer()
        self.connect_signal_name()
        m = QMenu()
        m.addAction("Zoom to Layer", self.zoom_to_layer)
        m.addAction("Rename Layer", self.rename_layer)
        # we only offer the option to save layer if it is a vector layer and has a valid geometry
        if layer.type() == 0 and layer.geometryType() not in [3, 4]:
            m.addAction("Save Layer", self.save_layer)
        m.addAction("Remove Layer", self.remove_layer)
        # properties option only for vector or raster layers that are single band (0 or 1)
        if layer.type() != 1 or layer.rasterType() < 2:
            m.addAction("Properties", self.layer_properties)
        m.addAction("Select CRS", self.layer_crs)
        return m

    def zoom_to_layer(self):
        self.defActions.zoomToLayer(self.canvas)

    def rename_layer(self):
        self.name = self.view.currentLayer().name()
        self.defActions.renameGroupOrLayer()

    def name_changed(self, node, name):
        n = 0
        # check every layer
        for layer in self.proj.mapLayers().values():
            if layer.name() == name:
                n += 1
        # if exists more than one layer with the same name
        if n > 1:
            logger.error("More than one layer was found with this name")
            # set previous name
            self.view.currentLayer().setName(self.name)
            QMessageBox.critical(None,
                                 "Error in renaming",
                                 "More than one layer was found with this name. Please enter another name.",
                                 QMessageBox.Close)
        if name.rfind('/') != -1:
            if self.view.currentLayer().name() == name:
                name = name.replace('/', '')
                self.view.currentLayer().setName(name)
                QMessageBox.warning(None, "Warning", "Usage of '/' is forbidden \n\n You may use '\\' instead")

    def remove_layer(self):
        self.defActions.removeGroupOrLayer()

    def save_layer(self):
        layer = self.view.currentLayer()
        # if it is a vector layer and has a valid geometry
        if layer.type() == 0 and layer.geometryType() not in [3, 4]:
            layer_name, selected_filter = QFileDialog.getSaveFileName(None,
                                                                      'Save Layer',
                                                                      "",
                                                                      'Shapefile (*.shp);;KML (*.kml);;GPX (*.gpx)')
            if layer_name != '':

                if selected_filter == "Shapefile (*.shp)":

                    if not layer_name.endswith('.shp'):
                        layer_name = layer_name + '.shp'
                    ret = QgsVectorFileWriter.writeAsVectorFormat(layer, layer_name, "utf-8",
                                                                  QgsCoordinateReferenceSystem(4326,
                                                                                               QgsCoordinateReferenceSystem.EpsgCrsId),
                                                                  "ESRI Shapefile")
                    if ret == QgsVectorFileWriter.NoError:
                        logger.info(layer.name() + " saved to " + layer_name)
                    # After saving always delete layer and reload from saved file
                    renderer = layer.renderer()
                    file_info = QFileInfo(layer_name)
                    base_name = file_info.baseName()
                    vlayer = QgsVectorLayer(layer_name, base_name, "ogr")
                    if not vlayer.isValid():
                        logger.warning("Layer failed to load!")
                    vlayer.setRenderer(renderer.clone())
                    self.remove_layer()
                    self.proj.addMapLayer(vlayer)

                elif selected_filter == "KML (*.kml)":

                    if not layer_name.endswith('.kml'):
                        layer_name = layer_name + '.kml'
                    file_info = QFileInfo(layer_name)

                    QgsVectorFileWriter.writeAsVectorFormat(layer, layer_name, "utf-8",
                                                            QgsCoordinateReferenceSystem(4326,
                                                                                         QgsCoordinateReferenceSystem.EpsgCrsId),
                                                            "KML")
                elif selected_filter == "GPX (*.gpx)":

                    if not layer_name.endswith('.gpx'):
                        layer_name = layer_name + '.gpx'
                    ds_options = list()
                    ds_options.append("GPX_USE_EXTENSIONS=TRUE")  # Option needed to write gpx correctly
                    QgsVectorFileWriter.writeAsVectorFormat(layer, layer_name, "utf-8",
                                                            QgsCoordinateReferenceSystem(4326,
                                                                                         QgsCoordinateReferenceSystem.EpsgCrsId),
                                                            "GPX",
                                                            datasourceOptions=ds_options)

    def layer_properties(self):
        layer = self.view.currentLayer()
        # if it is a vector layer and has a valid geometry
        if layer.type() == 0 and layer.geometryType() not in [3, 4]:
            # wrap style dialog with the buttons ok and cancel so that we can apply changes
            dlg = QDialog()
            dlg.widget = QgsRendererPropertiesDialog(self.view.currentLayer(), QgsStyle.defaultStyle(), True)
            dlg.layout = QVBoxLayout(dlg)
            dlg.buttons = QDialogButtonBox(dlg)
            dlg.layout.addWidget(dlg.widget)
            dlg.layout.addWidget(dlg.buttons)
            dlg.buttons.setOrientation(Qt.Horizontal)
            dlg.buttons.setStandardButtons(QDialogButtonBox.Cancel | QDialogButtonBox.Ok)

            # set signals
            def on_style_edit_accept(d):
                # this will update the layer's style
                dlg.widget.onOK()
                dlg.accept()

            dlg.buttons.accepted.connect(lambda d=dlg: on_style_edit_accept(d))
            dlg.buttons.rejected.connect(dlg.reject)
            dlg.exec_()
            self.canvas.refresh()
        elif layer.type() == 1 and layer.rasterType() != 2:
            dlg = QDialog()
            dlg.widget = QgsSingleBandPseudoColorRendererWidget(layer)
            dlg.layout = QVBoxLayout(dlg)
            dlg.buttons = QDialogButtonBox(dlg)
            dlg.layout.addWidget(dlg.widget)
            dlg.layout.addWidget(dlg.buttons)
            dlg.buttons.setOrientation(Qt.Horizontal)
            dlg.buttons.setStandardButtons(QDialogButtonBox.Cancel | QDialogButtonBox.Ok)

            # set signals
            def on_rasterstyle_edit_accept(d):
                # this will update the layer's style
                renderer = dlg.widget.renderer()
                layer.setRenderer(renderer)
                dlg.accept()

            dlg.buttons.accepted.connect(lambda d=dlg: on_rasterstyle_edit_accept(d))
            dlg.buttons.rejected.connect(dlg.reject)
            dlg.exec_()
            self.canvas.refresh()
        elif layer.type() == 1 and layer.rasterType() == 2:
            logger.info("multiband")

    # TODO: Check that it really changes CRS
    def layer_crs(self):
        self.projection_selector = QgsProjectionSelectionDialog()
        self.projection_selector.exec()
        crs = (self.projection_selector.crs())
        layer = self.view.currentLayer()
        layer.setCrs(crs)
        self.zoom_to_layer()

    def connect_signal_name(self):
        # catch signal nameChanged on name_changed slot
        while True:
            try:
                if self.view.currentNode() is not None:
                    # disconnect function name_changed for signal nameChanged
                    self.view.currentNode().nameChanged.disconnect(self.name_changed)
                else:
                    break
            except TypeError:
                break
        if self.view.currentNode() is not None:
            # connect function name_changed on signal nameChanged
            self.view.currentNode().nameChanged.connect(self.name_changed)