แปลงคะแนน 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 ที่สามารถแก้ไขข้อผิดพลาดทั้งสองได้แม้ว่าฉันจะต้องรอจนกว่าฉันจะกลับมาที่ออฟฟิศในสัปดาห์หน้าเพื่อตรวจสอบ
แมตต์วิลคี

คำตอบ:


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

8

ปลั๊กอิน QGIS "Points2One" ควรเป็นสิ่งที่คุณกำลังมองหา

หากคุณไม่ทำเครื่องหมาย "เรียงคะแนนตามฟิลด์นี้" ปลั๊กอินจะเชื่อมต่อพวกเขาตามลำดับจุดภายในในเลเยอร์ ฉันใช้ตัวอย่างของคุณจัดเรียงคะแนนตามลำดับคดเคี้ยวไปมาและทำงานตามที่คาดไว้:

ป้อนคำอธิบายรูปภาพที่นี่


ไม่ตรงกับแบบชี้ไปที่จุดตามละติจูดและไม่ใช่ลำดับเวลาดูimgur.com/d2Ycg.jpgบางทีด้วยการนวด csv เพื่อเปลี่ยนเวลาเป็น 24 ชั่วโมงอาจทำงานได้ดีขึ้น
matt wilkie

โปรดบอกฉันว่าฉันสามารถดาวน์โหลดปลั๊กอิน points2one ได้ที่ไหนถ้ายังใช้งานได้ ฉันต้องการสร้างบรรทัดที่ประกอบด้วยจุด GPS และเพิ่มจุดด้วยตนเอง (เพื่อให้เส้นโค้งเรียบ)
เทาชอว์


3

ArcGIS 10.0 มีจุดที่สายเครื่องมือ

ฉันขอแนะนำให้อ่านเอกสารArcGIS 10.2 สำหรับเดสก์ท็อปแต่โดยสรุป:

สร้างคุณสมบัติของเส้นจากจุด

...

แต่ละคุณสมบัติในผลลัพธ์จะขึ้นอยู่กับค่าที่ไม่ซ้ำกันใน Line Line

...

โดยค่าเริ่มต้นคะแนนที่ใช้ในการสร้างคุณลักษณะแต่ละบรรทัดเอาต์พุตจะถูกใช้ตามลำดับที่พบ หากต้องการคำสั่งซื้ออื่นให้ระบุฟิลด์เรียงลำดับ


นี่เป็นเครื่องมือที่มีประโยชน์สำหรับฉัน เป็นสิ่งสำคัญที่จะใช้ Line Line หรือ Sort Field เพื่อทำให้ถูกต้อง (ขึ้นอยู่กับคุณสมบัติ) ในกรณีของฉันฉันต้องใช้ตัวเลือก Line Line (ใช้เฉพาะฟิลด์ที่มีแอ็ตทริบิวต์ date และไม่ใช่ date + time) เพื่อให้ข้อมูลเข้าใจว่าแต่ละวันสร้างบรรทัดใหม่
Sue Deforest


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.