2 つのジオコード間の距離を計算する式は何ですか? このサイトでいくつかの回答を見てきましたが、基本的に SQL Server 08 の機能に頼るように言われていますが、私はまだ 08 ではありません。どんな助けでも大歓迎です。
9 に答える
地球の近似値とHaversine式を使用します。次の URL で JavaScript バージョンを取得できます。このバージョンは、選択した言語に翻訳できます。
http://www.movable-type.co.uk/scripts/latlong.html
ここに別の方法があります: http://escience.anu.edu.au/project/04S2/SE/3DVOT/3DVOT/pHatTrack_Application/Source_code/pHatTrack/Converter.java
SQL Server 2000 版SQL Server 郵便番号緯度経度近接距離検索はこちら
これにより、C#でそれが行われます。
名前空間内にこれらを置きます:
public enum DistanceType { Miles, Kilometers };
public struct Position
{
public double Latitude;
public double Longitude;
}
class Haversine
{
public double Distance(Position pos1, Position pos2, DistanceType type)
{
double preDlat = pos2.Latitude - pos1.Latitude;
double preDlon = pos2.Longitude - pos1.Longitude;
double R = (type == DistanceType.Miles) ? 3960 : 6371;
double dLat = this.toRadian(preDlat);
double dLon = this.toRadian(preDlon);
double a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2) +
Math.Cos(this.toRadian(pos1.Latitude)) * Math.Cos(this.toRadian(pos2.Latitude)) *
Math.Sin(dLon / 2) * Math.Sin(dLon / 2);
double c = 2 * Math.Asin(Math.Min(1, Math.Sqrt(a)));
double d = R * c;
return d;
}
private double toRadian(double val)
{
return (Math.PI / 180) * val;
}
次に、これらをメイン コードで使用します。
Position pos1 = new Position();
pos1.Latitude = Convert.ToDouble(hotelx.latitude);
pos1.Longitude = Convert.ToDouble(hotelx.longitude);
Position pos2 = new Position();
pos2.Latitude = Convert.ToDouble(lat);
pos2.Longitude = Convert.ToDouble(lng);
Haversine calc = new Haversine();
double result = calc.Distance(pos1, pos2, DistanceType.Miles);
ここで他の人が提示したピタゴラスの定理はうまく機能しません。
最善の簡単な答えは、地球を球体として近似することです (実際には少し平らな球体ですが、これは非常に近い球体です)。たとえば、Haskell では、次のように使用できますが、数学はほとんど何にでも変換できます。
distRadians (lat1,lon1) (lat2,lon2) =
radius_of_earth *
acos (cos lat1 * cos lon1 * cos lat2 * cos lon2 +
cos lat1 * sin lon1 * cos lat2 * sin lon2 +
sin lat1 * sin lat2) where
radius_of_earth = 6378 -- kilometers
distDegrees a b = distRadians (coord2rad a) (coord2rad b) where
deg2rad d = d * pi / 180
coord2rad (lat,lon) = (deg2rad lat, deg2rad lon)
distRadians
角度をラジアンで指定する必要があります。
distDegrees
緯度と経度を度単位で取得できるヘルパー関数です。
この式の導出に関する詳細については、この一連の投稿を参照してください。
地球が楕円体であると仮定して追加の精度が本当に必要な場合は、次の FAQ を参照してください: http://www.movable-type.co.uk/scripts/gis-faq-5.1.html
球上の 2 点間の大円経路の長さを探しています。Google で「Great Circle Path」または「Great Circle Distance」を検索してみてください。
申し訳ありませんが、あなたがどこの国にいるのかもわかりません。Easting と Northings (英国、Ordance Survey システム) または Lat/Long またはその他のシステムについて話しているのでしょうか? Easting と Northing について話している場合は、
sqr((x1-x2)^2 + (y1-y2)^2)
を使用できます。気づきません。郡内の地点間の距離を測るために職場で使用しています。
使用するグリッド参照の長さに注意してください。8 桁の参照でメートル単位の距離が得られると思います。他の誰も答えてくれなければ、来週職場で明確な答えを得ることができるでしょう。
ピタゴラスの定理?