Konversi poin XY ke garis?


12

Seseorang secara keliru menyimpan trek GPS sebagai titik arah dan kemudian mengirimkannya kepada saya dalam file .csv. Mereka menginginkan garis belakang (shapefile). Apa metode paling sederhana untuk mengonversikan ini menjadi satu baris? Alat yang tersedia adalah Arcmap, gdal / ogr dan qgis kurang lebih sesuai urutan pilihan. Saya lebih suka tidak menginstal alat tambahan; layanan konversi online akan baik-baik saja.

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 memiliki beberapa lusin baris data sampah (pesan mulai / berhenti log yang aktif, dll.) Yang saya singkirkan dengan cara menyortir semua kolom dan kemudian menghapus baris non-data yang mengambang ke atas. Bodoh, saya tahu (harus tidur lebih banyak!), Kalau tidak, plugin qgis Point2one kemungkinan akan bekerja, dan yang lainnya juga. Berkat keterampilan python fmark, kedua kesalahan dapat diperbaiki, meskipun saya harus menunggu sampai saya kembali ke kantor minggu depan untuk memverifikasi.
matt wilkie

Jawaban:


23

Sepertinya hal penting yang Anda inginkan di sini adalah agar titik-titik dalam garis diurutkan berdasarkan waktu penangkapan, tersebar di tiga baris kolom. Meskipun Anda dapat mengatur data dalam spreadsheet, saya sering menemukan penulisan skrip cepat memberikan fleksibilitas paling:

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

Bagus! Menyimpan yang itu.
Nathan W

ini adalah tutorial terbaik untuk OGR, yang pernah saya lihat
dassouki

8

Plugin QGIS "Points2One" harus menjadi apa yang Anda cari.

Jika Anda tidak mencentang "Urutkan poin berdasarkan bidang ini", plugin menghubungkannya dalam urutan titik internal di lapisan. Saya menggunakan sampel Anda, mengatur poin dalam urutan zig-zag dan itu berfungsi seperti yang diharapkan:

masukkan deskripsi gambar di sini


tidak, itu cocok dengan titik berdasarkan titik pada garis lintang dan bukan urutan waktu, lihat imgur.com/d2Ycg.jpg Mungkin dengan beberapa pijatan csv untuk mengubah cap waktu menjadi 24 jam itu mungkin bekerja lebih baik
matt wilkie

Tolong beritahu saya di mana saya dapat mengunduh plugin points2one, jika masih tersedia. Saya ingin membuat garis yang terdiri dari titik-titik GPS dan titik-titik yang ditambahkan secara manual (untuk memperlancar kurva).
Gray Shaw


3

ArcGIS 10.0 memiliki alat Points To Line .

Saya merekomendasikan membaca ArcGIS 10.2 untuk dokumentasi Desktop , tetapi dalam ringkasan:

Membuat fitur garis dari titik.

...

Setiap fitur dalam output akan didasarkan pada nilai unik di Field Line.

...

Secara default, titik yang digunakan untuk membuat setiap fitur garis output akan digunakan sesuai urutan yang ditemukan. Jika diinginkan urutan yang berbeda, tentukan Bidang Urutkan.


Ini adalah alat yang berguna bagi saya. Penting untuk menggunakan Bidang Baris atau Bidang Urutkan untuk memperbaikinya (tergantung pada atribut). Dalam kasus saya, saya harus menggunakan opsi Bidang Baris (hanya menggunakan bidang dengan atribut tanggal dan bukan tanggal + waktu) untuk data untuk memahami bahwa setiap tanggal membuat baris baru.
Sue Deforest


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.