2 つの都市間の距離の計算 [終了]
-
09-06-2019 - |
質問
2 つの都市間の距離はどのように計算しますか?
解決
地球の曲率を考慮する必要がある場合、探しているのは大圏距離です。 ウィキペディアの記事 おそらく私よりも公式がどのように機能するかを説明するのが上手です。 この航空公式ページ さらに詳しく説明します。
ただし、数式はパズルの最初の部分にすぎません。これを任意の都市で機能させる必要がある場合は、緯度/経度を取得するための位置データベースが必要になります。幸いなことに、これは以下から無料で入手できます Geonames.org, 、ただし、商用の DB も利用できます (Google に問い合わせてください)。したがって、一般的には、必要な 2 つの都市を検索し、緯度と経度の座標を取得して、次のように式に代入します。 ウィキペディアの実際の例.
その他の提案:
- 完全な商用ソリューションにはあります PCマイラー これは、多くのトラック輸送会社が出荷率を計算するために使用しています。
- Google マップ (またはその他) API を呼び出します。1 日に多くのリクエストを実行する必要がある場合は、結果をサーバーにキャッシュすることを検討してください。
- また とても重要な 都市、郊外、町などの等価性データベースの構築を検討することです。データをグループ化する必要があると考えられる場合。ただし、これは非常に複雑になるため、問題に対して万能の解決策が見つからない場合もあります。
最後になりますが、ジョエルは少し前にこの問題に関する記事を書きましたので、ここに載せておきます。 新機能:仕事探し
他のヒント
あなたが使用するのは、 ハバシン式.
これは、SQL Server 2008 の地理タイプを使用して非常に簡単に実行できます。
SELECT geography::Point(lat1, lon1, 4326).STDistance(geography::Point(lat2, lon2, 4326))
-- computes distance in meters using eliptical model, accurate to the mm
4326 は、WGS84 楕円体地球モデルの SRID です。
を使用できます あ* この 2 つの都市間の最短経路を見つけるアルゴリズムがあり、これにより距離が求められます。
地球のような実際の球形の惑星上の 2 つの現実の都市間の最短距離について話している場合、次の値が必要になります。 大圏距離.
飛行機内で仕事をしていて、 ユークリッド距離 「カラスの飛ぶように」:
// Cities are points x0,y0 and x1,y1 in kilometers or miles or Smoots[1]
dx = x1 - x0;
dy = y1 - y0;
dist = sqrt(dx*dx + dy*y);
三角関数は必要ありません。ただ ピタゴラスの定理 そして、平方は常に正であるため、dx = abs(x1 - x0) などは必要ありません。sqrt() に渡す正の数を取得します。
おそらくこれを 1 行で実行でき、コンパイラは次のことを行うことに注意してください。 おそらく 上記のコードと同等のものを削減します。
dist = sqrt((x1-x0)*(x1-x0) + (y1-y0)*(y1-y0));
グーグルマップAPIから2つの都市間の距離を取得できます。これをPythonで実装したものがこちらです
#!/usr/bin/python
import requests
from sys import argv
def get_distance(origin,destination):
gmap='http://maps.googleapis.com/maps/api/distancematrix/json'
payload={"origins":origin,"destinations":destination,"sensor":'false' }
try:
a=requests.get(gmap,params=payload)
data = a.json()
origin = str(data['origin_addresses'][0])
destination= str(data['destination_addresses'][0])
distance = data['rows'][0]['elements'][0]['distance']['text']
return distance,origin,destination
except Exception,e:
print "The %s or %destination does not exists :(" %(origin,destination)
exit()
if __name__=="__main__":
if len(argv)<3:
print "sorry Check the format"
else:
origin=argv[1]
destination=argv[2]
distance,origin,destination=get_distance(origin,destination)
print "%s ---> %s : %s" %(origin,destination,distance)
リンク例: https://gist.github.com/sarathsp06/cf063e47bcc515b51c84
都市の緯度/経度を見つけて、距離推定アルゴリズムを使用して緯度/経度座標を求めます。
コード例が必要な場合は、家で掘り出せるものがあると思いますが、以前の回答の多くと同様に、計算を行うには長い/緯度のデータベースが必要です
2 つの都市間の距離を取得するには、ルックアップ テーブルを使用することをお勧めします。
これは、距離を計算する式が非常に計算的に集中的に計算されるため、理にかなっています。※都市間の距離は変わらないと思われます。
したがって、必要性が非常に具体的でない限り (衛星などからの地形マッピングや地形アルゴリズムなど)、都市と都市間の距離のリストをテーブルに保存し、必要に応じて検索するだけで済みます。
最近これを使ってたくさんの仕事をしています。SQL2008 の新機能により、これが本当に簡単になることがわかりました。100k レコード テーブルの Xkm 以内にあるすべてのポイントを 2 秒未満の時間で見つけることができます。それほど粗末なものではありません。
私のテストにおける大圏 (球形の仮定) 法は、ヴィンセンティの公式 (地球の正体である楕円体仮定) と比較すると、約 2.5 マイル離れていました。
本当のコツは緯度と経度を取得することです。そのために私は Google を使用しています。
@Jared - コード例の小さな修正。最初のコード例の最後の行は次のようになります。
dist = sqrt(dx*dx + dy*dy);
情報を取得したら、それが変更されない場合は、何らかの方法で保存することに同意します。@Marko Tinto T-SQL サンプルをありがとう。SQL Server にアクセスできない場合、または別の方法を希望する場合:高い精度が必要な場合はチェックしてください Vincenty アルゴリズムに関する Wikipedia のエントリ 詳細については。js 実装があると思いますが、これは (まだない場合でも) 他の言語に簡単に移植できます。また、そのページの一番下には、 地理ライブラリ, これは、Vincenty アルゴリズムよりも 1000 倍正確であると主張しています (それほど優れたデータがある場合は、重要になる可能性があります)。
なぜ Vincenty メソッドのようなものを使用するのでしょうか?なぜなら、地球は完全な球体ではなく、そのような方法を使用すると、地球をモデル化するためにより正確な長軸と短軸を入力できるからです。
私が使う 距離 とてもシンプルでクリーン