Eu tenho uma camada de buffer (polígono verde) que quero dividir em dois polígonos sempre que cruzar uma barreira (linha azul). Eu tenho tentado usar o método "splitGeometry", mas simplesmente não consigo fazê-lo funcionar. Meu código até agora é este:
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)
Que retorna 1 para resultado (erro) e uma lista vazia para newGeometries. Qualquer ajuda é muito apreciada.
Respostas:
Você pode usar a
reshapeGeometry
função doQgsGeometry
objeto para isso, que corta um polígono ao longo de sua interseção com uma linha.A seguir, os polígonos do buffer serão cruzados com as linhas e os recursos de polígono dividido serão adicionados a uma camada de memória (sintaxe QGIS 2.0):
fonte
Uma boa aproximação com GDAL> = 1.10.0 compilada com SQLite e SpatiaLite consiste em agrupar suas camadas (por exemplo, poligon.shp e line.shp ) em um arquivo OGR VRT (por exemplo, layers.vrt ):
para ter um buffer muito pequeno (por exemplo, 1 mícron) em torno do line.shp, obtendo a camada * buffer_line *. Em seguida, podemos aplicar diferença simétrica e diferença nessas geometrias usando o SpatiaLite:
Obviamente, tudo isso é perfeitamente executável a partir de um script Python:
Espero que isto ajude!
fonte
A resposta de Jake tem problemas topológicos com os polígonos divididos. Eu fiz uma solução, espero que isso possa ajudar: https://gist.github.com/RamonLopezEscudero/844c1401f5339143da1b2b5cf7ff27bd
fonte