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
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())
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()))
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
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()
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()
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)