6 votos

Cómo definir líderes a una etiqueta en QGIS 2

En QGIS 1.8 y 1.9 utilicé un plugin llamado Easy Labels para desarrollar líneas de referencia que se guardarían como una capa de memoria. No he podido replicar esto con QGIS 2.0, ni siquiera puedo encontrar el plugin Easy Label. Asumiendo que ya no es válido en QGIS 2.

Pregunta: ¿Cómo puedo crear una guía desde una etiqueta movida fuera de un polígono hasta el centroide del polígono?

0 votos

Echa un vistazo a MMQGIS que te ofrece hacer lo mismo. MMQGIS.... CREAR.... LÍNEAS HUB

5voto

Ivan Petrushev Puntos 158

Como un ejercicio rápido de la mañana, he hackeado un QGIS Python script juntos, la creación de líneas en un memorylayer de un polígono centroide a una costumbre se trasladó de datos vinculados etiqueta.

Necesitas una columna x e y en tu tabla para tener almacenadas las coordenadas de las etiquetas. También configure las coordenadas x e y de la etiqueta definida en las propiedades de las etiquetas.

Labels

Arrastra la etiqueta donde quieras, con la herramienta de movimiento de etiquetas:

labelmove

Copie el código Python de abajo en un archivo llamado Labellines.py en su carpeta Python. En Windows sería C:\Users\USERNAME\ .qgis2 \python.

"""
Generates lines from a data binded label to centroid of a polygon
Created by jakob at lanstorp dot com. Run from QGIS Python Console:

from Labellines import LabelLineGenerator
generator = LabelLineGenerator(qgis.utils.iface)
generator.createLabellines()
"""

from qgis.core import *

def run_script(iface):
     ''' Script runner from QGIS uses this driver code '''
     from Labellines import LabelLineGenerator
     generator = LabelLineGenerator(iface)
     generator.createLabellines()

class LabelLineGenerator:
    def __init__(self, iface):
        """Initialize using the qgis.utils.iface 
        object passed from the console.
        """

        # Set the name of the layer
        self.labelTable = 'Kommuner2006'

        self.iface = iface
        self.log = lambda m: QgsMessageLog.logMessage(m,'Labellines')
        self.log('LabelLineGenerator started ....')

    def createLabellines(self, layerToLable):
         self.createLabellineMemoryLayer()

         # Polygon layer to label
         vlayer = QgsVectorLayer("D:\data\Kommuner2006\Kommuner2006.shp","Kommuner", "ogr")

         # Iterate base layer
         iter = vlayer.getFeatures()
         i = 0
         for feature in iter:
             # Get data binded label coordinates
             xLabel = feature["x"]
             yLabel = feature["y"]
             # Skip labelline creation if label has not been moved
             if xLabel == NULL or yLabel == NULL:
                 continue   
             # Create label point
             labelPoint = QgsPoint(xLabel,yLabel)
             geom = feature.geometry()
             # Create centroid point
             centroidPoint = geom.centroid().asPoint()
             # Append label line to a memorylayer
             ft = QgsFeature()
             ft.setAttributes([i])
             ft.setGeometry(QgsGeometry.fromPolyline([geom.centroid().asPoint(),labelPoint]))
             self.labellineLayer.dataProvider().addFeatures([ft])
             i=i+1

         self.labellineLayer.commitChanges()

    def createLabellineMemoryLayer(self):
         ''' Create a memory layer for handling lines between centroid and label text '''
         self.labellineLayer =  QgsVectorLayer(
         "LineString?" +
         "crs=epsg:25832&" + 
         "field=id:integer&" +
         "index=yes",
         "Labelline",
         "memory")

         QgsMapLayerRegistry.instance().addMapLayer(self.labellineLayer)  

Actualice las líneas 35 y 65 con sus propios ajustes.

Ejecútelo desde la consola de QGIS Python:

from Labellines import LabelLineGenerator    
generator = LabelLineGenerator(qgis.utils.iface)    
generator.createLabellines()

Esto no es nada comparado con el plugin Easy Labels, pero me dio este mapa de algunos municipios de Copenhague.

copenhagen

Línea 35 - La capa de polígonos que desea etiquetar:

vlayer = QgsVectorLayer(" D:\data\Kommuner2006\Kommuner2006.shp ", "Kommuner", "ogr")

Línea 64 - El código epsg de su capa poligonal:

"crs=epsg:25832&" +

0 votos

Ah... tener la capacidad de armar esto, impresionante. Lo probaré cuando tenga un momento. Supongo que el plugin Easy Label sólo necesita ser actualizado para QGIS 2.O? Sólo para calrificar, cuando actualizo la línea 35, ¿es esta la capa que quiero etiquetar? Así que tendría que cambiar el script para cada capa que necesito etiquetar de esta manera? Entiendo la parte de la ubicación, pero ¿cuáles son los dos últimos ajustes?

0 votos

No sé el estado del plugin Easy Label. Se podría sospechar que no llegará a QGIS 2, ya que QGIS 2 ha mejorado mucho el manejo de las etiquetas. He actualizado la respuesta en la parte inferior con respecto a las dos líneas para su edición.

0 votos

Entiendo que " D:\data\Kommuner2006\Kommuner2006.shp " es el nombre del archivo shape que hay que etiquetar. Pero, ¿con qué se relacionan "Kommuner" y "ogr"?

0voto

Alan Pearce Puntos 536

También es posible que desee consultar este puesto si quiere evitar el uso de Python. Vea la respuesta que añadí debajo de mi post. He utilizado el plugin EasyCustomLabeling. Te recomiendo que descargues la última versión, ya que algunas de las versiones más antiguas sólo te permiten editar la capa de memoria en la sesión cuando la creaste. ¡Hágame saber si esto no está claro!

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