XY-Punkte in eine Linie konvertieren?

12

Jemand hat versehentlich einen GPS-Track als Wegpunkte gespeichert und diese dann in einer CSV-Datei an mich gesendet. Sie wollen eine Zeile zurück (Shapefile). Was ist die einfachste Methode, um dies in eine Zeile umzuwandeln? Die verfügbaren Werkzeuge sind Arcmap, GDAL / OGR und QGIS, mehr oder weniger in der Reihenfolge ihrer Präferenz. Ich möchte lieber kein zusätzliches Tool installieren. Ein Online-Konvertierungsdienst wäre in Ordnung.

Latitude,Longitude,Date,Time,ampm,,,
60.71586,-135.07476,25/07/2010,9:26:15,PM,,,,,
60.71637,-135.07563,25/07/2010,9:26:12,PM,,,,,
60.71648,-135.07612,25/07/2010,9:26:11,PM,,,,,
60.71664,-135.07707,25/07/2010,9:26:09,PM,,,,,
60.71672,-135.07756,25/07/2010,9:26:08,PM,,,,,
Matt Wilkie
quelle
Die CSV-Datei enthielt ein paar Dutzend Zeilen mit Datenmüll (Start / Stopp-Meldungen für aktive Protokolle usw.), die ich durch Sortieren aller Spalten und anschließendes Löschen von Nicht-Datenzeilen, die nach oben verschoben wurden, entfernt habe. Dumm, ich weiß (muss mehr schlafen!), Sonst hätte das qgis Point2one-Plugin wahrscheinlich funktioniert, und die anderen auch. Dank der Python-Fähigkeiten von fmark können beide Fehler behoben werden, obwohl ich warten muss, bis ich nächste Woche wieder im Büro bin, um zu überprüfen.
Matt Wilkie

Antworten:

23

Es scheint das Entscheidende, was Sie hier wollen, zu sein, dass die Punkte in der Linie nach dem Zeitpunkt der Erfassung sortiert werden, verteilt auf drei Spaltenreihen. Während Sie die Daten in einer Tabelle organisieren konnten, finde ich häufig, dass das Schreiben eines schnellen Skripts die größte Flexibilität bietet:

import csv
from datetime import datetime
try:
    from osgeo import ogr
except ImportError:
    import ogr

SHP_FILENAME = "output.shp"
CSV_FILENAME = "input.csv"

r = csv.reader(open(CSV_FILENAME, 'r'), delimiter=',', quotechar=None)
header = dict(((str, i) for i, str in enumerate(r.next())))

# load data rows into memory
rows = [row for row in r]

# sort by date and time ascending
rows.sort(key=lambda row: datetime.strptime(
        (row[header['Date']] + ' ' + row[header['Time']] + ' ' + 
         row[header['ampam']]), 
        '%d/%m/%Y %I:%M:%S %p'))

# Create new shapefile
ogr.UseExceptions()
ds = ogr.GetDriverByName('ESRI Shapefile').CreateDataSource(SHP_FILENAME)
layer = ds.CreateLayer("data", None, ogr.wkbLineString)

# Create a new line geometry
line = ogr.Geometry(type=ogr.wkbLineString)

# Add GPS points to line
lon_idx, lat_idx = header['Longitude'], header['Latitude']
for row in rows:
    line.AddPoint(float(row[lon_idx]), float(row[lat_idx]))

# Add line as a new feature to the shapefile
feature = ogr.Feature(feature_def=layer.GetLayerDefn())
feature.SetGeometryDirectly(line)
layer.CreateFeature(feature)

# Cleanup
feature.Destroy()
ds.Destroy()
fmark
quelle
Nett! Den behalten.
Nathan W
Dies ist das beste Tutorial zu OGR, das ich je gesehen habe
dassouki
8

QGIS Plugin "Points2One" sollte das sein, wonach Sie suchen.

Wenn Sie "Punkte nach diesem Feld sortieren" nicht ankreuzen, verbindet das Plugin sie in der internen Punktreihenfolge in der Ebene. Ich habe Ihr Beispiel verwendet, die Punkte in einer Zick-Zack-Reihenfolge angeordnet und es hat wie erwartet funktioniert:

Bildbeschreibung hier eingeben

Underdunkel
quelle
Nö, sie paßt Punkt zu Punkt basierend auf Breite und nicht die zeitlichen Abfolge, siehe imgur.com/d2Ycg.jpg Vielleicht mit etwas Massage der csv der Zeitstempel in 24 - Stunden drehen sie besser funktionieren könnten
matt wilkie
Bitte teilen Sie mir mit, wo ich das points2one-Plugin herunterladen kann, falls es noch verfügbar ist. Ich möchte eine Linie aus GPS-Punkten und manuell hinzugefügten Punkten erstellen (um die Kurven zu glätten).
Grey Shaw
Gefunden: pyqgis.org/repo/contributed
Grey Shaw
3

ArcGIS 10.0 verfügt über ein Werkzeug " Punkte zu Linie" .

Ich empfehle, die Dokumentation zu ArcGIS 10.2 for Desktop zu lesen , aber zusammenfassend:

Erstellt Linienobjekte aus Punkten.

...

Jedes Merkmal in der Ausgabe basiert auf eindeutigen Werten im Linienfeld.

...

Standardmäßig werden die zum Erstellen der einzelnen Ausgabezeilen-Features verwendeten Punkte in der Reihenfolge verwendet, in der sie gefunden wurden. Wenn eine andere Reihenfolge gewünscht wird, geben Sie ein Sortierfeld an.

PolyGeo
quelle
Dies war ein nützliches Werkzeug für mich. Es ist wichtig, das Linienfeld oder das Sortierfeld zu verwenden, um es richtig zu machen (abhängig von den Attributen). In meinem Fall musste ich die Option Linienfeld verwenden (nur das Feld mit dem Datumsattribut und nicht Datum + Uhrzeit), damit die Daten verstehen, dass mit jedem Datum eine neue Linie erstellt wurde.
Sue Deforest