Convertir des points XY en ligne?


12

Quelqu'un a par erreur enregistré une trace GPS en tant que points de cheminement, puis me les a envoyés dans un fichier .csv. Ils veulent une ligne en arrière (shapefile). Quelle est la méthode la plus simple pour convertir cela en ligne? Les outils disponibles sont Arcmap, gdal / ogr et qgis plus ou moins par ordre de préférence. Je préfère ne pas installer d'outil supplémentaire; un service de conversion en ligne serait acceptable.

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

Le fichier .csv avait quelques dizaines de lignes de données inutiles (messages de démarrage / arrêt du journal actif, etc.) dont je me suis débarrassé par l'opportunité de trier sur toutes les colonnes, puis de supprimer les lignes non-données qui flottaient vers le haut. Bête, je sais (il faut dormir plus!), Sinon le plugin qgis Point2one aurait probablement fonctionné, et les autres aussi. Grâce aux compétences en python de fmark, les deux erreurs peuvent être corrigées, bien que je doive attendre d'être de retour au bureau la semaine prochaine pour vérifier.
matt wilkie

Réponses:


23

Il semble que la chose cruciale que vous souhaitez ici soit que les points de la ligne soient triés par heure de capture, répartis sur trois lignes de colonne. Bien que vous puissiez organiser les données dans une feuille de calcul, je trouve souvent que l'écriture d'un script rapide offre la plus grande flexibilité:

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

Agréable! Garder celui-là.
Nathan W

c'est le meilleur tutoriel pour OGR, j'ai jamais vu
dassouki

8

Le plugin QGIS "Points2One" devrait être ce que vous recherchez.

Si vous ne cochez pas "Trier les points par ce champ", le plugin les connecte dans l'ordre interne des points dans la couche. J'ai utilisé votre échantillon, organisé les points dans un ordre en zigzag et cela a fonctionné comme prévu:

entrez la description de l'image ici


non, il correspond point à point en fonction de la latitude et non de la séquence temporelle, voir imgur.com/d2Ycg.jpg Peut-être qu'avec un massage du csv pour transformer les horodatages en 24 heures, cela pourrait mieux fonctionner
matt wilkie

Veuillez me dire où je peux télécharger le plugin points2one, s'il est toujours disponible. Je veux faire une ligne composée de points GPS et de points ajoutés manuellement (pour lisser les courbes).
Gray Shaw


3

ArcGIS 10.0 dispose d'un outil Points vers ligne .

Je recommande de lire la documentation d' ArcGIS 10.2 for Desktop , mais en résumé:

Crée des entités linéaires à partir de points.

...

Chaque entité dans la sortie sera basée sur des valeurs uniques dans le champ de ligne.

...

Par défaut, les points utilisés pour créer chaque entité de ligne de sortie seront utilisés dans l'ordre où ils sont trouvés. Si un ordre différent est souhaité, spécifiez un champ de tri.


C'était un outil utile pour moi. Il est important d'utiliser le champ de ligne ou le champ de tri pour bien faire les choses (cela dépend des attributs). Dans mon cas, j'ai dû utiliser l'option Champ de ligne (en utilisant uniquement le champ avec l'attribut date et non date + heure) pour que les données comprennent que chaque date a créé une nouvelle ligne.
Sue Deforest


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.