Tạo bộ đệm vuông xung quanh các điểm trong QGIS bằng Python?


8

Tôi có tọa độ x, y tính theo lat / long và tôi cần tạo các ô vuông 5x5 độ xung quanh chúng, với tọa độ lat / long là tâm.

Tùy chọn đầu tiên của tôi là tạo một bộ đệm xung quanh tâm với 1 đoạn và khoảng cách 1/2 (5 °) * sqrt (2) (phải nhân với sqrt (2) bc công cụ sử dụng centroid vào góc của hình vuông như khoảng cách bộ đệm, trái ngược với centroid đến cạnh), dẫn đến các ô vuông nằm ngang xung quanh các điểm của tôi, sau đó xoay mỗi tính năng 45 độ. Tôi không muốn làm điều này vì khoảng cách không chính xác và tôi không biết cách nhanh chóng xoay từng tính năng bộ đệm riêng lẻ.

Tùy chọn thứ hai của tôi, có vẻ đơn giản hơn nhiều, là tạo một bộ đệm xung quanh tâm với khoảng cách tôi cần ((1/2) * 5 °) và sau đó sử dụng một cái gì đó như công cụ Feature to Envel của ArcMap.

Tôi thấy rằng ai đó có cùng một câu hỏi ở đây và một câu trả lời đã được cung cấp, nhưng tôi không biết làm thế nào để làm điều đó theo chương trình.

Câu trả lời:


19

Như bạn tự hỏi trong đoạn cuối của mình, để làm điều đó theo chương trình với PyQGIS, điều đó không khó lắm. Bạn có thể thử mã tiếp theo. Tuy nhiên, tôi đã sử dụng tọa độ shapefile và chiếu theo mét (bộ đệm có 1000 m). Bạn chỉ cần thực hiện một vài thay đổi.

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)

Sau khi chạy đoạn mã trên tại Bảng điều khiển Python của QGIS, tôi nhận được:

nhập mô tả hình ảnh ở đây

Nó hoạt động.

Chỉnh sửa ghi chú:

Mã tiếp theo giới thiệu ở bảng thuộc tính một cột cho tọa độ x, tọa độ y và số ID cho mỗi điểm.

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)

Sau khi chạy mã mới tại Bảng điều khiển Python của QGIS, kết quả là:

nhập mô tả hình ảnh ở đây


Cảm ơn bạn vì câu trả lời. Làm thế nào tôi có thể sửa đổi điều này để đa giác đầu ra cuối cùng bao gồm các thuộc tính của các điểm?
srha

Không thuộc tính điểm?
xunilk

1
Đây là một câu hỏi khác, tuy nhiên, bạn có câu trả lời trong Ghi chú chỉnh sửa của tôi .
xunilk

2
Đối với bất kỳ ai đang thử điều này trên QGIS 3 (2,99 tại thời điểm viết nhận xét này), hãy thay thế QgsMapLayerRegistrytrên dòng cuối cùng bằng QgsProject. Để biết thêm thông tin, hãy xem cái này
Techie_Gus

1
-1 nó là mặc định cho một bộ đệm hoàn toàn tròn. Bằng cách sử dụng 1 được bộ đệm bốn mặt, 2 có được bộ đệm tám mặt (4 + 4), 3 có được bộ đệm mười hai mặt (8 + 4), v.v.
xunilk

4

QGIS 3 cung cấp một giải pháp thay thế nhanh chóng và bẩn thỉu: - Vector -> Công cụ xử lý địa lý -> Bộ đệm

Chọn lớp điểm của bạn làm lớp đầu vào, đảm bảo rằng kiểu nắp kết thúc được đặt thành hình vuông và khoảng cách phải bằng một nửa chiều dài hình vuông dự định (vì vậy hình vuông 1km mỗi cạnh phải có Khoảng cách 500m).


1

Để chuyển đổi điểm thành hình vuông, bạn có thể thử native:bufferxử lý thuật toán với END_CAP_STYLEtham số được đặt thành 2(hình vuông).

Cảnh báo! Kết quả có thể thay đổi và phụ thuộc vào hệ tọa độ của lớp đầu vào. Trong exapmle, nếu bạn sử dụng WGS 84 và đặt khoảng cách đến mức 5000này sẽ dẫn đến một đường vuông 5000 độ (không phải mét).

nhập mô tả hình ảnh ở đây

Đã thử nghiệm với 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

Ví dụ sử dụng:

buffer_result = buffer(input=r'C:\input.shp', distance=5000, output=r'C:\output.shp')
print(buffer_result)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.