2014-06-25 12 views
15

C'è una polilinea con un elenco di coordinate dei vertici = [(x1, y1), (x2, y2), (x3, y3), ...] e un punto (x, y). In Shapely, geometry1.distance(geometry2) restituisce la distanza più breve tra le due geometrie.Coordinate del punto più vicino su una linea

>>> 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 

Ma ho anche bisogno di trovare la coordinata del punto sulla linea che è più vicino al punto (x, y). Nell'esempio sopra, questa è la coordinata del punto sull'oggetto LineString che è l'unità 1.4142135623730951 distante da Point (4,8). La distanza metodo() dovrebbe avere le coordinate quando si calcola la distanza. C'è un modo per ottenere restituito da questo metodo?

risposta

15

Il termine GIS che si sta descrivendo è linear referencing e 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

breve nota per chiunque possa essere seguendo posta: 'line.project (p)' misure punto di proiezione lungo la linea dalla partenza nodo coordinata dato nell'argomento del metodo LineString(). Ma 'np = line.interpolate (line.project (p))' fornisce il PUNTO (5 7) come in coordinate globali, non dall'inizio della linea. Qui la linea è iniziata da (0,0). Quindi potrebbe essere fonte di confusione. –