Coordonnées d'intersection de lignes et de polygones

8

Je travaille avec Python, Shapely et Fiona ... Existe-t-il un moyen de donner une entrée d'un fichier de formes de ligne et d'un fichier de formes de polygone, et d'obtenir un résultat des points d'intersection et de leurs coordonnées? L'illustration fournit une description précise ....

entrez la description de l'image ici

Akhil
la source

Réponses:

7

L'intersection d'un polygone et d'un LineString est un LineString et l'intersection de deux LineStrings est un point (ou MultiPoint), vous devez donc transformer votre polygone en un 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)

Si vous avez plusieurs polygones et plusieurs polylignes:

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>
gène
la source
Des corrections mineures dans le code incluaient seulement l'ajout d'une accolade et la correction de la variable lring qui était auparavant lring2 sans aucune de ces variables ... Bon à faire ... Une simple commande d'écriture utilisant fiona.open termine la tâche ... Merci @gene
Akhil