def use_active_layer(self): """ Loads coordinates extent of the active layer. """ iface.actionPan().trigger() layers = iface.mapCanvas().layers() chosen_layer = str(self.layersBox.currentText()) for layer in layers: if str(layer.name()) == chosen_layer: crs = self.format_crs_str(layer.crs().authid()) ex_layer = layer.extent() east = round(ex_layer.xMaximum(), 1) north = round(ex_layer.yMaximum(), 1) west = round(ex_layer.xMinimum(), 1) south = round(ex_layer.yMinimum(), 1) spatial_extent = { "west": west, "east": east, "north": north, "south": south, "crs": crs } str_format = str(spatial_extent).replace("'", '"') self.processgraphSpatialExtent.setText(str_format) if not iface.activeLayer(): self.iface.messageBar().pushMessage( "Please open a new layer to get extent from.", duration=5)
def set_canvas(self): """ Reads the coordinates of the drawings into the spatial extent variable. """ iface.actionPan().trigger() if iface.activeLayer(): crs = self.format_crs_str(iface.activeLayer().crs().authid()) extent = iface.mapCanvas().extent() self.east = round(extent.xMaximum(), 2) self.north = round(extent.yMaximum(), 2) self.west = round(extent.xMinimum(), 2) self.south = round(extent.yMinimum(), 2) spatial_extent = { "west": self.west, "east": self.east, "north": self.north, "south": self.south, "crs": crs } str_format = str(spatial_extent).replace("'", '"') self.processgraphSpatialExtent.setText(str_format) elif not iface.activeLayer(): self.iface.messageBar().pushMessage( "Please open a new layer to get extent from.", duration=5)
def draw(self): """ Starts the drawiong process e.g. if the user needs to interact with the map. """ if str(self.extentBox.currentText()) == "Draw Rectangle": if iface.activeLayer(): QMainWindow.hide(self) self.parent().hide() if self.parent().parent(): self.parent().parent().hide() self.drawRectangle = DrawRectangle(iface.mapCanvas(), self) iface.mapCanvas().setMapTool(self.drawRectangle) else: iface.actionPan().trigger() self.parent().show() QMainWindow.show(self) self.iface.messageBar().pushMessage( "Please open a new layer to get extent from.", duration=5) elif str(self.extentBox.currentText()) == "Draw Polygon": if iface.activeLayer(): self.drawBtn.setVisible(True) QMainWindow.hide(self) self.parent().hide() if self.parent().parent(): self.parent().parent().hide() self.drawPolygon = DrawPolygon(iface.mapCanvas(), self) iface.mapCanvas().setMapTool(self.drawPolygon) else: iface.actionPan().trigger() self.parent().show() QMainWindow.show(self) self.iface.messageBar().pushMessage( "Please open a new layer to get extent from.", duration=5)
def selection_changed(self) -> None: try: # Obtenim una llista de les Features seleccionades a la capa activa del mapa layer = iface.activeLayer() if not layer: return selected_features = layer.selectedFeatures() # Revisem si l'usuari no ha seleccionat res, en aquest cas deixem d'executar if len(selected_features) == 0: return # Get primary key field_id = tools_gw.execute_procedure('gw_fct_getpkeyfield', f"'{layer.name()}'") list_ids = [] # Desem l'ID de l'últim Feature seleccionat i ho mostrem a la consola for i in selected_features: attr_id = i.attribute(field_id) list_ids.append(attr_id) tools_qt.set_widget_text(self.dlg, self.dlg.lbl_selected_items, ','.join(list_ids)) except Exception as e: tools_log.log_warning(f"Exception: {type(e).__name__}, {e}") finally: # Tanquem la subscripció de l'event per evitar la duplicació iface.mapCanvas().selectionChanged.disconnect( self.selection_changed) iface.actionPan().trigger()
def disconnect_signal_selection_changed(): """ Disconnect signal selectionChanged """ try: global_vars.canvas.selectionChanged.disconnect() except Exception: pass finally: iface.actionPan().trigger()
def onDeselect(self): """Deselect features action.""" layer = self.getActiveLayer() if layer: layer.removeSelection() # disable deselect/delete buttons self.actionDeselect.setEnabled(False) self.actionDelete.setEnabled(False) # select -> pan iface.actionPan().trigger()
def edit_cancel_clicked(self): """ When cancel clicked """ if len(QgsProject.instance().mapLayersByName( "bulk_load_outlines")) > 0: if isinstance(self.change_instance, bulk_load_changes.EditAttribute): try: self.bulk_load_layer.selectionChanged.disconnect( self.change_instance.selection_changed) except TypeError: pass elif isinstance(self.change_instance, bulk_load_changes.EditGeometry): try: self.bulk_load_layer.geometryChanged.disconnect( self.change_instance.geometry_changed) except TypeError: pass try: self.bulk_load_layer.featureAdded.disconnect() except TypeError: pass elif isinstance(self.change_instance, bulk_load_changes.AddBulkLoad): try: self.bulk_load_layer.featureAdded.disconnect() except TypeError: pass try: self.bulk_load_layer.featureDeleted.disconnect() except TypeError: pass try: self.bulk_load_layer.geometryChanged.disconnect() except TypeError: pass if self.polyline: self.polyline.reset() if isinstance(self.circle_tool, PointTool): self.circle_tool.canvas_clicked.disconnect() self.circle_tool.mouse_moved.disconnect() self.circle_tool.deactivate() iface.actionPan().trigger() iface.actionCancelEdits().trigger() self.setup_toolbar() self.change_instance = None
def setup_main_toolbar(self): """ Set up the custom tool bar in its most basic state """ try: iface.building_toolbar.clear() iface.building_toolbar.setObjectName(u"Building Tools") iface.building_toolbar.hide() # Choose necessary basic tools for nav in iface.mapNavToolToolBar().actions(): if nav.objectName() in ["mActionPan"]: iface.building_toolbar.addAction(nav) except AttributeError: # iface.building_toolbar hadn't been created yet pass iface.actionPan().trigger()
def onDeselect(self): """Deselect features action.""" layer = self.getActiveLayer() if layer: # deselect features manually (there is no trigger # available) if requested layer.setSelectedFeatures([ feat.id() for feat in layer.selectedFeaturesIterator() if feat.id() < 0 ]) # disable deselect/delete buttons self.actionDeselect.setEnabled(False) self.actionDelete.setEnabled(False) # select -> pan iface.actionPan().trigger()
def insert_shape(self): """ Loads coordinates from an shapefile, starting a browsing prompt. """ iface.actionPan().trigger() # get generic home directory home = expanduser("~") filter_type = "SHP Shape Files (*.shp);; All Files (*.*)" # get location of file root = QFileDialog.getOpenFileName(self, "Select a file", home, filter_type) vlayer = QgsVectorLayer(root[0]) crs = self.format_crs_str(vlayer.crs().authid()) if vlayer.isValid(): # Trying to get the exact extend of the shapefile # geo_json = {} # for feature in vlayer.getFeatures(): # # warning(self.iface, feature.geometry().asJson()) # if not geo_json: # geo_json = json.loads(feature.geometry().asJson()) # else: # coords = geo_json.get("coordinates") # if coords and isinstance(coords, list): # geo_json.get("coordinates").extend(json.loads(feature.geometry().asJson())) # self.processgraphSpatialExtent.setText(json.dumps(geo_json)) # QgsVectorFileWriter.writeAsVectorFormat(vlayer, "F:\polygon.gpkg", "UTF-8", vlayer.crs(), "GeoJSON") extent = vlayer.extent() east = round(extent.xMaximum(), 1) north = round(extent.yMaximum(), 1) west = round(extent.xMinimum(), 1) south = round(extent.yMinimum(), 1) spatial_extent = { "west": west, "east": east, "north": north, "south": south, "crs": crs } str_format = str(spatial_extent).replace("'", '"') self.processgraphSpatialExtent.setText(str_format) else: error(self.iface, "Failed to load shapefile layer!")
def draw_rect(self, x1, y1, x2, y2): """ After drawing a rectangle it sets the coordinates for the spatial extent. :param x1: x coordinate of first point :param x2: x coordinate of second point :param y1: y coordinate of first point :param y2: y coordinate of second point """ if iface.activeLayer(): crs = self.format_crs_str(iface.activeLayer().crs().authid()) spatial_extent = {} if x1 <= x2: spatial_extent["west"] = round(x1, 3) spatial_extent["east"] = round(x2, 3) elif x2 <= x1: spatial_extent["west"] = round(x2, 3) spatial_extent["east"] = round(x1, 3) else: return "Error: Draw a new rectangle" if y1 <= y2: spatial_extent["north"] = round(y2, 3) spatial_extent["south"] = round(y1, 3) elif y2 <= y1: spatial_extent["north"] = round(y1, 3) spatial_extent["south"] = round(y2, 3) else: return "Error: Draw a new rectangle" spatial_extent["crs"] = crs str_format = str(spatial_extent).replace("'", '"') self.processgraphSpatialExtent.setText(str_format) self.parent().show() QMainWindow.show(self) elif not iface.activeLayer(): iface.actionPan().trigger() self.parent().show() QMainWindow.show(self) self.iface.messageBar().pushMessage( "Please open a new layer to get extent from.", duration=5)
def disconnect_snapping(action_pan=True, emit_point=None, vertex_marker=None): """ Select 'Pan' as current map tool and disconnect snapping """ try: global_vars.canvas.xyCoordinates.disconnect() except TypeError as e: print(f"{type(e).__name__} --> {e}") if emit_point is not None: try: emit_point.canvasClicked.disconnect() except TypeError as e: print(f"{type(e).__name__} --> {e}") if vertex_marker is not None: try: vertex_marker.hide() except AttributeError as e: print(f"{type(e).__name__} --> {e}") if action_pan: iface.actionPan().trigger()
def draw_poly(self, geometry): """ After drawing a polygon it sets the coordinates for the spatial extent. :param geometry: Polygon geometry from QQGIS """ if iface.activeLayer(): # warning(self.iface, str(geometry.asJson())) # crs = iface.activeLayer().crs().authid() # polygons_bounding_tuples = geometry # polygons_bounding_json_string = polygons_bounding_tuples[0].asJson( # 1) # this returns only the 4 desired points, rounded # polygons_bounding_json = json.loads(polygons_bounding_json_string) # values = [] # # for points in polygons_bounding_json['coordinates']: # values.append(points) # # point1 = values[0][0] # longitude first position, latitude second position # point1_long = point1[0] # point1_lat = point1[1] # point2 = values[0][1] # point2_long = point2[0] # point2_lat = point2[1] # point3 = values[0][2] # point3_long = point3[0] # point3_lat = point3[1] # point4 = values[0][3] # point4_long = point4[0] # point4_lat = point4[1] # # self.processgraphSpatialExtent.setText(str(values)) # # long = [] # lat = [] # # long.append([point1_long, point2_long, point3_long, point4_long]) # # long_min = min(long[0]) # long_max = max(long[0]) # lat.append([point1_lat, point2_lat, point3_lat, point4_lat]) # lat_min = min(lat[0]) # lat_max = max(lat[0]) # # spatial_extent = {"west": long_min, "east": long_max, "north": lat_max, # "south": lat_min, "crs": crs} # # str_format = str(spatial_extent).replace("'", '"') self.processgraphSpatialExtent.setText(geometry.asJson()) self.parent().show() QMainWindow.show(self) elif not iface.activeLayer(): iface.actionPan().trigger() self.parent().show() QMainWindow.show(self) self.iface.messageBar().pushMessage( "Please open a new layer to get extent from.", duration=5) else: iface.actionPan().trigger() self.parent().show() QMainWindow.show(self) self.iface.messageBar().pushMessage( "Please open a new layer to get extent from.", duration=5)
# coding: utf-8 from qgis.gui import QgsMapToolPan from qgis.utils import iface canvas = iface.mapCanvas() map_tool_pan = QgsMapToolPan(canvas) canvas.setMapTool(map_tool_pan) # Reuse the existing QgsMapToolPan instead of creating another one iface.actionPan().trigger()
def closeEvent(self, event): # Deaktywacja skrótów klawiszowych: self.hk_vn = False self.hk_seq = False # Usunięcie połączenia z Google Earth Pro: self.ge = None # Odblokowanie messagebar'u: try: iface.messageBar().widgetAdded.disconnect(self.msgbar_blocker) except: pass try: self.proj.layersWillBeRemoved.disconnect(self.layers_removing) self.proj.legendLayersAdded.disconnect(self.layers_adding) except Exception as err: print(f"closeEvent/self.proj.disconnect: {err}") self.proj = None try: self.canvas.children().remove(self.side_dock) self.side_dock.deleteLater() except: pass try: self.canvas.children().remove(self.bottom_dock) self.bottom_dock.deleteLater() except: pass try: self.canvas.children().remove(self.seq_dock) self.seq_dock.deleteLater() except: pass try: self.canvas.children().remove(self.flag_panel) self.flag_panel.deleteLater() except: pass try: self.canvas.children().remove(self.parking_panel) self.parking_panel.deleteLater() except: pass try: self.canvas.children().remove(self.marsz_panel) self.marsz_panel.deleteLater() except: pass try: self.canvas.children().remove(self.wyr_panel) self.wyr_panel.deleteLater() except: pass try: self.canvas.children().remove(self.wn_panel) self.wn_panel.deleteLater() except: pass try: self.canvas.children().remove(self.export_panel) self.export_panel.deleteLater() except: pass try: self.canvas.children().remove(self.splash_screen) self.splash_screen.deleteLater() except: pass try: self.mt = None except Exception as err: print(f"closeEvent/self.mt: {err}") try: self.lyr = None except Exception as err: print(f"closeEvent/self.lyr: {err}") try: self.cfg = None except Exception as err: print(f"closeEvent/self.cfg: {err}") # Przełączenie na QGIS'owy maptool: map_tool_pan = QgsMapToolPan(self.canvas) self.canvas.setMapTool(map_tool_pan) iface.actionPan().trigger() try: self.obj = None except Exception as err: print(f"closeEvent/self.obj: {err}") try: self.app.removeEventFilter(self) except Exception as err: print(f"closeEvent/self.app.removeEventFilter: {err}") try: self.canvas.removeEventFilter(self) except Exception as err: print(f"closeEvent/self.canvas.removeEventFilter: {err}") self.closingPlugin.emit() event.accept()