21 votos

¿Cómo dibujar polígonos desde la consola de python?

He estado visitando y revisando la página sobre el manejo de la geometría en el PyQGIS Cookbook: http://documentation.qgis.org/2.0/en/docs/pyqgis_developer_cookbook/geometry.html pero no consigo averiguar cómo hacer que el polígono se dibuje desde la consola de Python. ¿Alguien me puede ayudar?

33voto

GreyCat Puntos 146

No es realmente complicado, mira Proveedor de memoria en vector : :

  • se crea un punto con QgsPoint(x,y) y QgsGeometry.fromPoint(QgsPoint(x,y))
  • se crea una línea con dos puntos: QgsGeometry.fromPolyline([QgsPoint(x1,y1),QgsPoint(x2,y2)]))
  • se crea un polígono con una lista de puntos: QgsGeometry.fromPolygon([[QgsPoint(x1,y1),QgsPoint(x2,y2), QgsPoint(x3,y3)]])

1) dos puntos:

# create a memory layer with two points
layer =  QgsVectorLayer('Point', 'points' , "memory")
pr = layer.dataProvider() 
# add the first point
pt = QgsFeature()
point1 = QgsPoint(50,50)
pt.setGeometry(QgsGeometry.fromPoint(point1))
pr.addFeatures([pt])
# update extent of the layer
layer.updateExtents()
# add the second point
pt = QgsFeature()
point2 = QgsPoint(100,150)
pt.setGeometry(QgsGeometry.fromPoint(point2))
pr.addFeatures([pt])
# update extent
layer.updateExtents()
# add the layer to the canvas
QgsMapLayerRegistry.instance().addMapLayers([layer])

enter image description here

2) la línea que une los dos puntos

layer =  QgsVectorLayer('LineString', 'line' , "memory")
pr = layer.dataProvider() 
line = QgsFeature()
line.setGeometry(QgsGeometry.fromPolyline([point1,point2]))
pr.addFeatures([line])
layer.updateExtents()
QgsMapLayerRegistry.instance().addMapLayers([layer])

enter image description here

3) un polígono que cubra los puntos

layer =  QgsVectorLayer('Polygon', 'poly' , "memory")
pr = layer.dataProvider() 
poly = QgsFeature()
points = [point1,QgsPoint(50,150),point2,QgsPoint(100,50)]
# or points = [QgsPoint(50,50),QgsPoint(50,150),QgsPoint(100,150),QgsPoint(100,50)] 
poly.setGeometry(QgsGeometry.fromPolygon([points]))
pr.addFeatures([poly])
layer.updateExtents()
QgsMapLayerRegistry.instance().addMapLayers([layer])

enter image description here

-

Cambios en QGIS 3.0 y versiones posteriores:

Para QGIS 3.0 y posteriores el flujo de trabajo anterior sigue siendo correcto, pero ciertas funciones han cambiado. Véase https://qgis.org/api/api_break.html

Para actualizar el código anterior, cambie las siguientes funciones:

QgsPoint -> QgsPointXY
QgsfromPoint -> QgsfromPointXY
QgsfromPolyline -> QgsfromPolylineXY
QgsfromPolygon -> QgsfromPolylineXY
QgsfromPolyline -> QgsfromPolylineXY
QgsMapLayerRegistry -> QgsProject

0 votos

Muchas gracias por el código. Me preguntaba cómo puedo deshacerme de diálogo de selección CRS después de ejecutar el código?

0 votos

¿cómo puedo añadir estilo?

0 votos

Esta actualización me ha resultado muy útil -no la encontraba en la documentación- y ya la he utilizado varias veces para mis herramientas. Muchas gracias.

4voto

mackowiakp Puntos 2

Sólo tiene que seleccionar el CRS en la definición de capa : QgsVectorLayer('Polygon?crs=epsg:2154', 'poly' , "memory") por ejemplo (aquí EPSG 2154 es para la proyección Lambert 93, estándar en la Francia metropolitana, pero puedes poner lo que quieras)

0 votos

¿cómo puedo añadir estilo?

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