2016-05-30 5 views
0

私はすべてのユーザの緯度と経度の属性を含むUsersテーブルを持っています。だから私はAQLクエリで2人のユーザー間の距離を計算する必要があります。どのように2つの座標間の距離を計算しますか。 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; 

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) 

バージョン今、以下のようにあなたのAQLクエリで使用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); 

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

hereでさらに参照してください。

1

現在ArangoDBだけであなたの距離を与えることができ、あなたの条件に合致したポイントに起動します。ただしuse a user defined AQL functionは、AQLを拡張することができ

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

。ユーザー定義の関数はJavascriptで実装されています。これは運が良かったです。Chris Veness to explain howto calculate distances

ArangoDB 3.0では、これをAQLで計算する算術演算がサポートされています。

私はすぐに詳細と例でこの投稿を編集します。

関連する問題