Як намалювати багатокутники з консолі пітона?


14

Я відвідував і переглядав сторінку про керування геометрією в кулінарній книзі PyQGIS: http://documentation.qgis.org/2.0/en/docs/pyqgis_developer_cookbook/geometry.html, але не можу зрозуміти, як отримати багатокутник, щоб малювати з консолі Python. Хтось може допомогти?

Відповіді:


26

це не дуже складно, подивіться на постачальника пам'яті у векторі :

  • крапка створюється за допомогою QgsPoint(x,y)іQgsGeometry.fromPoint(QgsPoint(x,y))
  • лінія складається з двох точок: QgsGeometry.fromPolyline([QgsPoint(x1,y1),QgsPoint(x2,y2)]))
  • створюється багатокутник зі списком точок: QgsGeometry.fromPolygon([[QgsPoint(x1,y1),QgsPoint(x2,y2), QgsPoint(x3,y3)]])

1) два бали:

# 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])

введіть тут опис зображення

2) лінія, що з'єднує дві точки

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])

введіть тут опис зображення

3) багатокутник, що охоплює точки

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])

введіть тут опис зображення

-

Зміни в QGIS 3.0 і далі:

Для QGIS 3.0 і далі вищеописаний робочий процес все ще є правильним, але деякі функції змінилися. Дивіться https://qgis.org/api/api_break.html

Щоб оновити вищевказаний код, змініть наступні функції:

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

Дуже дякую за код. Мені було цікаво, як я можу позбутися діалогу вибору CRS після запуску коду?
wannik

як я можу додати стиль?
cjahangir

3

Просто виберіть CRS у визначенні шару: QgsVectorLayer('Polygon?crs=epsg:2154', 'poly' , "memory")наприклад (EPSG 2154 - це проекція Lambert 93, стандартна у метрополії Франції, але ви можете поставити все, що завгодно)


як я можу додати стиль?
cjahangir
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.