2016-05-30 209 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。

我會很快編輯這篇文章的更多細節和例子。

相關問題