11 Ocak 2019 Cuma

Spherical Konum Hesaplama Formülleri - Distance ve Azimuth ile Son Noktayı Bulmak

Giriş
"Calculate end point (latitude/longitude) given a starting point, distance, and azimuth" konusu ile ilgili.

Law of Cosines (spherical) cos(b) = sin(a)*sin(c) + cos(a)*cos(c)*cos(B)
Law of Sines (spherical) sin (B)/sin(b) = sin(A)/sin(a) = sin(C)/sin(c)

Bu formülde

- b iki nokta arasındaki açı mesafesi (angular distance in radians)

- a ikinci noktanın kuzey kutbuna göre enlem farkı yani
a = 90 - lat2

- c ilk noktanın kuzey kutbuna göre enlem farkı yani
c = 90 - lat1

- B iki nokta arasındaki boylam farkı yani
B = lon2 - lon1,

Formül şöyle
cos (b) = cos (90 - lat2) * cos (90 - lat1) + sin (90 - lat2) * sin (90 - lat1) * cos (lon2 - lon1)

b'yi elde etmek için
b = arccos ( cos (90 - lat2) * cos (90 - lat1) + sin (90 - lat2) * sin (90 - lat1) * cos (lon2 - lon1) )

Bu formülden elimize angular distance in radians biirmi geçer.

arc length = (radius) *(angular distance in radians)
distance = (Earth Radius) *  (angular distance in radians)

b yani (angular distance in radians) = distance / (Earth Radius)

lat2'yi Bulmak
Eğer a'yı bulursak lat2'yi bulmak kolay olur. a'yı bulmak istersek Law of Cosines kullanarak şöyle bir formül elde ediliyor.
a = arccos(cos(b)*cos(c) + sin(c)*sin(b)*cos(azimuth))
a = arccos(cos(b)*cos(90 - lat1) + sin(90 - lat1)*sin(b)*cos(azimuth))
En son olarak şöyle yaparız
lat2 = 90 - a

long2'yi Bulmak
Eğer b'yi bulursak long2'yi bulmak kolay olur. b'yi bulmak istersek Law of Cosines kullanarak şöyle bir formül elde ediliyor.
B = arcsin(sin(b)*sin(azimuth)/sin(a)).
En son olarak şöyle yaparız
lon2 = B + lon1


Örnek
Şöyle yaparız
double distanceInMeters = ...; //meters

double latInRadians = ...;

double longInRadians = ...;

double azimuthInRadians = ...;

double RADIUS_EARTH_WGS84_D = 6_378_000.0;

double distanceInRadians = distanceInMeters / RADIUS_EARTH_WGS84_D;

double posLatInRadians =

  Mat.asin(

    Math.sin(latInRadians) *     Math.cos(distanceInRadians )

    +

    Math.cos(latInRadians) *     Math.sin(distanceInRadians ) * Math.cos(azimuthInRadians)

);

double posLongInRadians = longInRadians +

 Math.atan(

  Math.sin(distanceInRadians ) * Math.sin(azimuthInRadians ) /

  Math.cos(latInRadians ) * Math.sin(distanceInRadians)

  -

  Math.sin(latInRadians ) * Math.sin(distanceInRadians) * Math.cos(azimuthInRadians )

);

Hiç yorum yok:

Yorum Gönder