1 votos

Solución pitónica para cambiar las propiedades de los shapefiles en QGIS

Estoy cargando varios shapefiles en QGIS usando la consola de Python. El script funciona leyendo una lista de directorios y una lista de shapefiles a cargar de cada directorio, luego carga cada archivo. Así:

encList = "/foo/encList.txt"
shapeList = "/foo/shpList.txt"
path = "/bar/"
with open(encList) as encs:
    for enc in encs:
            with open(shapeList) as shps:
                    for shp in shps:
                            file=path+str(enc).rstrip()+'/'+str(enc).rstrip()+str(shp).rstrip()+".shp"
                            print file
                            qgis.utils.iface.addVectorLayer(file, str(enc).rstrip()+str(shp).rstrip(), 'ogr' )

                            #Use loaded layer as active layer to set the CRS
                            myLayer = qgis.utils.iface.activeLayer()
                            myLayer.setCrs(QgsCoordinateReferenceSystem(4326, QgsCoordinateReferenceSystem.EpsgCrsId))

También me gustaría configurar las capas del shapefile sobre la marcha. Como lo haría si se hace clic derecho en una capa y seleccionar las propiedades.

En concreto, me gustaría cambiar los colores de las líneas y la visualización de las etiquetas. En mi cabeza necesitaría algo como este pseudocódigo añadido en el bucle:

if shapefile == line:
   then shapefile.setColor(black)
if shapefile == points:
   then shapefile.setStyle(pointDisplacement)
   ans shapefile.setStyle.lable('nameOfPoint')

O algo así. He descubierto cómo hacer las condiciones, sólo necesito entender cómo cambiar los atributos. ¿Alguien sabe de una manera o un tutorial?

(Soy nuevo en QGIS, pero sé cómo funciona Python)

2 votos

Puede echar un vistazo a esta pregunta sobre los ajustes de color de PyQgis. Hay un tuto más detallado ici sobre estilismo general.

2 votos

Para más información, puede consultar esta pregunta sobre etiquetas: Cómo añadir etiqueta a QgsVectorLayer por Python .

2 votos

También me gustaría sugerir a familiarizarse con pyqgis api, y el modelo de datos. Eso haría su vida más fácil en el futuro.

1voto

user32450 Puntos 21

Así que después de algunos retoques y la lectura de los comentarios más útiles que he logrado hacer resolver esto, sobre todo con la ayuda de esta pregunta (gracias arMoraer) y la lectura de algunos materiales de referencia.

Recomiendo la lectura de este tutorial (de nuevo gracias a arMoraer) que da un poco de información sobre la estructura de datos de las capas.

Aquí hay una copia del código del "cargador" completado con los cambios de color condicionales:

encList = "/foo/encList.txt"
shapeList = "/foo/shpList.txt"
path = "/bar/"
with open(encList) as encs:
    for enc in encs:
            with open(shapeList) as shps:
                    for shp in shps:
                            file=path+str(enc).rstrip()+'/'+str(enc).rstrip()+str(shp).rstrip()+".shp"
                            print file
                            qgis.utils.iface.addVectorLayer(file, str(enc).rstrip()+str(shp).rstrip(), 'ogr' )

                            #Use loaded layer as active layer and set the CRS
                            layer = qgis.utils.iface.activeLayer()
                            layer.setCrs(QgsCoordinateReferenceSystem(4326, QgsCoordinateReferenceSystem.EpsgCrsId))

                            # If the shape is designated as a line type
                            if(str(shp).rstrip()[-1:] == "L"):
                                symbols = layer.rendererV2().symbols()
                                symbol = symbols[0]
                                symbol.setColor(QtGui.QColor.fromRgb(0,0,0))

                            # If the shape is designated as a point type
                            if(str(shp).rstrip()[-1:] == "P"):
                                symbols = layer.rendererV2().symbols()
                                symbol = symbols[0]
                                symbol.setColor(QtGui.QColor.fromRgb(255, 77, 77))

                            qgis.utils.iface.mapCanvas().refresh() 
                            qgis.utils.iface.legendInterface().refreshLayerSymbology(layer)

Tal vez esto ayude a un compañero novato que se metió hasta la cintura en QGIS tan rápido como yo. Gracias a todos los que agregaron comentarios y orientación.

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