Coordenadas de interseção de linha vs. polígono

8

Estou trabalhando com Python, Shapely e Fiona ... Existe alguma maneira de fornecer uma entrada de um shapefile de linha e um shapefile de polígono e obter um resultado dos pontos de interseção e suas coordenadas? A ilustração fornece uma descrição precisa ....

insira a descrição da imagem aqui

Akhil
fonte

Respostas:

7

A interseção de um polígono e uma LineString é uma LineString e a interseção de duas LineStrings é um Point (ou MultiPoint); portanto, você precisa transformar seu polígono em um LineString -> Shapely: LinearRings

from shapely.geometry import shape
import fiona
# polygon layer
poly = fiona.open("polygons.shp")
# line layer
line = fiona.open("lines.shp")
# First Feature of the shapefiles
s_poly = shape(poly.next()['geometry'])
s_line = shape(line.next()['geometry'])
print s_poly.intersection(s_line)
LINESTRING (360.4742985178883 -286.9847328244275, 450.1982781776156 -140.6494330268984)
# transform the polygon into a LineString
ring = LineString(list(s_poly.exterior.coords))
print ring.intersection(line)
MULTIPOINT (360.4742985178883 -286.9847328244275, 450.1982781776156 
# or, more formal
from shapely.geometry.polygon import LinearRing
lring = LinearRing(list(s_poly.exterior.coords))
print lring.intersection(s_line)
MULTIPOINT (360.4742985178883 -286.9847328244275, 450.1982781776156 -140.6494330268984)

Se você tiver muitos polígonos e muitas polilinhas:

Multi_pol_ext = MultiLineString([list(shape(pol['geometry']).exterior.coords) for pol in fiona.open("polygons.shp")])
Multi_lines = MultiLineString([shape(line['geometry']) for line in fiona.open("lines.shp")])
Multi_pol_ext.intersection(Multi_lines)
<shapely.geometry.multipoint.MultiPoint object at 0x1091a5210>
gene
fonte
As pequenas correções no código incluíram apenas uma adição de chaves e correções da variável lring que anteriormente era lring2 sem essa variável ... Bom ... Um bom comando de gravação usando fiona.open conclui a tarefa ... Obrigado @gene
Akhil