11

次のように、GPS 位置を x/y 値にマップする関数が必要です。

getXYpos(GeoPoint relativeNullPoint, GeoPoint p){
   deltaLatitude=p.latitude-relativeNullPoint.latitude;
   deltaLongitude=p.longitude-relativeNullPoint.longitude;
   ...
   resultX=latitude (or west to east) distance in meters from p to relativeNullPoint
   resultY=longitude (or south to north) distance in meters from p to relativeNullPoint
}

「2 つのジオポイントの距離」の実装をいくつか見たことがありますが、それらはすべて航空会社の距離を計算するだけです。deltaLongitude はメートルに直接変換できると思いますが、deltaLatitude は経度に依存します。この問題を解決する方法を知っている人はいますか?

4

3 に答える 3

21

まず、緯度経度が逆になっていると思います。経度は X を測定し、緯度は Y を測定します。

緯度は南北の距離に変わりやすいです。360 度は極を通る地球の周りの完全な円であり、その距離は 40008000 メートルであることがわかっています。地球が完全な球体ではないことによる誤差を考慮する必要がない限り、式はdeltaLatitude * 40008000 / 360です。

ご想像のとおり、トリッキーな部分は経度を X に変換することです。どの緯度を使用するかを決定する必要がある緯度に依存するため、出発地の緯度、目的地の緯度、またはその間の任意の地点を選択できます。赤道 (緯度 0) での円周は 40075160 メートルです。与えられた緯度での円の円周はコサインに比例するため、式は になりますdeltaLongitude * 40075160 * cos(latitude) / 360

編集:あなたのコメントは、経度の式に問題があったことを示しています。の呼び出しでラジアンの代わりに度数を使用した可能性がありますcos。これはよくある初歩的な間違いです。あいまいさがないことを確認するために、Python で動作するコードを次に示します。

def asRadians(degrees):
    return degrees * pi / 180

def getXYpos(relativeNullPoint, p):
    """ Calculates X and Y distances in meters.
    """
    deltaLatitude = p.latitude - relativeNullPoint.latitude
    deltaLongitude = p.longitude - relativeNullPoint.longitude
    latitudeCircumference = 40075160 * cos(asRadians(relativeNullPoint.latitude))
    resultX = deltaLongitude * latitudeCircumference / 360
    resultY = deltaLatitude * 40008000 / 360
    return resultX, resultY

X の計算には、relativeNullPoint 緯度を使用することにしました。これには、同じ経度を持つ複数のポイントを変換すると、それらの X が同じになるという利点があります。南北の線は垂直になります。

もう一度編集します。これは非常に単純な式であり、その制限を知っておく必要があることを指摘する必要がありました。明らかに、地球は平らではないため、XY 座標にマッピングしようとすると、ある程度の妥協が必要になります。上で導き出した式は、変換しようとしている領域が平らであると見なせるほど小さく、南北線のわずかな湾曲と非平行性が無視できる場合に最適に機能します。投影をマッピングするための完全な科学があります。いくつかの可能性を見たい場合は、始めるのに適した場所はウィキペディアです。この特定の図法は、エクイレクタンギュラー図法と呼ばれ、スケーリングが追加されています。

于 2010-06-11T17:05:45.313 に答える
2

ハーベシン関数はあなたが必要とするものです。活字で確認してください。距離、方位、中点など、Javascriptの実装が非常にうまく機能しています。

アップデート

別のstackoverflowの質問でHarvesine関数のJava実装を見つけました

于 2010-06-11T16:19:24.383 に答える
1

jstott.me.uk には、これを行うPHPJavaおよびJavascript用のライブラリがあります。

var lld1 = new LatLng(40.718119, -73.995667); // New York
document.write("New York Lat/Long: " + lld1.toString() + "<br />");
var lld2 = new LatLng(51.499981, -0.125313);  // London
document.write("London Lat/Long: " + lld2.toString() + "<br />");
var d = lld1.distance(lld2);
document.write("Surface Distance between New York and London: " + d + "km");
于 2010-06-11T16:25:31.870 に答える