2017-08-26 49 views
5

如何計算MongoDB中許多GeoJSON點之間的路由距離?我可以有一個數據庫查詢,按日期字段對項目進行排序,然後計算點之間的距離,最後總結所有時間以計算總距離?如何計算MongoDB中多個GeoJSON點之間的路由距離?

這裏是我的數據的一些例子:

{ 
_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

是。 (1)按日期字段對項目進行排序(2)計算點之間的距離(3)將它們全部相加以計算路線距離。試着單獨尋找這些東西,然後回過頭來不起作用。 – nullpointer

+0

@nullpointer謝謝你的回答,爲每個步驟單獨查詢我可以做第1步和第2步,但沒有第3步的想法。 但真正的問題是我想要表現,所以沒有任何辦法我可以做所有一個查詢。 – mohsenJsh

+0

一旦你完成了所有三個,我們可以考慮表現呢,對吧?不想迷惑,分享什麼是工作,什麼不工作,你要面對哪些性能問題(如細節)以改進問題。 – nullpointer

回答

2

正如在評論中指出的,以及,將嘗試在這裏畫一個類似的圖片使用Java。假設你的數據庫名稱db和集合名稱爲col和文檔類型爲GeoData這可以近似爲:

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; 
} 

這將進行如下:按日期場

  1. 的項目進行排序(假設以上升順序)

    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. 計算使用點之間的距離

    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. 總和所有的人都來計算路線距離

    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()); 
    } 
    
相關問題