Convertire i punti XY in una linea?


12

Qualcuno ha erroneamente salvato una traccia GPS come waypoint e poi me li ha inviati in un file .csv. Vogliono una riga indietro (shapefile). Qual è il metodo più semplice per convertirlo in una linea? Gli strumenti disponibili sono Arcmap, gdal / ogr e qgis più o meno in ordine di preferenza. Preferirei non installare uno strumento aggiuntivo; un servizio di conversione online andrebbe bene.

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

Il .csv aveva alcune dozzine di file di dati inutili (messaggi di avvio / arresto del registro attivi ecc.) Di cui mi sono liberato dall'espediente di ordinare su tutte le colonne e quindi eliminare le righe non di dati che fluttuavano verso l'alto. Stupido, lo so (devo dormire di più!), Altrimenti il ​​plugin qgis Point2one avrebbe probabilmente funzionato, e anche gli altri. Grazie alle abilità di pitone di fmark entrambi gli errori possono essere corretti, anche se devo aspettare fino alla prossima settimana per verificare.
Matt Wilkie,

Risposte:


23

Sembra che la cosa cruciale che vuoi qui sia che i punti nella linea vengano ordinati in base al momento della cattura, distribuiti su tre file di colonne. Mentre potresti organizzare i dati in un foglio di calcolo, trovo spesso che scrivere uno script rapido offra la massima flessibilità:

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

Bello! Mantenerlo.
Nathan W

questo è il miglior tutorial di OGR che abbia mai visto
dassouki,

8

Il plug-in QGIS "Points2One" dovrebbe essere quello che stai cercando.

Se non selezioni "Ordina punti per questo campo", il plug-in li collega nell'ordine dei punti interno nel livello. Ho usato il tuo campione, ho sistemato i punti in un ordine a zigzag e ha funzionato come previsto:

inserisci qui la descrizione dell'immagine


no, corrisponde da punto a punto in base alla latitudine e non alla sequenza temporale, vedi imgur.com/d2Ycg.jpg Forse con un po 'di massaggio del CSV per trasformare i timestamp in 24 ore potrebbe funzionare meglio
matt wilkie

Per favore, dimmi dove posso scaricare il plug-in points2one, se è ancora disponibile. Voglio creare una linea composta da punti GPS e punti aggiunti manualmente (per appianare le curve).
Grey Shaw,


3

ArcGIS 10.0 ha uno strumento Punti per linea .

Consiglio di leggere la documentazione di ArcGIS 10.2 per desktop , ma in sintesi:

Crea funzioni di linea da punti.

...

Ogni funzione nell'output si baserà su valori univoci nel campo Linea.

...

Per impostazione predefinita, i punti utilizzati per creare ciascuna funzione della linea di output verranno utilizzati nell'ordine in cui sono stati trovati. Se si desidera un ordine diverso, specificare un campo di ordinamento.


Questo è stato uno strumento utile per me. È importante utilizzare il campo Linea o il campo Ordina per farlo correttamente (dipende dagli attributi). Nel mio caso ho dovuto usare l'opzione Campo linea (usando solo il campo con l'attributo data e non data + ora) per capire che ogni data ha creato una nuova linea.
Sue Deforest,


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.