【问题标题】:How we calculate distance between two co-ordinate. ArangoDB我们如何计算两个坐标之间的距离。 ArangoDB
【发布时间】:2016-08-11 19:20:59
【问题描述】:

我有一个包含每个用户的纬度和经度属性的用户表。所以我需要在 AQL Query 中计算两个用户之间的距离。

我在 Orientdb 中用下面的查询做了同样的事情。

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

【问题讨论】:

    标签: node.js distance arangodb aql


    【解决方案1】:

    首先,创建一个 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 控制台。默认情况下,这将使用_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

    【讨论】:

      【解决方案2】:

      目前,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 中进行算术运算。

      我将很快编辑这篇文章,提供更多详细信息和示例。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-12
        • 2018-06-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-12
        • 2016-07-16
        相关资源
        最近更新 更多