訪問者の場所を表す座標 (緯度、経度) を持つ 10e7 ポイントを含む大きな .csv データセットがあります。店舗の場所を表す座標を持つ 10e3 ポイントを含む別のデータセットがあります。
ある種の測地線式を使用して、各訪問者に最も近い店舗を関連付けたいと考えています。
Python (パンダなど) または Google BigQuery で実行できる、非常に高速で効率的なものが必要です。
誰かが私に手がかりを与えることができますか?
訪問者の場所を表す座標 (緯度、経度) を持つ 10e7 ポイントを含む大きな .csv データセットがあります。店舗の場所を表す座標を持つ 10e3 ポイントを含む別のデータセットがあります。
ある種の測地線式を使用して、各訪問者に最も近い店舗を関連付けたいと考えています。
Python (パンダなど) または Google BigQuery で実行できる、非常に高速で効率的なものが必要です。
誰かが私に手がかりを与えることができますか?
これは、DBpedia (v2014) で 21,221 都市の最も近い NOAA 気象観測所を見つける簡単なソリューションです。
#standardSQL
CREATE TEMPORARY FUNCTION distance(lat1 FLOAT64, lon1 FLOAT64, lat2 FLOAT64, lon2 FLOAT64)
RETURNS FLOAT64
LANGUAGE js AS """
var p = 0.017453292519943295; // Math.PI / 180
var c = Math.cos;
var a = 0.5 - c((lat2 - lat1) * p)/2 +
c(lat1 * p) * c(lat2 * p) *
(1 - c((lon2 - lon1) * p))/2;
return 12742 * Math.asin(Math.sqrt(a)); // 2 * R; R = 6371 km
""";
SELECT *
FROM (
SELECT city, country_label, distance, name weather_station, country,
RANK() OVER(PARTITION BY city ORDER BY distance DESC) rank
FROM (
SELECT city, a.country_label, distance(a.lat,a.lon,b.lat,b.lon) distance, b.name, b.country
FROM (
SELECT rdf_schema_label city, country_label, country,
CAST(REGEXP_EXTRACT(point, r'(-?\d*\.\d*)') as FLOAT64) lat,
CAST(REGEXP_EXTRACT(point, r' (-?\d*\.\d*)') as FLOAT64) lon
FROM `fh-bigquery.dbpedia2014temp.City`
WHERE point!='NULL'
) a
JOIN (
SELECT name, country, usaf, wban, lat, lon
FROM `bigquery-public-data.noaa_gsod.stations`
WHERE lat != 0.0 AND lon !=0.0
) b
ON CAST(a.lat as INT64)=CAST(b.lat as INT64)
AND CAST(a.lon as INT64)=CAST(b.lon as INT64)
)
)
WHERE rank=1
警告: