การตรวจจับและแก้ไขค่าผิดปกติในวิถี GPS


9

ฉันต้องการค้นหาอัลกอริทึมหรือวิธีการที่สามารถตรวจจับ latitude longitude จุดที่ผิดปกติในวิถีในระหว่างการโพสต์การประมวลผลซึ่งสามารถแก้ไขได้ (นำกลับไปสู่เส้นทางของวิถีตามเพื่อนบ้าน)

เป็นตัวอย่างของคะแนนผิดปกติที่ฉันต้องการตรวจจับและแก้ไขฉันได้แนบรูปภาพที่แสดง:

ข้อมูลดิบเป็นสีน้ำเงิน

ฉันได้ลองใช้ตัวกรองคาลมานเพื่อรวบรวมข้อมูลให้ดีที่สุดเท่าที่จะเป็นไปได้ แต่ดูเหมือนว่ามันจะไม่ทำงานอย่างมีประสิทธิภาพเพียงพอสำหรับค่าผิดปกติที่รุนแรงมากขึ้น (ข้อมูลดิบเป็นสีน้ำเงินข้อมูลเรียบเป็นสีแดง):

ข้อมูลดิบเป็นสีน้ำเงิน UKF ปรับข้อมูลให้เรียบเป็นสีแดง

UKF ของฉันอาจไม่ได้รับการปรับเทียบอย่างถูกต้อง (แต่ฉันค่อนข้างแน่ใจว่าเป็น)

วิถีการเคลื่อนที่นั้นเป็นของวอล์กเกอร์นักวิ่งนักปั่นจักรยาน - การเคลื่อนไหวที่ขับเคลื่อนด้วยมนุษย์ซึ่งสามารถเริ่มต้นและหยุดได้ แต่ไม่สามารถเปลี่ยนความเร็วหรือตำแหน่งอย่างรวดเร็วหรือฉับพลัน

โซลูชันที่ไม่พึ่งพาข้อมูลเวลา (และข้อมูลตำแหน่งเท่านั้น) จะมีประโยชน์อย่างมาก (เนื่องจากข้อมูลที่กำลังประมวลผลอาจไม่ประกอบด้วยข้อมูลเวลา) อย่างไรก็ตามฉันทราบดีว่ามีวิธีการแก้ปัญหาแบบนี้ไม่น่าเป็นไปได้ดังนั้นฉันมีความสุขเท่ากันที่จะมีทางออกใด ๆ !

โดยหลักการแล้ววิธีการแก้ปัญหาจะตรวจจับค่าผิดปกติเพื่อให้สามารถแก้ไขได้ทำให้เกิดวิถีการแก้ไขที่ถูกต้อง:

แก้ไขข้อมูลดิบเป็นสีเขียว


ทรัพยากรที่ฉันกรองผ่าน:

คำตอบ:


1

เป็นส่วนหนึ่งของเครื่องมือสำหรับการประมวลผลเครือข่ายแม่น้ำฉันสร้างเครื่องมือควบคุมคุณภาพเพื่อค้นหา "spikes" ในเครือข่าย ในขณะที่ฉันไม่ได้แนะนำให้คุณใช้เครื่องมือของฉัน (สำหรับการประมวลผลเครือข่ายแม่น้ำ) ฉันชี้ให้คุณไปที่ไฟล์วิธีใช้ซึ่งแสดงภาพของสิ่งที่ฉันได้ทำ

ฉันได้พัฒนาโค้ดโดยใช้กฎของโคไซน์เพื่อระบุมุมที่ต่อเนื่องกันระหว่างส่วนของเส้นแต่ละเส้นของโพลีไลน์ คุณสามารถพัฒนาโค้ดของคุณเองรอบ ๆ แนวความคิดนี้เพื่อก้าวไปตามแนวโพลีไลน์และระบุมุมที่มากที่สุด


ฉันใช้วิธีการเหมือนที่คุณอธิบายไว้ (โดยใช้กฎแห่งโคไซน์) และรวมถึงระยะทางระหว่างจุดเพื่อกำหนดค่าผิดปกติได้ดีขึ้นและดูเหมือนว่าจะทำงานได้ดีมาก ขอบคุณ!
JP

8

อัลกอริทึมที่ฉันใช้

  1. คำนวณทอนจุดต่ำสุดของปริภูมิแบบยุคลิด:

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

  1. หาจุดที่ห่างกันมากที่สุด 2 จุดบนเครือข่ายนี้

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

  1. ค้นหาเส้นทางที่สั้นที่สุดระหว่างพวกเขา:

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

อย่างที่ใครเห็นมันอาจจะตัดมุมในการเลี้ยวที่คมชัด

ฉันมีการนำงูเหลือม ArcGIS ของอัลกอริทึมข้างต้นจะใช้โมดูล networkx แจ้งให้เราทราบหากนี่เป็นสิ่งที่น่าสนใจและฉันจะอัปเดตคำตอบของฉันด้วยสคริปต์

UPDATE:

# Connects points to make polyline. Makes 1 line at a time
# Tool assumes that 1st layer in Table of Conternt is TARGET polyline feature class,
# second layer in TOC is SOURCE point fc.
# If no selection found in SOURCE layer, works on entire dataset

import arcpy, traceback, os, sys
import itertools as itt
from math import sqrt
sys.path.append(r'C:\Users\felix_pertziger\AppData\Roaming\Python\Python27\site-packages')
import networkx as nx
from networkx import dijkstra_path_length

try:
    def showPyMessage():
        arcpy.AddMessage(str(time.ctime()) + " - " + message)
    def CheckLayerLine(infc):
        d=arcpy.Describe(infc)
        theType=d.shapeType
        if theType!="Polyline":
            arcpy.AddWarning("\nTool designed to work with polylines as TARGET!")
            raise NameError, "Wrong input\n"
        return d
    def CheckLayerPoint(infc):
        d=arcpy.Describe(infc)
        theType=d.shapeType
        if theType!="Point":
            arcpy.AddWarning("\nTool designed to work with points as SOURCE!")
            raise NameError, "Wrong input\n"
        return d
    mxd = arcpy.mapping.MapDocument("CURRENT")
    layers = arcpy.mapping.ListLayers(mxd)
    if len(layers)<=1:
        arcpy.AddWarning("\nNot enough layers in the view!")
        raise NameError, "Wrong input\n"
    destLR, sourceLR=layers[0],layers[1]
    a = CheckLayerPoint(sourceLR);d = CheckLayerLine(destLR)

#  copy all points to manageable list
    g=arcpy.Geometry()
    geometryList=arcpy.CopyFeatures_management(sourceLR,g)
    nPoints=len(geometryList)
    arcpy.AddMessage('Computing minimum spanning tree')
    list2connect=[p.firstPoint for p in geometryList]
#  create network    
    p=list(itt.combinations(range(nPoints), 2))
    arcpy.SetProgressor("step", "", 0, len(p),1)
    G=nx.Graph()
    for f,t in p:
        p1=list2connect[f]
        p2=list2connect[t]
        dX=p2.X-p1.X;dY=p2.Y-p1.Y
        lenV=sqrt(dX*dX+dY*dY)
        G.add_edge(f,t,weight=lenV)
        arcpy.SetProgressorPosition()
    arcpy.AddMessage(len(G.edges()))
    mst=nx.minimum_spanning_tree(G)
    del G

#  find remotest pair
    arcpy.AddMessage(len(mst.edges()))
    length0=nx.all_pairs_dijkstra_path_length(mst)
    lMax=0
    for f,t in p:
        lCur=length0[f][t]
        if lCur>lMax:
            lMax=lCur
            best=(f,t)
    gL=nx.dijkstra_path(mst,best[0],best[1])
    del mst
    nPoints=len(gL)
    ordArray=arcpy.Array()
    for i in gL: ordArray.add(list2connect[i])

#  append line to TARGET
    curT = arcpy.da.InsertCursor(destLR,"SHAPE@")
    curT.insertRow((arcpy.Polyline(ordArray),))
    arcpy.RefreshActiveView()
    del curT

except:
    message = "\n*** PYTHON ERRORS *** "; showPyMessage()
    message = "Python Traceback Info: " + traceback.format_tb(sys.exc_info()[2])[0]; showPyMessage()
    message = "Python Error Info: " +  str(sys.exc_type)+ ": " + str(sys.exc_value) + "\n"; showPyMessage()            

อืมมวิธีที่น่าสนใจ .. ขอบคุณที่แบ่งปันสิ่งนี้! ตัวอย่างการทำงานจะมีค่าฉันแน่ใจ!
nickves

1
การเปรียบเทียบแบบบางส่วนระหว่างผลลัพธ์ของวิธีการนี้กับสิ่งที่คุณจะได้รับจากการป้อนข้อมูลอาจช่วยให้คุณตั้งค่าขีด จำกัด ที่จะกำจัด "แหลม" แต่ยังคงรักษามุมไว้ สิ่งนี้อาจมีประโยชน์อย่างยิ่งหากคุณมีข้อมูลเวลาที่เกี่ยวข้องกับแต่ละจุดซึ่งเกิดขึ้นจากการบันทึกบางอย่าง
Doug McClean

1
ยุติธรรมพอสมควร ง่ายต่อการแก้ไขสคริปต์โดยไม่สร้างการเชื่อมโยงระหว่างโหนดที่ไม่มีการเว้นช่วงเวลาซึ่งกันและกัน ฉันกำลังใช้สคริปต์เพื่อสิ่งอื่นไม่ใช่เส้นทาง GPS มีวิธีอื่น ๆ สำหรับการปรับปรุงเช่นกันเช่นการหารูปสามเหลี่ยมซึ่งจะลดจำนวนการเชื่อมโยงในกราฟจำนวนมาก
FelixIP

2
วิธีนี้ใช้ได้ผลในบางกรณี แต่รูปร่างของไบร์ทบางหมายความว่าการใช้วิธีนี้ไม่เป็นไปได้ในกรณีใช้งานของฉัน (ปัญหาเกิดขึ้นเมื่อตัวอย่างเช่นวิถีโคจรกลับเป็นสองเท่าในตัวเองเป็นโหนดจำนวนมากจะถูกละเว้นและมัน zig-zags ในทำนองเดียวกันส่วนทั้งหมดของวิถีสามารถละเว้นถ้าเข้า / ออกของส่วนนั้นอยู่ใกล้กันพอ)
JP

1
@JP สำหรับเส้นทางย้อนกลับอาจช่วยลดความหยาบของสายที่ 1
FelixIP

4

แนวคิดหนึ่งคือการสร้างสคริปต์ที่แสดงมุม (และความยาวอาจจะ) ของเส้นทางทุกส่วนของคุณ ตอนนี้คุณสามารถเปรียบเทียบค่าของทุกเซ็กเมนต์กับเพื่อนบ้านโดยตรง (และอาจเป็นเพื่อนบ้านที่สองเพื่อเพิ่มความแม่นยำ) และเลือกจุดเหล่านั้นทั้งหมดที่ค่าเกิน threashold-value ที่กำหนด ในที่สุดก็เพียงแค่ลบคะแนนจากเส้นทางของคุณ


ฉันใช้วิธีที่คล้ายกันซึ่งอธิบายโดย @Hornbydd ที่ทำให้สิ่งนี้สำเร็จโดยใช้กฎของโคไซน์เพื่อกำหนดมุมรวมถึงการรวมระยะห่างระหว่างจุดด้วย ขอบคุณสำหรับคำแนะนำ
JP

2

นอกจากนี้ควรพิจารณาวิธี Median-5 ด้วย

พิกัด x (หรือ y) แต่ละค่าจะถูกตั้งค่าเป็นค่ามัธยฐานของค่า 5 x (หรือ y) รอบ ๆ มันตามลำดับ (เช่นตัวเองค่าก่อนหน้านี้สองค่าและค่าลำดับถัดมาสองค่า)

เช่น x3 = ค่ามัธยฐาน (x1, x2, x3, x4, x5) y3 = ค่ามัธยฐาน (y1, y2, y3, y4, y5) เป็นต้น

วิธีนี้รวดเร็วและใช้งานง่ายในการสตรีมข้อมูล


1

มีข้อมูลที่ดีในคำถาม / คำตอบนี้

แม้ว่ามันทั้งหมดขึ้นอยู่กับว่าคะแนนของคุณเป็นกลุ่มในสิ่งที่จะ / จะไม่ทำงาน คุณจะต้องระวังจุดที่กระจายออกไป แต่ไม่ใช่ค่าผิดปกติ


0

คุณสามารถนำเข้าข้อมูลของคุณไปยัง excel หรือใช้นุ่นและธงและหรือลบระยะทางทั้งหมดจากจุดก่อนหน้าซึ่งเกินขีด จำกัด ระยะทางที่ไม่สมจริง

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