Преобразовать XY точки в линию?


12

Кто-то по ошибке сохранил трек GPS как путевые точки, а затем отправил их мне в файл .csv. Они хотят линию назад (шейп-файл). Какой самый простой способ преобразовать это в строку? Доступными инструментами являются 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 в Python обе ошибки могут быть исправлены, хотя мне нужно подождать, пока я вернусь в офис на следующей неделе, чтобы проверить.
Мэтт Уилки

Ответы:


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

Ницца! Держу это.
Натан W

это лучший урок для OGR, который я когда-либо видел
dassouki

8

Плагин QGIS «Points2One» должен быть тем, что вы ищете.

Если вы не отметите «Сортировать точки по этому полю», плагин соединит их во внутреннем порядке точек в слое. Я использовал ваш пример, расставил точки в зигзагообразном порядке, и все заработало, как и ожидалось:

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


Нет, это соответствует пункту к точке на основе широты, а не временной последовательности, см. imgur.com/d2Ycg.jpg Возможно, с некоторым массажем csv, чтобы превратить метки времени в 24
часа,

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


3

ArcGIS 10.0 имеет инструмент « Точки на линию» .

Я рекомендую прочитать документацию по ArcGIS 10.2 for Desktop , но вкратце:

Создает линейные объекты из точек.

...

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

...

По умолчанию точки, используемые для создания каждого выходного линейного объекта, будут использоваться в порядке их нахождения. Если требуется другой порядок, укажите поле сортировки.


Это был полезный инструмент для меня. Важно использовать поле линии или поле сортировки, чтобы получить его правильно (зависит от атрибутов). В моем случае мне пришлось использовать опцию «Поле строки» (используя только поле с атрибутом даты, а не дата + время), чтобы понять, что каждая дата создает новую строку.
Сью Deforest


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.