GPS प्रक्षेपवक्र में आउटलेर का पता लगाना और उसे ठीक करना


9

मुझे एक एल्गोरिथ्म या विधि खोजने की ज़रूरत है जो latitude longitude पोस्ट-प्रोसेसिंग के दौरान एक प्रक्षेपवक्र में बाहरी बिंदुओं का पता लगा सके , जिसे तब तय किया जा सकता है (अपने पड़ोसियों के आधार पर प्रक्षेप पथ में वापस लाया जा सकता है)।

बाहरी बिंदुओं की तरह के एक उदाहरण के रूप में मैं पता लगाना और ठीक करना चाहूंगा, मैंने एक छवि प्रदर्शित की है:

नीले रंग में कच्चा डेटा।

मैंने डेटा को बेहतर तरीके से सुचारू करने के लिए एक अप्रयुक्त कलमन फ़िल्टर का उपयोग करने का प्रयास किया है, लेकिन यह अधिक चरम आउटलेर्स के लिए प्रभावी रूप से पर्याप्त रूप से काम नहीं करता है (लाल रंग में कच्चा डेटा, लाल रंग में डेटा को सुचारू करना):

नीले रंग में कच्चा डेटा, यूकेएफ ने लाल रंग में डेटा को सुचारू किया।

मेरा यूकेएफ ठीक से कैलिब्रेट नहीं किया जा सकता है (लेकिन मैं काफी निश्चित हूं कि यह है)।

प्रक्षेप पथ वेकर्स, धावक, साइक्लिस्ट - मानव-संचालित आंदोलन हैं जो शुरू और बंद हो सकते हैं, लेकिन तेजी या अचानक गति या स्थिति में तेजी से नहीं बदलते हैं।

एक समाधान जो समय डेटा पर निर्भर नहीं करता है (और केवल स्थिति डेटा पर) बहुत उपयोगी होगा (क्योंकि संसाधित किए जा रहे डेटा में हमेशा अधिक डेटा शामिल नहीं हो सकता है)। हालाँकि, मैं इस बात से अवगत हूँ कि इस तरह का समाधान मौजूद नहीं होने की संभावना कम है, इसलिए मैं उतना ही खुश हूँ जितना किसी भी समाधान के लिए!

आदर्श रूप से, समाधान बाहरी का पता लगाएगा ताकि इसे ठीक किया जा सके, जिसके परिणामस्वरूप एक सही प्रक्षेपवक्र होगा:

हरे रंग में सही कच्चे डेटा।


जिन संसाधनों से मैंने छीना है:

जवाबों:


1

नदी नेटवर्क के प्रसंस्करण के लिए एक उपकरण के हिस्से के रूप में मैंने नेटवर्क में "स्पाइक्स" की खोज करने के लिए एक गुणवत्ता नियंत्रण उपकरण बनाया। जब तक मैं सुझाव नहीं दे रहा हूं कि आप मेरे टूल का उपयोग करें (जैसा कि नदी नेटवर्क को संसाधित करने के लिए है) मैं आपको उस मदद फ़ाइल की ओर इंगित करता हूं जो मैंने जो किया था उसकी एक छवि दिखाती है।

मैंने पॉलीलाइन के प्रत्येक पंक्ति खंड के बीच क्रमिक कोणों की पहचान करने के लिए कोसाइन के नियम का उपयोग करते हुए कोड विकसित किया था । आप इस विचार के चारों ओर अपना स्वयं का कोड विकसित कर सकते हैं कि एक पॉलीलाइन के साथ कदम रखें और अत्यधिक कोणों की पहचान करें


मैंने एक विधि का उपयोग किया है जैसे कि आपने वर्णित (कॉशन के नियमों का उपयोग करके) और बिंदुओं के बीच की दूरी को बेहतर बनाने के लिए आउटलेयर सहित, और यह बहुत अच्छी तरह से काम करता है। धन्यवाद!
JP

8

एल्गोरिथ्म मैं का उपयोग करें।

  1. यूक्लिडियन न्यूनतम फैले हुए पेड़ों की गणना करें:

यहां छवि विवरण दर्ज करें

  1. इस नेटवर्क पर एक दूसरे से सबसे अलग 2 बिंदु खोजें

यहां छवि विवरण दर्ज करें

  1. उनके बीच सबसे छोटा मार्ग खोजें:

यहां छवि विवरण दर्ज करें

जैसा कि कोई देख सकता है कि यह एक तेज मोड़ पर कोने को काट सकता है।

मेरे पास उपरोक्त एल्गोरिदम का आर्कगिस पायथन कार्यान्वयन है, यह नेटवर्कएक्स मॉड्यूल का उपयोग करता है। मुझे बताएं कि क्या यह रुचि का है और मैं स्क्रिप्ट के साथ अपने उत्तर को अपडेट करूंगा

अपडेट करें:

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

हम्म्म दिलचस्प दृष्टिकोण .. यह साझा करने के लिए धन्यवाद! एक काम का उदाहरण मुझे यकीन है कि मुझे यकीन होगा!
निकल

1
इस दृष्टिकोण के परिणाम और इनपुट डेटा का पालन करने से आपको जो कुछ मिलेगा, उसकी तुलना में आप किसी भी सीमा को निर्धारित कर सकते हैं, जो "स्पाइक्स" से छुटकारा दिलाएगा, लेकिन फिर भी कोनों को बनाए रखेगा। यह विशेष रूप से उपयोगी हो सकता है यदि आपके पास प्रत्येक बिंदु से जुड़ी समय की जानकारी भी है, जो स्वाभाविक रूप से कुछ लॉग से उत्पन्न होती है।
डग मैकक्लीन

1
काफी उचित। यह उन नोड्स के बीच लिंक न बनाकर स्क्रिप्ट को संशोधित करना आसान है जो एक दूसरे से दूर समय अंतराल हैं। मैं अन्य चीजों के लिए स्क्रिप्ट का उपयोग कर रहा हूं, न कि जीपीएस रास्तों का। सुधार के अन्य तरीके भी हैं, उदाहरण के लिए, त्रिकोणासन, जो बड़े पैमाने पर ग्राफ में लिंक की संख्या को कम करेगा
फेलिक्सिप

2
यह विधि कुछ मामलों में काम करती है, हालांकि कुछ प्रक्षेपवक्रों के आकार का अर्थ है कि इस पद्धति का उपयोग करना मेरे उपयोग के मामले में संभव नहीं है। (समस्याएँ तब होती हैं, जब उदाहरण के लिए, एक प्रक्षेपवक्र अपने आप से दोगुना हो जाता है, क्योंकि कई नोड्स को अनदेखा किया जाता है और यह z-zags होता है। इसी तरह, एक प्रक्षेपवक्र के पूरे वर्गों को अनदेखा किया जा सकता है यदि उस खंड का प्रवेश / निकास एक साथ बंद हो)।
जेपी

1
@JP पीछे की ओर जाने वाले रास्तों के लिए कच्ची लाइन को घनीभूत करने में मदद मिल सकती है
फेलिक्सिप

4

एक विचार एक स्क्रिप्ट बनाने का है जो आपके पथ के प्रत्येक खंड के कोणों (और शायद लंबाई भी) को सूचीबद्ध करता है। अब आप हर खंड के मूल्यों की तुलना उसके प्रत्यक्ष पड़ोसियों (और संभवतः दूसरे पड़ोसियों की सटीकता बढ़ाने के लिए) से कर सकते हैं और उन सभी बिंदुओं का चयन कर सकते हैं, जहाँ मान किसी दिए गए थ्रेशोल्ड-मान से अधिक हैं। अंत में बस अपने पथ से अंक हटाएं।


मैंने @Hornbydd द्वारा वर्णित एक समान विधि का उपयोग किया है जो कोणों को निर्धारित करने के लिए कोस के नियम का उपयोग करके इसे पूरा करता है, अंकों के बीच की दूरी को भी शामिल करता है। सुझाव के लिए धन्यवाद।
JP

2

इसके अलावा देखने लायक है मेडियन -5 विधि।

प्रत्येक x (या y) निर्देशांक 5 x (या y) मान के मध्य में क्रम से सेट होता है (अर्थात स्वयं, दो पिछले मान और दो बाद के मान)।

जैसे x3 = माध्यिका (X1, x2, x3, x4, x5) y3 = माध्यिका (y1, y2, y3, y4, y5) आदि।

विधि त्वरित है और स्ट्रीमिंग डेटा पर उपयोग करना भी आसान है।


1

इस प्रश्न / उत्तर में कुछ अच्छा डेटा है।

हालांकि यह सब इस बात पर निर्भर करता है कि आपके अंक किस तरह से काम करेंगे / नहीं होंगे। आपको उन बिंदुओं पर सावधान रहना होगा जो बाहर फैले हुए हैं लेकिन आउटलेर नहीं हैं।


0

आप अपने डेटा को एक्सेल में आयात कर सकते हैं या पांडा और ध्वज का उपयोग कर सकते हैं या पिछले बिंदु से सभी दूरी को हटा सकते हैं जो कुछ अवास्तविक सीमा से अधिक है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.