Schnittkoordinaten zwischen Linie und Polygon

8

Ich arbeite mit Python, Shapely und Fiona ... Gibt es eine Möglichkeit, eine Eingabe für ein Linien-Shapefile und ein Polygon-Shapefile einzugeben und ein Ergebnis der Schnittpunkte und ihrer Koordinaten zu erhalten? Die Abbildung enthält eine genaue Beschreibung ....

Geben Sie hier die Bildbeschreibung ein

Akhil
quelle

Antworten:

7

Der Schnittpunkt eines Polygons und eines LineStrings ist ein LineString und der Schnittpunkt zweier LineStrings ist ein Punkt (oder MultiPoint). Sie müssen Ihr Polygon also in einen LineString umwandeln -> 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)

Wenn Sie viele Polygone und viele Polylinien haben:

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>
Gen
quelle
Kleinere Korrekturen im Code beinhalteten nur das Hinzufügen einer Klammer und die Korrektur der Variablen lring, die zuvor lring2 ohne eine solche Variable war ... Gut gemacht ... Ein einfacher Schreibbefehl mit fiona.open vervollständigt die Aufgabe ... Vielen Dank @gene
Akhil