XY puanları bir satıra dönüştürülsün mü?


12

Birisi yanlışlıkla bir GPS parkurunu ara nokta olarak kaydetti ve sonra bunları bir .csv dosyasında bana gönderdi. Bir çizgi geri istiyorlar (şekil dosyası). Bunu bir satıra dönüştürmenin en basit yöntemi nedir? Mevcut araçlar, tercih sırasına göre az ya da çok Arcmap, gdal / ogr ve qgis'dir. Ek bir araç kurmamayı tercih ederim; bir çevrimiçi dönüşüm hizmeti iyi olur.

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, tüm sütunlarda sıralama ve daha sonra üste yüzen veri olmayan satırları silmekten kurtuldum birkaç düzine çöp veri (aktif günlük başlatma / durdurma iletileri vb.) Vardı. Aptal, biliyorum (daha fazla uyku almalıyım!), Aksi takdirde qgis Point2one eklentisi muhtemelen işe yarardı ve diğerleri de. Fmark'ın python becerileri sayesinde her iki hata düzeltilebilir, ancak doğrulamak için önümüzdeki hafta ofise dönene kadar beklemek zorundayım.
matt wilkie

Yanıtlar:


23

Burada istediğiniz en önemli şey, satırdaki noktaların yakalama zamanına göre sıralanması ve üç sütun sırasına yayılması gibi görünüyor. Bir e-tabloda verileri düzenleyebilmenize rağmen, çoğu zaman hızlı bir komut dosyası yazmanın en esnekliği sağladığını görüyorum:

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

Güzel! Bunu saklıyorum.
Nathan W

Bu şimdiye kadar gördüğüm OGR için en iyi öğretici
dassouki

8

QGIS Eklentisi "Points2One" aradığınız şey olmalıdır.

"Noktaları bu alana göre sırala" seçeneğini işaretlemezseniz, eklenti bunları katmandaki dahili nokta sırasıyla bağlar. Numunenizi kullandım, noktaları zikzak düzeninde düzenledim ve beklendiği gibi çalıştı:

resim açıklamasını buraya girin


hayır, bunu görmek, enlem ve zaman dizisi dayalı gelin maçları imgur.com/d2Ycg.jpg Belki daha iyi çalışabilir 24 hr içine damgaları açmak için csv bazı masaj ile
mat Wilkie

Lütfen hala mevcutsa points2one eklentisini nereden indirebileceğimi söyle. GPS noktalarından ve manuel olarak eklenen noktalardan oluşan bir çizgi yapmak istiyorum (eğrileri düzeltmek için).
Grey Shaw


3

ArcGIS 10.0 Bir sahiptir Hattı için Noktalar aracı.

Masaüstü belgeleri için ArcGIS 10.2'yi okumanızı , ancak özet olarak öneririm :

Noktalardan çizgi özellikleri oluşturur.

...

Çıktıdaki her özellik, Çizgi Alanındaki benzersiz değerlere dayalı olacaktır.

...

Varsayılan olarak, her çıktı satırı özelliğini oluşturmak için kullanılan noktalar bulundukları sırayla kullanılır. Farklı bir sipariş isteniyorsa, bir Sıralama Alanı belirtin.


Bu benim için yararlı bir araçtı. Doğru yapmak için Çizgi Alanını veya Sıralama Alanını kullanmak önemlidir (niteliklere bağlıdır). Benim durumumda, verilerin her tarihin yeni bir satır oluşturduğunu anlamak için Satır Alanı seçeneğini (yalnızca tarih özniteliği olan alanı, tarih + saati değil) kullanmak zorunda kaldım.
Sue Deforest


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.