2009-12-29 35 views
5

Tôi có một thiết bị ghi dữ liệu GPS. Việc đọc được thực hiện sau mỗi 2-10 giây. Đối với một hoạt động mất 2 giờ có rất nhiều điểm GPS.Nén các điểm GPS

Có ai biết thuật toán nén tập dữ liệu hay không bằng cách xóa điểm dữ liệu dư thừa. tức là Nếu một loạt các điểm dữ liệu là tất cả trong một đường thẳng thì chỉ bắt đầu và kết thúc điểm.

+3

Một bản ghi vị trí duy nhất là 4 nổi hoặc 16 byte. Cứ hai giây trong hai giờ là 115kb. Loại nền tảng nào quan trọng này? Ngay cả đối với điện thoại di động cũng không có gì. –

+0

@Pavel: Tùy thuộc vào số lượng vệ tinh được sử dụng (tối đa 12).NMEA $ GPGSA câu cho phép lên đến 12 vệ tinh, cộng với tất cả các dữ liệu phụ trợ khác –

+2

Vấn đề của tôi không phải là với lưu trữ, nhưng với màn hình hiển thị. Nếu tôi muốn hiển thị tuyến đường trên một trang web (thông qua bản đồ google) thì tôi không muốn hiển thị 1000 điểm dữ liệu. –

Trả lời

6

xem Douglas Peucker Algorithm được sử dụng để đơn giản hóa đa giác. Tôi đã sử dụng thành công này để giảm số lượng điểm tham chiếu gps khi được gửi cho khách hàng để hiển thị mục đích.

+0

Điều cần lưu ý với giải pháp đó là mất độ chính xác. Trông tốt btw, chỉ cần không thích hợp nếu mỗi điểm cần phải được tái tạo. –

+0

@psasik: Bộ lọc kalman sẽ sửa lỗi này. Sẽ có một lỗi phân phối, nhưng các phép đo nhiều hơn được thực hiện theo thời gian, nó sẽ cải thiện độ chính xác –

+0

psasik - cảm ơn cho thông tin - sẽ có một cái nhìn tại http://www.codeproject.com/KB/cs/Douglas -Peucker_Algorithm.aspx –

0

Có một bài nghiên cứu trên Compressing GPS Data on Mobile Devices.

Ngoài ra, bạn có thể xem bài viết CodeProject này trên Writing GPS Applications. Tôi nghĩ rằng vấn đề bạn sẽ có không phải là cho các điểm thẳng, mà là các con đường cong. Tất cả phụ thuộc vào độ chính xác mà bạn muốn con đường của bạn.

+0

Cảm ơn Roboto - thông tin này thú vị nhưng không trực tiếp những gì tôi đang tìm kiếm. Cảm ơn bạn đã thông tin. –

1

Bạn có thể muốn ước tính đường dẫn của bạn x (t), y (t) với một xấp xỉ đa thức của nó. Bạn đang tìm kiếm một cái gì đó như thế này: http://www.youtube.com/watch?v=YtcZXlKbDJY ???

1

Bạn có thể xóa điểm thừa bằng cách thực hiện đơn giản hóa rất cơ bản dựa trên tính toán độ dốc giữa các điểm tiếp theo.

Đây là một chút nhưng không hoàn thành C++ trình bày tốt thuật toán:

struct Point 
{ 
    double x; 
    double y; 
}; 

double calculate_slope(Point const& p1, Point const& p2) 
{ 
    //  dy  y2 - y1 
    // m = ---- = --------- 
    //  dx  x2 - x1 
    return ((p2.y - p1.y)/(p2.x - p1.x)); 
} 

// 1. Read first two points from GPS stream source 
Point p0 = ... ; 
Point p1 = ... ; 

// 2. Accept p0 as it's first point 

// 3. Calculate slope 
double m0 = calculate_slope(p0, p1); 

// 4. next point is now previous 
p0 = p1; 

// 5. Read another point 
p1 = ... ; 
double m1 = calculate_slope(p0, p1); 

// 6. Eliminate Compare slopes 
double const tolerance = 0.1; // choose your tolerance 
double const diff = m0 - m1; 
bool if (!((diff <= tolerance) && (diff >= -tolerance))) 
{ 
    // 7. Accept p0 and eliminate p1 

    m0 = m1; 
} 

// Repeat steps from 4 to 7 for the rest of points. 

Tôi hy vọng nó giúp.

0

Mã đưa ra ở trên có một vài vấn đề có thể làm cho nó không phù hợp:

  • "cùng dốc" khoan dung đo sự khác biệt về độ dốc hơn là góc, vì vậy Bắc Đông Bắc đến Bắc Tây Bắc được coi là một sự khác biệt lớn hơn nhiều so với NE đến SE (giả sử trục y chạy Bắc-Nam).

    Một cách để giải quyết vấn đề này là khả năng đo lường cách sản phẩm dấu chấm của hai phân đoạn so sánh với sản phẩm có độ dài của chúng. (Nó có thể giúp hiểu được rằng sản phẩm dấu chấm của hai vectơ là sản phẩm có độ dài và cosin của góc giữa chúng.) Tuy nhiên, hãy xem điểm tiếp theo.

  • Chỉ xử lý lỗi dốc chứ không phải lỗi vị trí, do đó đoạn ENE dài tiếp theo phân đoạn ESE dài có khả năng được nén thành một đoạn như một chuỗi đoạn ngắn xen kẽ giữa ENE và ESE.

Cách tiếp cận mà tôi đang nghĩ đến là xem xét ứng dụng đồ họa vector nào để chuyển đổi danh sách tọa độ con trỏ thành chuỗi đường cong. Ví dụ. xem bezier-utils.cpp của lib2geom. Lưu ý rằng (i) nó gần như hoàn toàn dựa trên vị trí chứ không phải dựa trên hướng; và (ii) nó cho các đường tròn bézier như đầu ra chứ không phải là polyline, mặc dù bạn có thể sử dụng phương pháp tương tự để cung cấp đầu ra polyline nếu được ưu tiên (trong trường hợp bước Newton-Raphson trở thành bản chất chỉ là một sản phẩm chấm đơn giản).

Các vấn đề liên quan