2011-12-19 31 views
5

Đây là tình huống:Kiểm tra xem người dùng có gần trạm kiểm soát tuyến đường với GPS

Tôi có tuyến đường GPS được xác định trước mà người dùng sẽ chạy. Các tuyến đường có một số trạm kiểm soát và người dùng nên vượt qua gần tất cả chúng (nghĩ về chúng như là một trạm kiểm soát trò chơi đua xe, mà ngăn cản người dùng lấy phím tắt). Tôi cần đảm bảo rằng người dùng đi qua tất cả các trạm kiểm soát. Tôi muốn xác định một khu vực sẽ được xem xét bên trong bán kính của một trạm kiểm soát, nhưng tôi không muốn nó chỉ là một khu vực xuyên tâm, nó phải là một khu vực xem xét hình thức của con đường. Bạn không hiểu điều đó? Tôi cũng không nhìn vào hình ảnh được vẽ kém này để hiểu rõ hơn: Route example

Đường màu đen biểu thị đường được xác định trước, quả bóng màu xanh là điểm kiểm tra và đa giác màu xanh là khu vực mong muốn. Đường màu xanh lá cây là người dùng chính xác hơn và đường màu đỏ là người dùng kém chính xác hơn (một gã say rượu lái xe có thể? Lol). Cả hai dòng phải nằm trong đa giác, nhưng người dùng bỏ qua hoàn toàn tuyến đường không nên.

Tôi đã thấy một nơi nào đó ở đây một chức năng để kiểm tra là người dùng nằm trong một đa giác như thế này, nhưng tôi cần biết cách tính đa giác.

Mọi đề xuất?

EDIT:

Tôi đang xem xét việc sử dụng đơn giản distanceTo() để chỉ cần vẽ một vòng tròn tưởng tượng và kiểm tra xem người dùng là ở đó. Điều đó là tốt bởi vì rất đơn giản để thực hiện và hiểu, và xấu bởi vì để đảm bảo người dùng dễ dàng nhất vượt qua whithin trạm kiểm soát, tôi sẽ cần bán kính lớn, làm cho người dùng chính xác vào khu vực điểm kiểm tra sớm hơn dự kiến.

Và chỉ để các bạn hiểu rõ hơn tình huống, đây là ứng dụng được cho là được sử dụng trong giao thông (ô tô hoặc xe buýt), và các trạm kiểm soát phải là cột mốc hoặc các điểm phân chia tuyến đường của bạn. nơi kẹt xe bắt đầu hoặc dừng lại.

+0

Tại sao bạn cần đa giác thay vì sử dụng vòng tròn bên trong? – SERPRO

Trả lời

2

Bạn chỉ có thể kiểm tra khoảng cách giữa hai, giả sử bạn biết định vị của trạm kiểm soát.

Sử dụng hàm distanceTo và thiết lập ngưỡng của nhiều mét mà người dùng cần phải từ điểm kiểm tra để tiếp tục.

Sửa

Vì bạn muốn tránh distanceTo, đây là một chức năng nhỏ tôi đã viết một thời gian trở lại để kiểm tra xem một điểm là trong một đa giác:

public boolean PIP(Point point, List<Point> polygon){ 
    boolean nodepolarity=false; 
    int sides = polygon.size(); 
    int j = sides -1; 
    for(int i=0;i<sides;i++){ 
     if((polygon.get(i).y<point.y && polygon.get(j).y>=point.y) ||(polygon.get(j).y<point.y && polygon.get(i).y>=point.y)){ 
      if (polygon.get(i).x+(point.y-polygon.get(i).y)/(polygon.get(j).y-polygon.get(i).y)*(polygon.get(j).x-polygon.get(i).x)<point.x) { 
       nodepolarity=!nodepolarity; 
      } 
     } 
    j=i; 
    } 
    return nodepolarity; //FALSE=OUTSIDE, TRUE=INSIDE 
} 

List<Point> polygon là danh sách các các điểm tạo thành một đa giác.

Điều này sử dụng số Ray casting algorithm để xác định số lượng giao lộ mà tia tạo ra thông qua đa giác.

Tất cả những gì bạn cần làm là tạo 'ranh giới' xung quanh khu vực bạn cần với GeoPoints được dịch sang pixel bằng phương pháp toPixels.

Lưu các điểm đó vào Danh sách <> của các điểm và bạn sẽ được thiết lập.

+0

Đó là chính xác những gì tôi đang cố gắng tránh, nếu tôi làm điều này tôi mất một số chính xác, nhưng tôi sẽ xem xét nó nếu tôi không tìm thấy bất cứ điều gì khác. –

+0

@RodrigoCastro Xem chỉnh sửa – MrZander

+0

Thaanks, tôi gần như đã hoàn tất việc tạo vùng (tôi thực sự đã thay đổi định nghĩa về những gì tôi muốn sau khi suy nghĩ thêm về nó). Tôi đã chỉnh sửa câu hỏi bằng một hình ảnh mới (và tốt hơn) hiển thị những gì tôi muốn. –

1

Tôi biết đây là một câu hỏi cũ, nhưng có thể nó sẽ hữu ích cho ai đó.

Đây là phương pháp đơn giản hơn, cần ít tính toán hơn nhiều. Điều này sẽ không kích hoạt lần đầu tiên người dùng đến bên trong vùng ngưỡng, nó chỉ nhận được điểm gần nhất mà người dùng đã vượt qua gần điểm kiểm tra và (s) anh ta đã đến đủ gần.

Ý tưởng là duy trì danh sách 3 khoảng cách cho mỗi điểm kiểm tra, với ba khoảng cách cuối cùng trong đó (vì vậy nó sẽ là [d (t), d (t-1), d (t-2) ]). Danh sách này nên được luân chuyển trên mọi phép tính khoảng cách.

Nếu trên bất kỳ khoảng cách nào, khoảng cách d (t-1) trước đó nhỏ hơn d hiện tại d (t) và lớn hơn d trước (t-2), thì điểm di chuyển đã vượt qua điểm kiểm tra. Cho dù đây là một sự vượt qua thực sự, hoặc nó chỉ là một trục trặc, có thể được quyết định bằng cách kiểm tra khoảng cách thực tế d (t-1).

private long DISTANCE_THRESHOLD = 2000; 

private Checkpoint calculateCheckpoint(Map<Checkpoint, List<Double>> checkpointDistances) 
{ 
    Map<Checkpoint, Double> candidates = new LinkedHashMap<Checkpoint, Double>(); 
    for (Checkpoint checkpoint: checkpointDistances.keySet()) 
    { 
     List<Double> distances = checkpointDistances.get(checkpoint); 
     if (distances == null || distances.size() < 3) 
      continue; 
     if (distances.get(0) > distances.get(1) && distances.get(1) < distances.get(2) && distances.get(1) < (DISTANCE_THRESHOLD)) //TODO: make this depend on current speed 
      candidates.put(checkpoint, distances.get(1)); 
    } 

    List<Entry<Checkpoint, Double>> list = new LinkedList<Entry<Checkpoint,Double>>(candidates.entrySet()); 
    Collections.sort(list, comp); 

    if (list.size() > 0) 
     return list.get(0).getKey(); 
    else 
     return null; 
} 

Comparator<Entry<Checkpoint, Double>> comp = new Comparator<Entry<Checkpoint,Double>>() 
{ 
    @Override 
    public int compare(Entry<Checkpoint, Double> o1, Entry<Checkpoint, Double> o2) 
    { 
     return o1.getValue().compareTo(o2.getValue()); 
    } 
}; 

Hàm nhận được một tham số - Map<Checkpoint, List<Double>> với các điểm kiểm tra và danh sách ba khoảng cách cuối cùng. Nó xuất ra Checkpoint gần nhất hoặc null (nếu không có). Các DISTANCE_THRESHOLD nên được lựa chọn một cách khôn ngoan. Comparator chỉ là để có thể sắp xếp các trạm kiểm soát dựa trên khoảng cách của họ cho người dùng để có được gần nhất.

Tự nhiên điều này có một số sai sót nhỏ, ví dụ: nếu điểm di chuyển đang di chuyển chéo, hoặc chuyển động lỗi từ độ chính xác GPS là tương xứng với tốc độ thực của người dùng, điều này sẽ cho nhiều điểm vượt qua, nhưng điều này sẽ ảnh hưởng đến hầu hết mọi thuật toán.

+0

Cảm ơn, tôi không làm việc nữa trong dự án ban đầu nhưng điều này có lẽ sẽ giúp tôi với một dự án sắp tới về theo dõi xe buýt! –

+0

Và tôi nghĩ có lẽ nên duy trì nhiều hơn 3 điểm trong bộ nhớ cùng lúc để kiểm tra sự mâu thuẫn, điều này có thể gợi ý GPS ổn định, thay vì dữ liệu thực tế cho thấy người dùng đã rời khỏi khu vực –

+1

@ rodrigo- castro Yep, 3 điểm là tối thiểu tuyệt đối để giải quyết vấn đề. Nhiều điểm hơn sẽ làm giảm xác suất lỗi, nhưng làm phức tạp mã. Có lẽ điều này nên được để lại cho một số thuật toán thông minh hơn (có thể là chip GPS chính nó), mà sẽ lọc ra jitter của phép đo và chỉ cung cấp các dữ liệu phong trào thực/hiệu quả. Đây là một vấn đề khác. :) – Tylla

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