¿Convertir puntos XY en una línea?

12

Alguien guardó por error una pista GPS como waypoints y luego me los envió en un archivo .csv. Quieren una línea de fondo (shapefile). ¿Cuál es el método más simple para convertir esto en una línea? Las herramientas disponibles son Arcmap, gdal / ogr y qgis más o menos en orden de preferencia. Prefiero no instalar una herramienta adicional; un servicio de conversión en línea estaría bien.

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,,,,,
wilkie mate
fuente
El .csv tenía unas pocas docenas de filas de datos basura (mensajes de inicio / parada de registro activo, etc.) que eliminé por el expediente de ordenar en todas las columnas y luego eliminar filas que no eran de datos que flotaban en la parte superior. Tonto, lo sé (¡debe dormir más!), De lo contrario el plugin qgis Point2one probablemente habría funcionado, y los demás también. Gracias a las habilidades de python de fmark, ambos errores pueden rectificarse, aunque tengo que esperar hasta que vuelva a la oficina la próxima semana para verificar.
Matt wilkie

Respuestas:

23

Parece que lo crucial que desea aquí es que los puntos en la línea se ordenen por el momento de la captura, distribuidos en tres filas de columnas. Si bien podría organizar los datos en una hoja de cálculo, a menudo encuentro que escribir un script rápido proporciona la mayor flexibilidad:

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
fuente
¡Agradable! Manteniendo ese.
Nathan W
Este es el mejor tutorial para OGR, que he visto nunca
dassouki
8

El complemento QGIS "Points2One" debería ser lo que estás buscando.

Si no marca "Ordenar puntos por este campo", el complemento los conecta en el orden interno de puntos en la capa. Usé su muestra, ordené los puntos en orden de zigzag y funcionó como se esperaba:

ingrese la descripción de la imagen aquí

bajo oscuro
fuente
no, coincide con el punto a punto basado en la latitud y no en la secuencia de tiempo, vea imgur.com/d2Ycg.jpg Quizás con algún masaje del csv para convertir las marcas de tiempo en 24 horas podría funcionar mejor
matt wilkie
Dígame dónde puedo descargar el complemento points2one, si aún está disponible. Quiero hacer una línea compuesta de puntos GPS y puntos añadidos manualmente (para suavizar las curvas).
Gray Shaw
Lo encontré: pyqgis.org/repo/contributed
Gray Shaw
3

ArcGIS 10.0 tiene una herramienta de Puntos a línea .

Recomiendo leer la documentación de ArcGIS 10.2 for Desktop , pero en resumen:

Crea entidades de línea a partir de puntos.

...

Cada característica en la salida se basará en valores únicos en el campo de línea.

...

De manera predeterminada, los puntos utilizados para crear cada entidad de línea de salida se utilizarán en el orden en que se encuentran. Si se desea un orden diferente, especifique un campo de clasificación.

PolyGeo
fuente
Esta fue una herramienta útil para mí. Es importante usar el campo de línea o el campo de clasificación para hacerlo bien (depende de los atributos). En mi caso, tuve que usar la opción Campo de línea (usando solo el campo con el atributo de fecha y no fecha + hora) para que los datos entiendan que cada fecha creó una nueva línea.
Sue Deforest
1

Si tiene ETGeoWizards instalado en su máquina ArcMap, eso también lo manejará.

Don Meltz
fuente