Mehr

Finden Sie den kürzesten Pfad zwischen Punkten und vermeiden Sie Shapefile?

Finden Sie den kürzesten Pfad zwischen Punkten und vermeiden Sie Shapefile?


Ich bin ein fortgeschrittene Python-Entwickler mit sehr begrenzter GIS-Erfahrung. Ich habe eine Liste der Breiten-/Längengrade eines Schiffes auf See. Ich muss sie zu einer Polylinie verbinden, indem ich den kürzesten Abstand zwischen ihnen verwende, um den Weg zu verfolgen, dem das Schiff folgt. Der Pfad kann jedoch nicht über Land führen (für das ich ein Shapefile habe). Wie kann ich das machen? Ich verwende Python 2.7.

Ich verwende derzeit keine GIS-Software und hoffe, die Aufgabe mit den Python-Modulen wie Matplotlib und Scipy zu erledigen.


Das klingt nach einem lustigen Problem. Ich würde in Betracht ziehen:

  1. Lesen Sie die Landgrenzen-shp-Datei mit einem dieser Rezepte: Wie installiere ich Fiona, um Shapefile-Attribute mit OSGeo4W zu lesen?. Es wäre wahrscheinlich gut, es in eine Shapely-Geometrie einzulesen. Ich verwende gerne ogr, um Shapefiles zu lesen:
import ogr import shapely driver = ogr.GetDriverByName('ESRI Shapefile') dataSource = driver.Open('landboundary.shp', 0) layer = dataSource.GetLayer() feature = layer[0] # first border geom = feature.GetGeometryRef () shapely.geometry.base.geom_from_wkt(geom.ExportToWkt())
  1. Verwenden Sie NetworkX, um ein Netzwerk aller Ihrer lat-langen Schiffskoordinaten zu erstellen, aber verbinden Sie keine Koordinaten, deren gerade Linienverbindung die Landgrenze schneidet. Hier ist ein Beispiel für die Schnittmenge von Geometrien: Shapely LineString und Polygon intersect?.

  2. Berechnen Sie dann den kostengünstigsten Pfad unter Verwendung von NetworkX mit der Entfernung als Kosten. Das LCP überquert kein Land, da diese Knoten nicht verbunden sind.

Nur zu Ihrer Information, formschöne Geometrien werden in WKT (bekannter Text, ein textbasiertes Format) wie folgt konvertiert.myShapelyGeometry.wkt, die sehr einfach und intuitiv zu analysieren und zu verwenden ist, wie Sie möchten.

Bearbeiten: Nur einige zusätzliche Informationen: Um den Abstand zwischen zwei lat-langen Koordinaten zu berechnen, können Sie pyproj verwenden:

import pyproj geod = pyproj.Geod(ellps='WGS84') _,_,distance = geod.inv(long_start,lat_start,long_end,lat_end)

Sie können auch ein networkx-Diagramm wie folgt starten:

import networkx graph = networkx.Graph() graph.add_edge('coord_a', 'coord_b', weight=distance) # weitere Kanten auf dieselbe Weise hinzufügen start_node = find_closest_node(graph, lat_start, long_start) end_node = find_closest_node(graph, lat_end , long_end) ship_path = networkx.shortest_path(graph, start_node, end_node)