Розділити функцію при перетині з ознакою іншого шару за допомогою PyQGIS / Python?


12

У мене буферний шар (зелений багатокутник), який я хочу розділити на два полігони, коли він перетинає бар'єр (синя лінія). Я намагався використовувати метод "splitGeometry", але я просто не можу змусити його працювати. Мій код поки що такий:

while ldbuffprovider.nextFeature(feat):
  while barprovider.nextFeature(feat2):
    if feat.geometry().intersects(feat2.geometry()):
        intersection = feat.geometry().intersection(feat2.geometry())
        result, newGeometries, topoTestPoints=feat.geometry().splitGeometry(intersection.asPolyline(),True) 

Який повертає 1 за результатом (помилка) та порожній список для нових Геометрій. Будь-яка допомога дуже вдячна.

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


1
Можливо, цей тут вам допоможе: gis.stackexchange.com/questions/66543/erase-method-using-ogr
Michalis Avraam

Відповіді:


7

Для цього можна використовувати reshapeGeometryфункцію QgsGeometryоб’єкта, який вирізає багатокутник уздовж його перетину лінією.

Далі буде перетинатися багатокутник буфера з лініями та додавати функції розбитого полігону до рівня пам'яті (синтаксис QGIS 2.0):

# Get the dataProvider objects for the layers called 'line' and 'buffer'
linepr = QgsMapLayerRegistry.instance().mapLayersByName('line')[0].dataProvider()
bufferpr = QgsMapLayerRegistry.instance().mapLayersByName('buffer')[0].dataProvider()

# Create a memory layer to store the result
resultl = QgsVectorLayer("Polygon", "result", "memory")
resultpr = resultl.dataProvider()
QgsMapLayerRegistry.instance().addMapLayer(resultl)


for feature in bufferpr.getFeatures():
  # Save the original geometry
  geometry = QgsGeometry.fromPolygon(feature.geometry().asPolygon())
  for line in linepr.getFeatures():
    # Intersect the polygon with the line. If they intersect, the feature will contain one half of the split
    t = feature.geometry().reshapeGeometry(line.geometry().asPolyline())
    if (t==0):
      # Create a new feature to hold the other half of the split
      diff = QgsFeature()
      # Calculate the difference between the original geometry and the first half of the split
      diff.setGeometry( geometry.difference(feature.geometry()))
      # Add the two halves of the split to the memory layer
      resultpr.addFeatures([feature])
      resultpr.addFeatures([diff])


1
Це працює блискуче. Спершу я спробував інше рішення, і воно спрацювало, і це дало щедрість за це ще до того, як я прочитав ур ан Це рішення абсолютно ідеальне і краще підходить для мого сценарію. вибачте за це: /
Алекс

Хе-хе, жодних проблем! Радий, що допомагає!
Джейк

Я схвалюю вашу відповідь, бо вона прекрасно працює, а моя - лише наближення. @PeyMan Дякую за щедрість, але не було відповідей, окрім моїх, коли вартість щедрості закінчилася. Кращі рішення завжди вітаються.
Антоніо Фальчіано

чи є спосіб поділити весь багатокутник шару Speicifc?
Мухаммед Файзан Хан

У мене є один шар і є кілька полігонів, я хочу розділити їх через кодування
Muhammad Faizan Khan

2

Гарне наближення до GDAL> = 1.10.0, складеного з SQLite та SpatiaLite, полягає в обгортанні ваших шарів (наприклад, poligon.shp та line.shp ) у файл OGR VRT (наприклад, шари.vrt ):

<OGRVRTDataSource>
    <OGRVRTlayer name="buffer_line">
        <SrcDataSource>line.shp</SrcDataSource>
        <SrcSQL dialect="sqlite">SELECT ST_Buffer(geometry,0.000001) from line</SrcSQL>
    </OGRVRTlayer>
    <OGRVRTlayer name="polygon">
        <SrcDataSource>polygon.shp</SrcDataSource>
    </OGRVRTlayer>
</OGRVRTDataSource>

щоб мати дуже маленький буфер (наприклад, 1 мкм) навколо line.shp отримуючи шар * buffer_line *. Тоді ми можемо застосувати симетричну різницю та різницю на цих геометріях за допомогою SpatiaLite:

ogr2ogr splitted_polygons.shp layers.vrt -dialect sqlite -sql "SELECT ST_Difference(ST_SymDifference(g1.geometry,g2.geometry),g2.geometry) FROM polygon AS g1, buffer_line AS g2" -explodecollections

Очевидно, що всі ці речі чудово виконуються із сценарію Python:

os.system("some_command with args")

Сподіваюся, це допомагає!


@Jake reshapeGeometry кидає виняток невідомої помилки. Отже, чи є інший спосіб перевірити перетин між полігоном та полілінією?
user99

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