2014-06-25 11 views
15

Es gibt eine Polylinie mit einer Liste von Koordinaten der Ecken = [(x1, y1), (x2, y2), (x3, y3), ...] und einem Punkt (x, y). In Shapely gibt geometry1.distance(geometry2) den kürzesten Abstand zwischen den beiden Geometrien zurück.Koordinate des nächsten Punktes einer Linie

>>> from shapely.geometry import LineString, Point 
>>> line = LineString([(0,0),(5,7),(12,6)])   #geometry2 
>>> list(line.coords) 
[(0.0, 0.0), (5.0, 7.0), (12.0, 6.0)] 
>>> p = Point(4,8)  #geometry1 
>>> list(p.coords) 
[(4.0, 8.0)] 
>>> p.distance(line) 
1.4142135623730951 

Aber ich muß auch die Koordinaten des Punktes auf der Linie finden, der am nächsten zu dem Punkt (x, y) ist. Im obigen Beispiel ist dies die Koordinate des Punkts auf dem LineString-Objekt, der 1,4142135623730951 Einheit entfernt von Punkt (4,8) ist. Die Methode distance() sollte die Koordinaten bei der Berechnung der Entfernung haben. Gibt es einen Weg, um es von dieser Methode zurück zu bekommen?

Antwort

15

Der GIS-Ausdruck, den Sie beschreiben, ist linear referencing und Shapely has these methods.

# Length along line that is closest to the point 
print(line.project(p)) 

# Now combine with interpolated point on line 
np = line.interpolate(line.project(p)) 
print(np) # POINT (5 7) 
+5

kurze Nachricht für alle, die den Posten werden folgende könnte: 'line.project (p)' Maßnahmen der Projektionspunkt entlang der Linie vom Startknoten-Koordinate in dem Argument von Linestring() -Methode angegeben. Aber 'np = line.interpolate (line.project (p))' gibt den POINT (5 7) wie in globalen Koordinaten, nicht vom Anfang der Zeile. Hier begann die Linie von (0,0). Es könnte also verwirrend sein. –