Преобразовать 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()
fmark
источник
Ницца! Держу это.
Натан W
это лучший урок для OGR, который я когда-либо видел
dassouki
8

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

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

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

Подземье
источник
Нет, это соответствует пункту к точке на основе широты, а не временной последовательности, см. imgur.com/d2Ycg.jpg Возможно, с некоторым массажем csv, чтобы превратить метки времени в 24
часа,
Скажите, пожалуйста, где я могу скачать плагин points2one, если он еще доступен. Я хочу сделать линию, состоящую из точек GPS и точек, добавленных вручную (чтобы сгладить кривые).
Серый Шоу
Нашел это: pyqgis.org/repo/contributed
Grey Shaw
3

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

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

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

...

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

...

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

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

Если на вашем компьютере с ArcMap установлена ​​программа ETGeoWizards , это тоже с ней справится.

Дон мельц
источник
1

Бесплатное расширение GME ArcGIS предоставляет convert.pointstolines, который создаст одну линию из точечного слоя.

SCW
источник