将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的python技能,这两个错误都可以纠正,尽管我必须等到下周回到办公室进行验证。
马特·威尔基

Answers:


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 2011年

8

QGIS插件“ Points2One”应该是您想要的。

如果您未勾选“按此字段排序点”,则插件将以图层中的内部点顺序将它们连接起来。我使用了您的样本,以锯齿形顺序排列了点,并且按预期方式工作:

在此处输入图片说明


是的,它基于纬度而不是时间顺序来匹配点对点,请参见imgur.com/d2Ycg.jpg也许可以通过对csv进行一些按摩来将时间戳转换为24小时,效果可能会更好
matt wilkie 2010年

请告诉我在哪里可以下载points2one插件(如果仍然可用)。我想制作一条由GPS点和手动添加的点组成的线(以平滑曲线)。
萧逸夫(Gray Shaw)2012年


3

ArcGIS 10.0具有指向线的工具。

我建议阅读ArcGIS 10.2 for Desktop文档,但总而言之:

从点创建线要素。

...

输出中的每个要素都将基于“线字段”中的唯一值。

...

默认情况下,将按照找到它们的顺序使用用于创建每个输出线要素的点。如果需要其他顺序,请指定“排序字段”。


对我来说这是一个有用的工具。重要的是使用“行字段”或“排序字段”使其正确(取决于属性)。就我而言,我必须对数据使用“行字段”选项(仅使用具有日期属性的字段,而不使用日期和时间),以了解每个日期都创建了新行。
Sue Deforest


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.