Chuyển đổi điểm XY thành một dòng?


12

Ai đó đã lưu nhầm bản nhạc GPS thành điểm tham chiếu và sau đó gửi chúng cho tôi trong tệp .csv. Họ muốn một dòng trở lại (shapefile). Phương pháp đơn giản nhất để chuyển đổi nó thành một dòng là gì? Các công cụ có sẵn là Arcmap, gdal / ogr và qgis nhiều hơn hoặc ít hơn theo thứ tự ưu tiên. Tôi không muốn cài đặt một công cụ bổ sung; một dịch vụ chuyển đổi trực tuyến sẽ ổn.

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 có vài chục hàng dữ liệu rác (thông báo bắt đầu / dừng nhật ký hoạt động, v.v.) mà tôi đã loại bỏ bằng cách sắp xếp trên tất cả các cột và sau đó xóa các hàng không dữ liệu nổi lên trên cùng. Câm, tôi biết (phải ngủ nhiều hơn!), Nếu không, plugin qgis Point2one có thể đã hoạt động, và những người khác cũng vậy. Nhờ kỹ năng trăn của fmark, cả hai lỗi đều có thể được sửa chữa, mặc dù tôi phải đợi cho đến khi tôi trở lại văn phòng vào tuần tới để xác minh.
matt wilkie

Câu trả lời:


23

Có vẻ như điều quan trọng mà bạn muốn ở đây là các điểm trong dòng được sắp xếp theo thời gian chụp, trải đều trên ba hàng cột. Mặc dù bạn có thể sắp xếp dữ liệu trong bảng tính, tôi thường thấy việc viết một tập lệnh nhanh cung cấp sự linh hoạt nhất:

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

Đẹp! Giữ cái đó
Nathan W

đây là hướng dẫn tốt nhất về OGR, tôi từng thấy
dassouki

8

Plugin QGIS "Points2One" sẽ là thứ bạn đang tìm kiếm.

Nếu bạn không đánh dấu vào "Sắp xếp điểm theo trường này", plugin sẽ kết nối chúng theo thứ tự điểm nội bộ trong lớp. Tôi đã sử dụng mẫu của bạn, sắp xếp các điểm theo thứ tự ngoằn ngoèo và nó hoạt động như mong đợi:

nhập mô tả hình ảnh ở đây


Không, nó khớp điểm này dựa trên vĩ độ và không theo chuỗi thời gian, xem imgur.com/d2Ycg.jpg Có lẽ với một số thao tác của csv để biến dấu thời gian thành 24 giờ, nó có thể hoạt động tốt hơn
matt wilkie

Vui lòng cho tôi biết nơi tôi có thể tải xuống plugin points2one, nếu nó vẫn khả dụng. Tôi muốn tạo một đường bao gồm các điểm GPS và các điểm được thêm thủ công (để làm mịn các đường cong).
Grey Shaw


3

ArcGIS 10.0 có công cụ Points To Line .

Tôi khuyên bạn nên đọc tài liệu ArcGIS 10.2 cho Máy tính để bàn , nhưng tóm lại:

Tạo các tính năng dòng từ các điểm.

...

Mỗi tính năng trong đầu ra sẽ dựa trên các giá trị duy nhất trong Trường Dòng.

...

Theo mặc định, các điểm được sử dụng để tạo từng tính năng dòng đầu ra sẽ được sử dụng theo thứ tự chúng được tìm thấy. Nếu muốn một thứ tự khác, chỉ định Trường sắp xếp.


Đây là một công cụ hữu ích cho tôi. Điều quan trọng là sử dụng Trường Dòng hoặc Trường Sắp xếp để làm cho đúng (tùy thuộc vào thuộc tính). Trong trường hợp của tôi, tôi đã phải sử dụng tùy chọn Trường Dòng (chỉ sử dụng trường có thuộc tính ngày và không phải ngày + giờ) để dữ liệu hiểu rằng mỗi ngày tạo ra một dòng mới.
Sue Deforest


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.