7 votos

¿Cómo cargar múltiples capas vectoriales en el lienzo de mapas de QGIS utilizando scripts de python?

Estoy tratando de escribir un script independiente en python para crear un lienzo de mapa QGIS. Las capas vectoriales que estoy tratando de cargar son Shapefiles.

Actualmente, puedo cargar cada capa vectorial, añadirlas al registro del mapa y mostrarlas en mi aplicación de lienzo de mapa. El problema que tengo es que necesito que todas estas capas vectoriales se muestren en el lienzo del mapa al mismo tiempo. Actualmente el lienzo del mapa de qgis sólo muestra la última capa vectorial que se estableció en "canvas.setExtent(vector_layer.extent())". He intentado crear una lista de todas mis capas y luego ponerla en canvas.setExtent(list_of_layers.extent()) pero las listas no tienen el método "extent.()".

He leído el cookbook de pyQGIS y entiendo que el método .extent() es para un determinado vector que se quiere ver... ¿Cómo puedo mostrar todas las capas vectoriales a la vez (sin usar la consola de Python)? He indagado en otros Q&As que tenían preguntas similares a esta; sin embargo, no estoy encontrando ninguna solución que realmente aborde mi problema.

Aquí está mi siguiente código:

import modules
from qgis.core import *
from qgis.gui import *
from PyQt4.QtCore import *
from PyQt4 import QtGui
import os, sys
import qgis

def main():

    # supply path to qgis isntall location
    QgsApplication.setPrefixPath("/usr", True)

    # create a reference to the QgsApplication, setting the 
    # second arguement to False disables the GUI
    app = QgsApplication([], True)

    # load providers
    app.initQgis()

    # create Qt widget
    canvas = QgsMapCanvas()
    canvas.setCanvasColor(Qt.white)

    # enable this for smooth rendering
    canvas.enableAntiAliasing(True)

    # not updated US6SP10M files from ENC_ROOT
    source_dir = "/home/cassandra/desktop/file_formats/Shapefiles"

    # load vector layers
    for files in os.listdir(source_dir):

        # load only the shapefiles
        if files.endswith(".shp"):
            vlayer = QgsVectorLayer(source_dir + "/" + files, files, "ogr")

            # add layer to the registry
            QgsMapLayerRegistry.instance().addMapLayer(vlayer)

            # set extent to the extent of our layer
            canvas.setExtent(vlayer.extent())

            # set the map canvas layer set
            canvas.setLayerSet([QgsMapCanvasLayer(vlayer)])

    # refresh canvas and show it        
    canvas.refresh()
    canvas.show()
    app.exec_()
    app.exitQgis()

main()

0 votos

0 votos

Por desgracia, he probado el método publicado. Por alguna razón sólo resulta un error de segmentación 'core' volcado y no aparece ningún mapa. Sólo ocurre cuando añado ese trozo de código.

0 votos

La verdad es que voy a intentar jugar un poco con ello a ver qué pasa.

7voto

guns Puntos 3881

¡Lo he descubierto! Era algo muy pequeño. Básicamente, las capas que se quieren ver en el lienzo se proporcionan a través de canvas.setLayerSet(list_of_layers).

# total list of layers actually displayed on map canvas
canvas_layers = []

# load vector layers
for files in os.listdir(source_dir):

    # load only the shapefiles
    if files.endswith(".shp"):

        # create vector layer object
        vlayer = QgsVectorLayer(source_dir + "/" + files, files, "ogr")
        print(files)

        # add the layer to the registry
        QgsMapLayerRegistry.instance().addMapLayer(vlayer)

        # combine extent of the current vector layer with the extent of the created "extent" rectangle object
        extent.combineExtentWith(vlayer.extent())
        canvas_layers.append(QgsMapCanvasLayer(vlayer))

# set extent to the extent of a larger rectangle so we can see all geometries       
canvas.setExtent(extent)

# provide set of layers for display on the map canvas
canvas.setLayerSet(canvas_layers)

0 votos

[¡¡¡TypeError: index 0 has type 'str' but 'QgsMapLayer' is expected] obteniendo este error para "canvas.setLayerSet(canvas_layers)" esta línea. amablemente sugerir!!!

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