5 votos

(X, Y, Z) Coordinar seguimiento en QGIS

Estoy trabajando en un script de python que me dará la x,la y y la profundidad de coordenadas en QGIS. He profundidad como un atributo de la capa de trama. Mi objetivo es conseguir una barra de estado que muestra x,y y la profundidad de coordenadas cuando el ratón está en un determinado punto del lienzo. El código que he utilizado es:

from qgis.gui import *
from PyQt4.QtGui import QAction, QMainWindow, QApplication
from PyQt4.QtCore import SIGNAL, Qt

class MyWnd(QMainWindow):
  def __init__(self,layer):
    QMainWindow.__init__(self)
    self.statusBar().showMessage(u"x:-,y:-")
    self.canvas = QgsMapCanvas()
    self.canvas.setCanvasColor(Qt.white)

    self.canvas.setExtent(layer.extent())
    self.canvas.setLayerSet([QgsMapCanvasLayer(layer)])

    self.setCentralWidget(self.canvas)

    actionZoomIn = QAction("Zoom in", self)
    actionZoomOut = QAction("Zoom out", self)
    actionPan = QAction("Pan", self)

    actionZoomIn.setCheckable(True)
    actionZoomOut.setCheckable(True)
    actionPan.setCheckable(True)

    self.connect(actionZoomIn, SIGNAL("triggered()"), self.zoomIn)
    self.connect(actionZoomOut, SIGNAL("triggered()"), self.zoomOut)
    self.connect(actionPan, SIGNAL("triggered()"), self.pan)

    self.toolbar = self.addToolBar("Canvas actions")
    self.toolbar.addAction(actionZoomIn)
    self.toolbar.addAction(actionZoomOut)
    self.toolbar.addAction(actionPan)

    # create the map tools
    self.toolPan = QgsMapToolPan(self.canvas)
    self.toolPan.setAction(actionPan)
    self.toolZoomIn = QgsMapToolZoom(self.canvas, False) # false = in
    self.toolZoomIn.setAction(actionZoomIn)
    self.toolZoomOut = QgsMapToolZoom(self.canvas, True) # true = out
    self.toolZoomOut.setAction(actionZoomOut)

    self.pan()

  def zoomIn(self):
    self.canvas.setMapTool(self.toolZoomIn)

  def zoomOut(self):
    self.canvas.setMapTool(self.toolZoomOut)

  def pan(self):
    self.canvas.setMapTool(self.toolPan)

  def eventFilter(self,source,event):
    if event.type()==Qt.Event.MouseMove:
      if event.buttons()==Qt.NoButton:
        pos=event.pos()
        x=pos.x()
        y=pos.y()
        p=selfcanvas.getCoordinateTransform().toMapCoordinates(x,y)
        self.statusBar().showMessage(u"x:%s,y:%s" %(p.x(),p.y()))
      else:
        pass
    return QMainWindow.eventFilter(self,source,event)

Este archivo que tengo guardado como mywnd.py en la carpeta Python27 Luego en la consola de python en qgis yo uso

import mywnd
w=mywnd.MyWnd(qgis.utils.iface.activeLayer())
w.show()

Esto me da a mi la capa activa, pero todavía no puedo averiguar cómo obtener los valores de x y y en la barra de estado. Yo también no soy muy bueno en python.

5voto

Michael Puntos 11

Algunas notas

Un filtro de eventos...

... necesita ser instalado o que nunca va a ser llamado

def __init__(self):
    ...
    self.installEventFilter(self)

Los tipos de eventos...

... se enumeran en QEvent::Tipo, por lo que necesita utilizar QEvent.MouseMove.

El control del ratón ...

... está deshabilitada de forma predeterminada (por razones de rendimiento), por lo que necesita para habilitar de forma explícita si desea recibir mover eventos en el filtro de eventos, incluso cuando no hay ningún botón es pulsado

self.setMouseTracking(True)

El estilo de código

Nuevo estilo conexiones son mejores

Usar algo como

self.actionZoomIn.triggered.connect(self.zoomIn)

Comodín de las importaciones

... son desalentados.

Ya estás haciendo las cosas correctamente para from PyQt4.QtGui import xxx. Hacer lo mismo para el qgis de las importaciones. No use from qgis.gui import * , pero en lugar de

from qgis.gui import QgsMapCanvas, QgsMapToolPan, etc.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X