2016-05-30 6 views
0

Ich habe eine Benutzer-Tabelle, die Breiten- und Längengrad-Attribut für jeden Benutzer enthält. Also muss ich den Abstand zwischen zwei Benutzern in AQL-Abfrage berechnen.Wie berechnen wir den Abstand zwischen zwei Koordinaten. ArangoDB

Ich habe das gleiche in Orientdb mit der folgenden Abfrage gemacht.

var laltitude = CURRENT_USER_laltitude; 
var longitude = CURRENT_USER_longitude; 
var query = "select distance(latitude, longitude,"+laltitude+","+longitude+") as distance from users"; 

Antwort

2

Zuerst erstellen Sie eine js-Datei distance.js (oder was auch immer Sie wollen, um es zu nennen) und legen Sie den folgenden Code wie folgt.

/* distance.js */ 
'use strict'; 

function gdistance(latitude1, longitude1, latitude2, longitude2, radius) { 
    if (!latitude1 || !longitude1 || !latitude2 || !longitude2) { 
     return null; 
    }; 

    var lat1 = Number(latitude1), lon1 = Number(longitude1); 
    var lat2 = Number(latitude2), lon2 = Number(longitude2); 

    radius = (radius === undefined) ? 6371e3 : Number(radius); 

    var R = radius; 
    var φ1 = (lat1 * Math.PI/180), λ1 = (lon1 * Math.PI/180); 
    var φ2 = (lat2 * Math.PI/180), λ2 = (lon2 * Math.PI/180); 
    var Δφ = φ2 - φ1; 
    var Δλ = λ2 - λ1; 

    var a = Math.sin(Δφ/2) * Math.sin(Δφ/2) 
      + Math.cos(φ1) * Math.cos(φ2) 
      * Math.sin(Δλ/2) * Math.sin(Δλ/2); 
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
    var d = R * c;  // Meters 
    var d2 = d/1000; // Meters to KM 
    return d2; 
} 

module.exports = gdistance; 

jetzt offen Arango Konsole mit arangosh. Dies wird standardmäßig mit _system Datenbank geöffnet. Also, wenn Sie andere als diese Datenbank wie mich haben, dann verwenden Sie db._useDatabase("myDatabase") Befehl, um die Datenbank zu ändern.

Schreiben Sie nun die folgenden Befehle, um benutzerdefinierte Daten zu Ihrer gewünschten Datenbank hinzuzufügen. abfragt, wie unten

Version 2,8

db._useDatabase("myDatabase"); 
var aqlfunctions = require("org/arangodb/aql/functions"); 
var f = require("/path/to/file/distance.js"); 
aqlfunctions.register("geo::gdistance", f, true) 

Version 3.0+

db._useDatabase("myDatabase"); 
var aqlfunctions = require("@arangodb/aql/functions"); 
var f = require("/path/to/distance.js"); 

i.e. 
var f = require("/home/ubuntu/distance.js"); 
var f = require("distance.js"); 

# If you want to remove this group's UDFs (User defined functions) 
# aqlfunctions.unregisterGroup("geo"); 
aqlfunctions.register("geo::gdistance", f, true); 

Jetzt in Ihrem AQL verwenden.

LET distance = geo::gdistance(attrbute_name.latitude, attrbute_name.longitude, @your_latitude, @your_longitude) 

Für weitere Referenzen mit here.

1

Derzeit ArangoDB können Sie Entfernungen nur geben, wenn Sie die Geo-Index verwenden Sie die Entfernung Ihrer Suche um zu dem Punkt beginnen, Ihre Bedingung erfüllen:

FOR doc IN WITHIN(@@collection, @lat, @long, @radius, @distanceAttributeName) 
    RETURN doc 

Sie use a user defined AQL function jedoch konnte AQL verlängern . Benutzerdefinierte Funktionen sind in Javascript implementiert, welches glücklicherweise von Chris Veness to explain howto calculate distances

implementiert wird. Mit ArangoDB 3.0 werden wir höchstwahrscheinlich die arithmetischen Operationen unterstützen, um dies in AQL zu berechnen.

Ich werde diesen Beitrag mit weiteren Details und Beispielen in Kürze bearbeiten.