2017-08-26 108 views
5

Jak obliczyć odległość trasy między wieloma punktami GeoJSON w MongoDB? Czy mogę mieć zapytanie do bazy danych, które sortuje elementy według ich pola daty, a następnie oblicza odległość między punktami i ostatecznie sumuje wszystkie, aby obliczyć całkowitą odległość?Jak obliczyć odległość trasy między wieloma punktami GeoJSON w MongoDB?

Oto kilka przykładów moich danych:

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

Tak. (1) sortuj elementy według daty (2) oblicz odległość między punktami (3), sumując je wszystkie, aby obliczyć odległość trasy. Spróbuj poszukać tych indywidualnie i powróć z tym, co nie działa. – nullpointer

+0

@nullpointer dziękuję za odpowiedź, dla oddzielnego zapytania dla każdego kroku mogę zrobić krok 1 i 2, ale nie mam pomysłu na krok 3. Ale prawdziwym problemem jest to, że chcę wydajności, więc nie ma sposobu, abym mógł zrobić wszystko z jedno zapytanie. – mohsenJsh

+0

Gdy skończysz ze wszystkimi trzema, możemy myśleć o wydajności, prawda? Nie chcę się zastanawiać, dzielić się tym, co działa, co nie działa, z jakimi problemami z wydajnością masz do czynienia (takimi szczegółami), aby je poprawić. – nullpointer

Odpowiedz

2

Jak wskazano w komentarzach, a także, by spróbować narysować podobny obraz tutaj używając Java. Zakładając, że nazwa db i gromadzenie bazy danych nazwę jak col i rodzaj dokumentu jako GeoData które mogą być modelowane jako:

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

Byłoby postępować w następujący sposób:

  1. Sortuj pozycje według daty pola (powiedzmy w rosnącej kolejności)

    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. obliczenia odległości między punktami wykorzystaniem 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. Suma wszystkich z nich obliczyć odległość trasy

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