Konwertuj punkty XY na linię?


12

Ktoś przez pomyłkę zapisał ślad GPS jako punkty trasy, a następnie przesłał mi go w pliku .csv. Chcą linii z powrotem (plik kształtu). Jaka jest najprostsza metoda przekonwertowania tego na linię? Dostępne narzędzia to Arcmap, gdal / ogr i qgis mniej więcej w kolejności preferencji. Wolałbym nie instalować dodatkowego narzędzia; usługa konwersji online byłaby w porządku.

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

Plik .csv zawierał kilkadziesiąt wierszy śmieciowych danych (komunikaty uruchamiania / zatrzymywania dziennika aktywnego itp.), Których pozbyłem się przez celowe sortowanie we wszystkich kolumnach, a następnie usuwanie wierszy niebędących danymi, które przesunęły się na górę. Głupi, wiem (muszę więcej spać!), W przeciwnym razie wtyczka qgis Point2one prawdopodobnie zadziałałaby, podobnie jak inne. Dzięki umiejętnościom Pythona fmark oba błędy można naprawić, choć muszę czekać, aż wrócę do biura w przyszłym tygodniu, aby to zweryfikować.
matt wilkie

Odpowiedzi:


23

Wygląda na to, że kluczową rzeczą, jaką chcesz tutaj, jest sortowanie punktów w linii według czasu przechwycenia, rozłożonych na trzy rzędy kolumn. Chociaż możesz uporządkować dane w arkuszu kalkulacyjnym, często pisanie szybkiego skryptu zapewnia największą elastyczność:

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

Ładny! Trzymanie tego.
Nathan W

to najlepszy poradnik do OGR, jaki kiedykolwiek widziałem
dassouki

8

Wtyczka QGIS „Points2One” powinna być tym, czego szukasz.

Jeśli nie zaznaczysz „Sortuj punkty według tego pola”, wtyczka łączy je w wewnętrznej kolejności punktów w warstwie. Użyłem twojej próbki, ułożyłem punkty w zygzakowatej kolejności i zadziałało zgodnie z oczekiwaniami:

wprowadź opis zdjęcia tutaj


Nie, to pasuje do punktu do punktu na podstawie szerokości i nie sekwencji czasowej, zobacz imgur.com/d2Ycg.jpg Może z jakiegoś masażu csv, aby włączyć znaczniki czasu na 24 godziny na dobę może działać lepiej
matowy Wilke

Poinformuj mnie, gdzie mogę pobrać wtyczkę points2one, jeśli nadal jest dostępna. Chcę utworzyć linię złożoną z punktów GPS i ręcznie dodanych punktów (aby wygładzić krzywe).
Gray Shaw,


3

ArcGIS 10.0 ma narzędzie Punkty do linii .

Polecam przeczytać dokumentację ArcGIS 10.2 dla komputerów stacjonarnych , ale w podsumowaniu:

Tworzy obiekty liniowe z punktów.

...

Każda funkcja w danych wyjściowych będzie oparta na unikalnych wartościach w polu linii.

...

Domyślnie punkty użyte do utworzenia każdego elementu linii wyjściowej zostaną użyte w kolejności ich znalezienia. Jeśli pożądana jest inna kolejność, określ pole sortowania.


To było dla mnie przydatne narzędzie. Ważne jest, aby użyć pola linii lub pola sortowania, aby uzyskać prawidłowe wyniki (w zależności od atrybutów). W moim przypadku musiałem użyć opcji Pole linii (używając tylko pola z atrybutem daty, a nie daty + godziny), aby zrozumieć, że każda data tworzy nową linię.
Sue Deforest


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.