Mit Python quadratische Puffer um Punkte in QGIS erstellen?

8

Ich habe x, y-Koordinaten in lat / long und ich muss quadratische Zellen von 5x5 Grad um sie herum erstellen, wobei die lat / long-Koordinaten die Schwerpunkte sind.

Meine erste Option besteht darin, einen Puffer um die Zentroide mit 1 Segment und einem Abstand von 1/2 (5 °) * sqrt (2) zu erstellen (muss mit sqrt (2) multipliziert werden, da das Werkzeug den Schwerpunkt an der Ecke des Quadrats als verwendet Der Pufferabstand (im Gegensatz zum Schwerpunkt zur Kante), der zu seitlichen Quadraten um meine Punkte führt, dreht dann jedes Feature um 45 Grad. Ich würde es vorziehen, dies nicht zu tun, da der Abstand nicht so genau ist und ich nicht weiß, wie ich jedes einzelne Puffermerkmal schnell drehen kann.

Meine zweite Option, die viel einfacher zu sein scheint, besteht darin, einen Puffer um die Zentroide mit dem von mir benötigten Abstand ((1/2) * 5 °) zu erstellen und dann so etwas wie das Feature-to-Envelope-Tool von ArcMap zu verwenden.

Ich sehe, dass hier jemand die gleiche Frage hat und eine Antwort gegeben wurde, aber ich habe keine Ahnung, wie ich das programmgesteuert machen soll.

srha
quelle

Antworten:

19

Wie Sie sich in Ihrem letzten Absatz gefragt haben, ist es nicht sehr schwierig, dies programmgesteuert mit PyQGIS zu tun. Sie können den nächsten Code ausprobieren. Ich habe jedoch ein Shapefile und projizierte Koordinaten in Metern verwendet (Puffer hat 1000 m). Sie müssten nur ein paar Änderungen vornehmen.

layer = iface.activeLayer()

feats = [ feat for feat in layer.getFeatures() ]

epsg = layer.crs().postgisSrid()

uri = "Polygon?crs=epsg:" + str(epsg) + "&field=id:integer""&index=yes"

mem_layer = QgsVectorLayer(uri,
                           'square_buffer',
                           'memory')

prov = mem_layer.dataProvider()

for i, feat in enumerate(feats):
    new_feat = QgsFeature()
    new_feat.setAttributes([i])
    tmp_feat = feat.geometry().buffer(1000, -1).boundingBox().asWktPolygon()
    new_feat.setGeometry(QgsGeometry.fromWkt(tmp_feat))
    prov.addFeatures([new_feat])

QgsMapLayerRegistry.instance().addMapLayer(mem_layer)

Nachdem ich den obigen Code in der Python-Konsole von QGIS ausgeführt hatte, erhielt ich:

Geben Sie hier die Bildbeschreibung ein

Es klappt.

Bearbeitungshinweis:

Der nächste Code führt in die Attributtabelle eine Spalte für die x-Koordinate, die y-Koordinate und die ID-Nummer für jeden Punkt ein.

layer = iface.activeLayer()

feats = [ feat for feat in layer.getFeatures() ]

epsg = layer.crs().postgisSrid()

uri = "Polygon?crs=epsg:" + str(epsg) + "&field=id:integer&field=x:real&field=y:real&field=point_id:integer""&index=yes"

mem_layer = QgsVectorLayer(uri,
                           'square_buffer',
                           'memory')

prov = mem_layer.dataProvider()

for i, feat in enumerate(feats):
    point = feat.geometry().asPoint()
    new_feat = QgsFeature()
    new_feat.setAttributes([i, point[0], point[1], feat.id()])
    tmp_feat = feat.geometry().buffer(1000, -1).boundingBox().asWktPolygon()
    new_feat.setGeometry(QgsGeometry.fromWkt(tmp_feat))
    prov.addFeatures([new_feat])

QgsMapLayerRegistry.instance().addMapLayer(mem_layer)

Nach dem Ausführen des neuen Codes in der Python-Konsole von QGIS war das Ergebnis:

Geben Sie hier die Bildbeschreibung ein

xunilk
quelle
Vielen Dank für Ihre Antwort. Wie würde ich dies ändern, damit die endgültigen Ausgabepolygone die Attribute der Punkte enthalten?
Srha
Welche Punktattribute?
Xunilk
1
Dies ist eine weitere Frage, die Sie jedoch in meinem Bearbeitungshinweis finden .
Xunilk
2
Wenn Sie dies in QGIS 3 versuchen (2,99 zum Zeitpunkt des Schreibens dieses Kommentars), ersetzen Sie QgsMapLayerRegistryin der letzten Zeile durch QgsProject. Weitere Informationen finden Sie hier
Techie_Gus
1
-1 Dies ist die Standardeinstellung für einen vollständig kreisförmigen Puffer. Wenn Sie 1 verwenden, erhalten Sie einen Puffer für vier Seiten, 2 einen Puffer für acht Seiten (4 + 4), 3 einen Puffer für zwölf Seiten (8 + 4) und so weiter.
Xunilk
4

QGIS 3 bietet eine schnelle und schmutzige Alternative: - Vektor -> Geoverarbeitungswerkzeuge -> Puffer

Wählen Sie Ihre Punktebene als Eingabeebene aus. Stellen Sie sicher, dass der Endkappenstil auf Quadrat eingestellt ist und der Abstand die Hälfte der beabsichtigten Quadratlänge beträgt (ein Quadrat mit 1 km pro Seite sollte also einen Abstand von 500 m haben).

miln40
quelle
1

Um Punkte in Quadrate umzuwandeln, können Sie versuchen, einen native:bufferVerarbeitungsalgorithmus mit dem END_CAP_STYLEParameter 2(Quadrat) zu verarbeiten.

Warnung! Die Ergebnisse können variieren und hängen vom Koordinatensystem der Eingabeebene ab. Wenn Sie beispielsweise WGS 84 verwenden und den Abstand 5000dazu einstellen, ergibt sich eine quadratische Linie von 5000 Grad (nicht Meter).

Geben Sie hier die Bildbeschreibung ein

Getestet mit pyQGIS 3.6.1:

def buffer(input, distance, output, before_processing_reproject_to_epsg_number=None):
    params = {'INPUT': input,
              'DISTANCE': distance,
              'END_CAP_STYLE': 2 , # - 0: Round - 1: Flat - 2: Square
              'DISSOLVE': False,
              'OUTPUT': output}
    feedback = qgis.core.QgsProcessingFeedback()
    alg_name = 'native:buffer'
    # print(processing.algorithmHelp(alg_name)) # tool tips
    result = processing.run(alg_name, params, feedback=feedback)
    return  result

Anwendungsbeispiel:

buffer_result = buffer(input=r'C:\input.shp', distance=5000, output=r'C:\output.shp')
print(buffer_result)
Genosse Che
quelle