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

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

¡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í


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


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.


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


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.