#BigQueryである2地点間の距離を求める方法
###①BigQueryの地理関数ST_GEOGPOINTとST_DISTANCEで求める
※完全な球体として表面上の距離を計算している
###②JavaScriptのユーザー定義関数(UDF)で求める
https://cloud.google.com/bigquery/docs/reference/standard-sql/user-defined-functions?hl=ja#javascript-udf-structure
早速、任意の位置情報を2列用意して実践してみた
CREATE TEMP FUNCTION distance(lon1 FLOAT64, lat1 FLOAT64, lon2 FLOAT64, lat2 FLOAT64)
RETURNS FLOAT64
LANGUAGE js AS """
lon1 *= Math.PI / 180;
lat1 *= Math.PI / 180;
lon2 *= Math.PI / 180;
lat2 *= Math.PI / 180;
return 6378.137 * Math.acos(Math.cos(lat1) * Math.cos(lat2) * Math.cos(lon2 - lon1) + Math.sin(lat1) * Math.sin(lat2));
""";
SELECT
name1
,lat1
,lon1
,name2
,lat2
,lon2
,(st_distance(st_geogpoint(lon1, lat1), st_geogpoint(lon2, lat2))) / 1000 as distanceA -- ①
,distance(lon1,lat1, lon2, lat2) as distanceB -- ②
FROM osako.test
2つの方法で求めた距離に多少の誤差はあるものの、計算自体に問題なさそう。
以上!!!