2017-08-26 24 views
5

Làm cách nào để tính khoảng cách tuyến giữa nhiều điểm GeoJSON trong MongoDB? Tôi có thể có một truy vấn cơ sở dữ liệu sắp xếp các mục theo trường ngày của họ, sau đó tính toán khoảng cách giữa các điểm và cuối cùng tổng tất cả để tính tổng khoảng cách?Làm cách nào để tính khoảng cách tuyến giữa nhiều điểm GeoJSON trong MongoDB?

Dưới đây là một số ví dụ về dữ liệu của tôi:

{ 
_id: 599cfc236ed0d81c98007f66 
tracerId: 59a07ea26ed0d81d78001acd 
loc { 
     type: "2dsphere", 
     coordinates: [ 159.9, -37.92 ] 
    }, 
date: 2017-08-26 00:16:42, 
speed: 58, 
} 
{ 
_id: 59a074d46ed0d81d78001acc 
tracerId: 59a07ea26ed0d81d78001acd 
loc { 
     type: "2dsphere", 
     coordinates: [ 160, -38.20 ] 
    }, 
date: 2017-08-26 00:18:42, 
speed: 75, 
} 
{ 
_id: 59a074d46ed0d81d78ac11cc 
tracerId: 59a07ea26ed0d81d78001acd 
loc { 
     type: "2dsphere", 
     coordinates: [ 160.222, -38.92 ] 
    }, 
date: 2017-08-26 00:20:42, 
speed: 60, 
} 
+0

Yes. (1) sắp xếp các mục theo trường ngày (2) tính toán khoảng cách giữa các điểm (3) tổng hợp tất cả chúng để tính toán khoảng cách tuyến đường. Hãy thử tìm kiếm những cá nhân và sự trở lại với những gì không hoạt động. – nullpointer

+0

@nullpointer cảm ơn câu trả lời của bạn, cho truy vấn riêng biệt cho mỗi bước tôi có thể làm bước 1 và 2 nhưng không có ý tưởng cho bước 3. Nhưng vấn đề thực sự là tôi muốn hiệu suất vì vậy không có cách nào tôi có thể làm tất cả một truy vấn. – mohsenJsh

+0

Một khi bạn đã làm xong cả ba, chúng ta có thể nghĩ về hiệu suất sau đó, đúng không? Không muốn khó hiểu, chia sẻ những gì đang hoạt động, những gì không hoạt động, những vấn đề về hiệu năng mà bạn đang gặp phải (chi tiết như vậy) trong câu hỏi để cải thiện nó. – nullpointer

Trả lời

2

Như đã chỉ ra trong các ý kiến ​​là tốt, sẽ cố gắng để vẽ một bức tranh tương tự ở đây sử dụng Java. Giả sử cơ sở dữ liệu của bạn tên db và bộ sưu tập tên như col và các loại tài liệu như GeoData có thể được mô hình hóa như:

public class GeoData { 
    String tracerId; 
    Location loc; 
    Date date; 
    Integer speed; 
    ...getters, setters and other overrides 
} 

public class Location { 
    String type; 
    Coordinate coordinates; 
} 

public class Coordinate { 
    double x; 
    double y; 
} 

Nó sẽ tiến hành như sau:

  1. Sắp xếp tài liệu của trường ngày (giả sử theo thứ tự tăng dần)

    MongoDatabase database = getDatabase("db"); 
    MongoCollection<GeoData> collection = database.getCollection("col", GeoData.class); 
    Bson sortFilter = Filters.eq("date", "1"); //sort ascending 
    List<GeoData> geoData = Lists.newArrayList(collection.find().sort(sortFilter)); 
    
  2. Tính khoảng cách giữa các điểm sử dụng c = square root of [(xA-xB)^2+(yA-yB)^2]

    private static double distanceBetweenCoordinates(Coordinate a, Coordinate b) { 
        return Math.sqrt(Math.pow(b.getX() - a.getX(), 2) + Math.pow(b.getY() - a.getY(),2)); 
    } 
    
  3. Sum tất cả trong số họ để tính toán lộ trình khoảng cách

    double routeDist = 0.0; 
    for (int i = 0; i < geoData.size()-1; i++) { 
        routeDist += distanceBetweenCoordinates(geoData.get(i+1).getLoc().getCoordinates(), geoData.get(i+1).getLoc().getCoordinates()); 
    } 
    
Các vấn đề liên quan