Phát hiện và sửa chữa các ngoại lệ trong quỹ đạo GPS


9

Tôi cần tìm một thuật toán hoặc phương pháp có thể phát hiện latitude longitude các điểm ngoại lai trong một quỹ đạo trong quá trình xử lý hậu kỳ , sau đó có thể được sửa chữa (đưa trở lại đường dẫn của quỹ đạo dựa trên các lân cận của nó).

Như một ví dụ về loại điểm ngoại lệ tôi muốn phát hiện và khắc phục, tôi đã đính kèm một hình ảnh minh họa:

Dữ liệu thô màu xanh lam.

Tôi đã thử sử dụng bộ lọc Kalman không tập trung để làm mịn dữ liệu tốt nhất có thể, nhưng điều này dường như không hoạt động đủ hiệu quả đối với các ngoại lệ cực đoan hơn (dữ liệu thô có màu xanh lam, dữ liệu được làm mịn bằng màu đỏ):

Dữ liệu thô có màu xanh lam, UKF làm mịn dữ liệu màu đỏ.

UKF của tôi có thể không được hiệu chỉnh đúng (nhưng tôi khá chắc chắn rằng nó là).

Quỹ đạo là những người đi bộ, chạy bộ, đi xe đạp - chuyển động do con người có thể bắt đầu và dừng lại, nhưng không thay đổi mạnh mẽ về tốc độ hoặc vị trí nhanh hay đột ngột.

Một giải pháp không dựa vào dữ liệu thời gian (và chỉ dựa trên dữ liệu vị trí) sẽ cực kỳ hữu ích (vì dữ liệu đang được xử lý có thể không phải lúc nào cũng chứa dữ liệu thời gian). Tuy nhiên, tôi nhận thức được loại giải pháp này không tồn tại như thế nào, vì vậy tôi rất vui khi có bất kỳ giải pháp nào!

Lý tưởng nhất, giải pháp sẽ phát hiện ngoại lệ để có thể sửa nó, dẫn đến một quỹ đạo đã được sửa:

Sửa dữ liệu thô màu xanh lá cây.


Tài nguyên tôi đã chọn lọc qua:

Câu trả lời:


1

Là một phần của công cụ xử lý mạng lưới sông, tôi đã tạo ra một công cụ kiểm soát chất lượng để tìm kiếm "gai" trong mạng. Trong khi tôi không đề nghị bạn sử dụng công cụ của tôi (vì nó là để xử lý các mạng sông) Tôi chỉ cho bạn đến tệp Trợ giúp hiển thị hình ảnh về những gì tôi đã làm.

Tôi đã phát triển mã xung quanh bằng cách sử dụng định luật cosin để xác định các góc liên tiếp giữa mỗi phân đoạn dòng của một đa tuyến. Bạn có thể phát triển mã của riêng mình xung quanh ý tưởng này để bước theo một đường đa tuyến và xác định các góc cực.


Tôi đã sử dụng một phương pháp như bạn mô tả (sử dụng định luật vũ trụ) và bao gồm khoảng cách giữa các điểm để xác định tốt hơn các ngoại lệ và có vẻ như nó hoạt động rất tốt. Cảm ơn bạn!
JP

8

Thuật toán tôi sử dụng.

  1. Tính cây bao trùm tối thiểu Euclide của các điểm:

nhập mô tả hình ảnh ở đây

  1. Tìm 2 điểm cách xa nhau nhất trên mạng này

nhập mô tả hình ảnh ở đây

  1. Tìm con đường ngắn nhất giữa chúng:

nhập mô tả hình ảnh ở đây

Như người ta có thể thấy nó có thể cắt góc trên một bước ngoặt sắc nét.

Tôi có triển khai python ArcGIS của thuật toán trên, nó sử dụng mô-đun mạngx. Hãy cho tôi biết nếu điều này được quan tâm và tôi sẽ cập nhật câu trả lời của mình với kịch bản

CẬP NHẬT:

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

Hmmm cách tiếp cận thú vị .. cảm ơn vì đã chia sẻ điều này! một ví dụ làm việc sẽ có giá trị Tôi chắc chắn!
nickname

1
Một số loại so sánh từng phần giữa kết quả của phương pháp này và những gì bạn sẽ nhận được chỉ bằng cách làm theo dữ liệu đầu vào có thể cho phép bạn đặt ngưỡng để thoát khỏi "gai" nhưng vẫn giữ được các góc. Điều này có thể đặc biệt hữu ích nếu bạn cũng có thông tin về thời gian liên quan đến từng điểm, phát sinh tự nhiên từ một số nhật ký.
Doug McClean

1
Đủ công bằng. Thật dễ dàng để sửa đổi tập lệnh bằng cách không tạo liên kết giữa các nút cách nhau khoảng thời gian n. Tôi đang sử dụng tập lệnh cho những thứ khác, không phải đường dẫn GPS. Cũng có nhiều cách khác để cải thiện, ví dụ như triangulation, sẽ giảm ồ ạt số lượng liên kết trong biểu đồ
FelixIP

2
Phương pháp này hoạt động trong một số trường hợp, tuy nhiên hình dạng của một số quỹ đạo có nghĩa là sử dụng phương pháp này không khả thi trong trường hợp sử dụng của tôi. .
JP

1
@JP cho con đường đi về phía sau nó có thể giúp tăng mật độ dòng 1st liệu
FelixIP

4

Một ý tưởng là tạo một tập lệnh liệt kê các góc (và có thể cả độ dài) của mỗi đoạn trên đường dẫn của bạn. Bây giờ bạn có thể so sánh các giá trị của mọi phân khúc với các lân cận trực tiếp của nó (và có thể cả các lân cận thứ hai cũng để tăng độ chính xác) và chọn tất cả các điểm mà các giá trị vượt quá giá trị threashold đã cho. Cuối cùng chỉ cần xóa các điểm từ đường dẫn của bạn.


Tôi đã sử dụng một phương pháp tương tự được mô tả bởi @Hornbydd để thực hiện điều này bằng cách sử dụng định luật cosin để xác định các góc, cũng kết hợp khoảng cách giữa các điểm. Cảm ơn vì đã góp ý.
JP

2

Cũng đáng xem xét là phương pháp Median-5.

Mỗi tọa độ x (hoặc y) được đặt thành trung vị của các giá trị 5 x (hoặc y) xung quanh nó theo thứ tự (tức là chính nó, hai giá trị trước và hai giá trị tiếp theo).

ví dụ: x3 = trung vị (x1, x2, x3, x4, x5) y3 = trung vị (y1, y2, y3, y4, y5), v.v.

Phương pháp nhanh chóng và cũng dễ sử dụng khi truyền dữ liệu.



0

Bạn có thể nhập dữ liệu của mình vào excel hoặc sử dụng gấu trúc và cờ và xóa tất cả khoảng cách từ điểm trước đó vượt quá ngưỡng khoảng cách không thực tế.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.