2016-05-30 210 views
0

我有一个用户表,其中包含每个用户的纬度和经度属性。所以我需要计算AQL查询中两个用户之间的距离。我们如何计算两个坐标之间的距离。 ArangoDB

我在Orientdb中完成了以下查询。

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

回答

2

首先,创建一个js文件distance.js(或任何你想命名它)并将下面的代码放在下面。

/* 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; 

现在打开Arango控制台与arangosh。这将以_system数据库默认打开。所以,如果你有像我这样的数据库,然后使用db._useDatabase("myDatabase")命令来更改数据库。

现在写下面的命令将自定义添加到您想要的数据库。

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) 

版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); 

现在您的AQL使用查询如下。

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

欲了解更多与here参考。

1

目前ArangoDB只能给你的距离,当你使用地理索引来回报您搜索的距离开始,以点符合条件:

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

然而use a user defined AQL function你可以延长AQL 。用户定义的函数在Javascript中实现,幸运的是Chris Veness to explain howto calculate distances

对于ArangoDB 3.0,我们很可能会支持算术运算来计算AQL。

我会很快编辑这篇文章的更多细节和例子。

相关问题