2

訪問者の場所を表す座標 (緯度、経度) を持つ 10e7 ポイントを含む大きな .csv データセットがあります。店舗の場所を表す座標を持つ 10e3 ポイントを含む別のデータセットがあります。

ある種の測地線式を使用して、各訪問者に最も近い店舗を関連付けたいと考えています。

Python (パンダなど) または Google BigQuery で実行できる、非常に高速で効率的なものが必要です。

誰かが私に手がかりを与えることができますか?

4

2 に答える 2

3

これは、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

警告:

  • https://stackoverflow.com/a/22476600/132438の距離式を使用します
  • 都市より同じINT(lat)、INT(lon)にある駅のみを検索してJOINを制限して最適化します。これを改善することは可能ですが、別の質問に任せます。

ここに画像の説明を入力

于 2016-11-16T13:19:06.237 に答える