Перетворити точки XY на рядок?


12

Хтось помилково зберег GPS-доріжку як точкові точки, а потім надіслав їх мені у файл .csv. Вони хочуть повернути рядок (shapefile). Який найпростіший метод перетворити це на рядок? Доступними інструментами є Arcmap, gdal / ogr та qgis в більшій чи меншій кількості в порядку уподобання. Я б краще не встановлював додатковий інструмент; послуга онлайн-перетворення була б гаразд.

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

У .csv було кілька десятків рядків даних про сміття (активні повідомлення про початок / зупинку журналу тощо), яких я позбувся доцільним сортуванням у всіх стовпцях, а потім видаленням рядків без даних, які пливли на вершину. Дурний, я знаю (треба більше спати!), Інакше плагін qgis Point2one, ймовірно, спрацював би і інші. Завдяки майстерності пітона на fmark можна виправити обидві помилки, хоча мені доведеться чекати, поки я знову в офісі наступного тижня, щоб перевірити.
matt wilkie

Відповіді:


23

Здається, що вирішальне, що ви хочете тут, полягає в тому, щоб точки в рядку були відсортовані за часом зйомки, розподілені по трьох рядках стовпців. Хоча ви можете впорядкувати дані в електронній таблиці, я часто вважаю, що написання швидкого сценарію забезпечує найбільшу гнучкість:

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

Приємно! Зберігаючи це.
Nathan W

це найкращий підручник з ОГР, який я коли-небудь бачив
dassouki

8

QGIS плагін "Points2One" повинен бути тим, що ви шукаєте.

Якщо не поставити галочку "Сортувати точки за цим полем", плагін з'єднує їх у внутрішньому порядку точок у шарі. Я використав ваш зразок, розташував точки в зигзагоподібному порядку, і він працював так, як очікувалося:

введіть тут опис зображення


Нео, це відповідає точці на точку на основі широти і не тимчасова послідовності, см imgur.com/d2Ycg.jpg Можливо , з деякими масажем CSV , щоб перетворити часові в 24 годину він може працювати краще
матові Уїлкі

Скажіть, будь ласка, де я можу завантажити плагін point2one, якщо він ще доступний. Я хочу зробити лінію, що складається з GPS-точок і доданих точок вручну (щоб згладити криві).
Сірий Шоу


3

У ArcGIS 10.0 є інструмент " Вказівки на лінію" .

Я рекомендую прочитати ArcGIS 10.2 для документації на робочий стіл , але коротко:

Створює функції ліній з точок.

...

Кожна функція у висновку буде базуватися на унікальних значеннях у рядку поля.

...

За замовчуванням бали, які використовуються для створення кожної функції вихідного рядка, будуть використовуватися в тому порядку, в якому вони знайдені. Якщо потрібно інше замовлення, вкажіть Поле сортування.


Це був корисний інструмент для мене. Важливо використовувати Поле рядка або Сортувати поле, щоб правильно його встановити (залежить від атрибутів). У моєму випадку мені довелося використовувати параметр Поле рядка (використовуючи лише поле з атрибутом дати, а не датою + часом), щоб дані зрозуміли, що кожна дата створює новий рядок.
Ліс Сью


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.