PHPでの郵便番号間の距離の計算
質問
ここから郵便番号とその緯度/経度などのデータベースを取得しました このページ。次のフィールドがあります:
ZIP、緯度、経度、市、州、郡、ZIP_CLASS
データはテキストファイルにありましたが、MySQLテーブルに挿入しました。私の質問は、上記のフィールドを使用して、ユーザーがWebサイトで入力できる2つの郵便番号間の距離を計算するにはどうすればよいですか? PHPで動作するコードを歓迎します
解決
Webサービスにアクセスして距離を計算することもできます。他の人に重い物を持ち上げさせてください。
他のヒント
これは、マジックナンバーに対する注釈付きのマイクの回答です。 一部のテストデータ:
function calc_distance($point1, $point2)
{
$radius = 3958; // Earth's radius (miles)
$deg_per_rad = 57.29578; // Number of degrees/radian (for conversion)
$distance = ($radius * pi() * sqrt(
($point1['lat'] - $point2['lat'])
* ($point1['lat'] - $point2['lat'])
+ cos($point1['lat'] / $deg_per_rad) // Convert these to
* cos($point2['lat'] / $deg_per_rad) // radians for cos()
* ($point1['long'] - $point2['long'])
* ($point1['long'] - $point2['long'])
) / 180);
return $distance; // Returned using the units used for $radius.
}
数学のみで行うことができます...
function calc_distance($point1, $point2)
{
$distance = (3958 * 3.1415926 * sqrt(
($point1['lat'] - $point2['lat'])
* ($point1['lat'] - $point2['lat'])
+ cos($point1['lat'] / 57.29578)
* cos($point2['lat'] / 57.29578)
* ($point1['long'] - $point2['long'])
* ($point1['long'] - $point2['long'])
) / 180);
return $distance;
}
2点間の大圏距離を計算するには、 Haversine公式をご覧ください。いくつかのサンプルがこちら
にあります。ハヴェルシン式:
- R =地球の半径(平均半径= 6,371km)
- Δ lat = lat2− lat1
- Δ long = long2− long1
- a = sin²(Δ lat / 2)+ cos(lat1).cos(lat2).sin²(Δ long / 2)
- c = 2.atan2(√ a、√(1− a))
- d = R.c
(角度は、三角関数に渡すためにラジアン単位である必要があることに注意してください。)
zipテーブルで、距離を取得する2つのポイントの座標(緯度、経度)を取得する必要があります。
その後、SQLまたはPHPで距離を計算できます。この投稿では、両方の方法の概要を説明します。
例の計算は、このスレッドですでに説明した式に基づいています。地球の半径をマイルとキロメートルの両方で提供するため、両方のユニットの2点間の距離を取得できます。
計算の方法には魔法の数字が含まれておらず、地球の半径だけが含まれているため、上記のリンクは素晴らしいです!
所属していません StackOverflow