Виявлення та фіксація віджимань у траєкторії GPS


9

Мені потрібно знайти алгоритм чи метод, який може виявити зовнішні latitude longitude точки траєкторії під час післяобробки , які потім можуть бути виправлені (повернуті в шлях траєкторії на основі сусідів).

Як приклад типу сторонніх точок, які я хотів би виявити та виправити, я додав зображення, що демонструє:

Сирі дані синього кольору.

Я спробував використовувати фільтр Кальмана без ароматів, щоб згладити дані якнайкраще, але це, здається, не працює достатньо ефективно для більш екстремальних людей (сирі дані синього кольору, згладжені дані червоним кольором):

Сирі дані синього кольору, UKF згладжують дані червоним кольором.

Моя UKF не може бути калібрована належним чином (але я впевнений, що це так).

Траєкторії - це ходунки, бігуни, велосипедисти - рух, що працює на людині, який може починатись і зупинятися, але не різко змінювати швидкість чи положення, що швидко чи раптово.

Рішення, яке не покладається на дані про терміни (і лише на дані про позиції), було б надзвичайно корисним (оскільки дані, що обробляються, не завжди можуть містити дані про терміни). Однак я знаю, наскільки малоймовірним є таке рішення, тому я однаково щасливий будь-якого рішення!

В ідеалі рішення виявило б зовнішній вигляд, щоб його можна було виправити, в результаті чого виправлена ​​траєкторія:

Виправлені необроблені дані зеленим кольором.


Ресурси, які я просіяв:

Відповіді:


1

Як частина інструменту для обробки річкових мереж я створив інструмент контролю якості для пошуку «шипів» у мережі. Хоча я не пропоную використовувати мій інструмент (як це для обробки річкових мереж), я вказую вам на файл довідки, який показує зображення того, що я зробив.

Я розробив код, використовуючи закон косинусів для визначення послідовних кутів між кожним відрізком полілінії. Ви можете розробити власний код навколо цієї ідеї, щоб крокувати по полілінії та визначати крайні кути.


Я використовував такий спосіб, як ви описали (використовуючи закон косинусів) і включаючи відстані між точками, щоб краще визначити людей, що здаються, і, здається, він працює дуже добре. Дякую!
JP

8

Я використовую алгоритм.

  1. Обчисліть мінімум евклідового дерева, що охоплює точки:

введіть тут опис зображення

  1. Знайдіть в цій мережі 2 пункти, що знаходяться один від одного

введіть тут опис зображення

  1. Знайдіть найкоротший маршрут між ними:

введіть тут опис зображення

Як видно, він може різко розітнути кут.

У мене є реалізація вищезгаданого алгоритму ArcGIS python, він використовує модуль networkx. Повідомте мене, якщо це цікавить, і я оновлю свою відповідь зі сценарієм

ОНОВЛЕННЯ:

# 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
Справедливо. Сценарій легко змінювати, не створюючи зв’язків між вузлами, що знаходяться на n часових інтервалах один від одного. Я використовую сценарій для інших речей, а не GPS-шляхів. Є й інші шляхи вдосконалення, наприклад, триангуляція, яка значно зменшить кількість посилань у графіку
FelixIP

2
Цей метод працює в деяких випадках, проте форма деяких траєкторій означає, що використання цього методу неможливо в моєму випадку використання. (Проблеми виникають, коли, наприклад, траєкторія подвоюється назад, оскільки багато вузлів ігноруються, і вони зигзаги. Так само, цілі ділянки траєкторії можна ігнорувати, якщо вхід / вихід цієї секції досить близько один до одного).
JP

1
@JP для шляхів, що йдуть назад, це може допомогти
ущільнити

4

Одна ідея - створити сценарій, який перераховує кути (а може бути і довжину) кожного сегменту вашого шляху. Тепер ви можете порівняти значення кожного сегмента з його прямими сусідами (і, можливо, другими сусідами також для підвищення точності) та вибрати всі ті точки, де значення перевищують задане порогове значення. Нарешті просто видаліть точки зі свого шляху.


Я використав аналогічний метод, описаний @Hornbydd, який виконує це, використовуючи закон косинусів для визначення кутів, включаючи також відстань між точками. Дякую за пропозицію.
JP

2

Також варто звернути увагу на метод Медіана-5.

Кожна координата x (або y) встановлюється посередницею 5 x (або y) значень навколо неї послідовно (тобто себе, двох попередніх значень та двох наступних значень).

наприклад, x3 = медіана (x1, x2, x3, x4, x5) y3 = медіана (y1, y2, y3, y4, y5) тощо.

Метод швидкий, а також простий у використанні для потокової передачі даних.



0

Ви можете імпортувати свої дані в excel або використовувати панди та прапор та видалити всі відстані від попередньої точки, що перевищують деякий нереальний поріг відстані.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.