2017-08-26 110 views
5

MongoDB'deki birçok GeoJSON puanı arasındaki rota mesafesini nasıl hesaplayabilirim? Öğeleri tarihe göre sıralayan bir veritabanı sorgusu alabilir miyim, sonra noktalar arasındaki mesafeyi hesaplar ve sonuçta toplam mesafeyi hesaplamak için toplamları toplar? Java kullanarak burada da benzer bir resim çizmek çalışırdım,MongoDB'deki birçok GeoJSON puanı arasındaki rota mesafesini nasıl hesaplayabilirim?

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

Evet hesaplamak için. (1) tarihe göre öğeleri sırala (2) noktaları arasındaki mesafeyi hesaplar (3), rota mesafesini hesaplamak için hepsini toplar. Bunları bireysel olarak aramayı deneyin ve çalışmayanlarla geri dönün. – nullpointer

+0

@nullpointer Cevabınız için teşekkürler, her adım için ayrı bir sorgulama için adım 1 ve 2'yi yapabilirim ama adım 3 için bir fikrim yok. Ama asıl mesele performans istiyorum, o yüzden her şeyi yapabileceğim bir yol yok. bir sorgu – mohsenJsh

+0

Üçünü bitirdikten sonra, o zaman performansı düşünebiliriz, değil mi? Şaşırtıcı olmak istemiyorum, neyin işe yaradığını, neyin işe yaramadığını, hangi performans sorunlarının karşılaştığınızı (bu gibi detaylar) paylaşın. – nullpointer

cevap

2

olarak hem Açıklamalarda belirttiği: Burada

verilerim bazı örneklerdir.

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; 
} 
Aşağıdaki gibi devam edeceğini belirten

: senin col olarak veritabanı adı db ve koleksiyon adı ve modellenmiştir GeoData olarak belge türünü varsayarsak tarih alanı tarafından

  1. Sıralama öğeleri (diyelim artan sıra)

    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. kullanarak nokta arasındaki mesafeyi hesaplamak

    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. toplamı hepsi rota mesafesini

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