2 votos

¿Etiquetar todas las características del shapefile con PyQGIS?

Tengo un problema al intentar etiquetar todas las características de un shapefile con una rutina de Python.

Si abro mi shapefile en QGIS "a mano", y selecciono un .qml con selección de etiquetas predefinida, las etiquetas se muestran correctamente. Si cargo el archivo .qml a través de una rutina de Python (véase la línea siguiente), todas las características de estilo (colores, etc.) están ahí, EXCEPTO las etiquetas. No sé por qué.

myLayer.loadNamedStyle("someStyle.qml")

Como la línea anterior no me dio las etiquetas deseadas, intenté crear una rutina más extensa, ver abajo.

myProvider = myLayer.dataProvider()
myLayer.startEditing()
for myFeat in myLayer.getFeatures():
   #Some calculations in here...
   #The variable "Some_Value" is what I'd like to use as label

   Index_myLabelField=myLayer.fieldNameIndex("myLabelField")
   Value_myField={myFeat.id():{Index_myLabelField:QVariant(Some_Value)}}
   myProvider.changeAttributeValues(Value_myField)
   myLayer.commitChanges()

   myLayer.label().setLabelField(0,Index_myLabelField)
   myLayer.label().labelField(0)
   print myLayer.label().fieldValue(0,myFeat)   #Returns the desired label string

   #Create map renderer
   mapRenderer = QgsMapRenderer()
   rect = myLayer.extent()
   mapRenderer.setExtent(rect)
   mapRenderer.setLayerSet(QStringList(myLayer.id()))
   myRenderContext = mapRenderer.rendererContext()

   myLayer.select(myFeat.id())
   print myLayer.isValid()  #Returns true
   myLayer.label().renderLabel(myRenderContext,myFeat,1)   #Error: Segmentation fault (core dumped)

Hasta la última línea, en la que intento renderizar la etiqueta, todo parece funcionar bien.

¿Qué es lo que falla en la última línea?

Hay dos cosas de las que no estoy seguro:

  1. En la API de QGIS, la función para indicar a QGIS el campo que quiero utilizar como etiqueta es

    setLabelField (int attr, int fieldIndex)

¿Qué es el "attr" en este contexto?

¿Qué debo poner aquí?

He usado "0" hasta ahora...

  1. En la función renderLabel(), hay un "bool selected" necesario en la tercera posición de la llamada. Así que lo que estoy haciendo es seleccionar la característica (myFeat), y decirle a la función un "1" aquí.

¿Es eso correcto?

Renderización y etiquetado de Shapefile con PyQGIS no me ayuda del todo, ya que el OP no parece etiquetar todas las características de su shapefile. Soy capaz de añadir una etiqueta al archivo shape (algo así como un título) con el método descrito allí, pero estoy buscando tener una etiqueta junto a cada característica (por ejemplo, como los nombres de las calles en un mapa).

Si sabes por qué no funciona el qml-loading del principio de mi post ¿puedes decírmelo?

0 votos

¿Aplicación autónoma o plugin?

0 votos

Aplicación independiente, si entiendo bien la pregunta.

0 votos

Sí, ya que estás haciendo una aplicación que funciona fuera de QGIS.

4voto

Jauder Ho Puntos 3172

No se necesita nada en su bucle

Lo único que debes hacer es lo siguiente:

self.canvas = QgsMapCanvas()
self.canvas.mapRenderer().setLabelingEngine(QgsPalLabeling())
....
myLayer.loadNamedStyle("someStyle.qml")

Nota: No debe utilizar layer.label() ya que es el antiguo sistema de etiquetas y está depreciado y sin soporte.

0 votos

Añadiendo la línea mapRenderer.setLabelingEngine(QgsPalLabeling()) al código anterior se ha conseguido. Muchas gracias.

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