[英]How we calculate distance between two co-ordinate. ArangoDB
我有一个用户表,其中包含每个用户的经度和纬度属性。 因此,我需要计算AQL查询中两个用户之间的距离。
我在Orientdb中使用以下查询完成了同样的操作。
var laltitude = CURRENT_USER_laltitude;
var longitude = CURRENT_USER_longitude;
var query = "select distance(latitude, longitude,"+laltitude+","+longitude+") as distance from users";
首先,创建一个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;
现在,使用arangosh
打开Arango Console。 默认情况下,它将使用_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)
有关更多信息,请参见此处 。
当前,ArangoDB仅在使用Geo索引返回搜索起点到与您的条件匹配的点的距离时才能为您提供距离:
FOR doc IN WITHIN(@@collection, @lat, @long, @radius, @distanceAttributeName)
RETURN doc
但是,您可以使用用户定义的AQL函数来扩展AQL。 用户定义的函数以Javascript实现,幸运的是Chris Veness使用它来解释如何计算距离
使用ArangoDB 3.0,我们很可能会支持算术运算以在AQL中进行计算。
我将在不久后编辑此帖子,并提供更多详细信息和示例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.