まず、緯度と経度が逆になっていると思います。経度は 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 座標にマッピングしようとすると、ある程度の妥協が必要になります。上で導き出した式は、変換しようとしている領域が平らであると見なせるほど小さく、南北線のわずかな湾曲と非平行性が無視できる場合に最適に機能します。投影をマッピングするための完全な科学があります。いくつかの可能性を見たい場合は、始めるのに適した場所はウィキペディアです。この特定の図法は、エクイレクタンギュラー図法と呼ばれ、スケーリングが追加されています。