[s]
)
[PNG image (231.08 KB)] |
이미지 출처(wikipedia)(https://en.wikipedia.org/wiki/Latitude#/media/File:Latitude_and_longitude_graticule_on_a_sphere.svg) |
"도(D)", "분(M)", "초(S)" 를 각각 D, M, S 로 저장하고 다음과 같이 계산을 도출할수 있습니다. DD = D + (M / 60) + (S / 3600)
D = int(DD) /* DD(Decimal Degree)의 정수부만 취함 */ TEMP = (DD - D) * 60 /* DD(Decimal Degree)의 소수부에 60을 곱함 */ M = int(TEMP) /* TEMP의 정수부만 취함 */ S = (TEMP - D) * 60 /* TEMP의 소수부에 60을 곱함 */
#define def_hwport_pi (3.14159265358979323846) double s_earth_round; double s_radian; double s_lat[2]; double s_lon[2]; double s_lat_radian[2]; double s_lon_delta_radian; double s_distance; double s_result; /* 지구의 추상화된 구형의 반지름 */ s_earth_round = 6371000.0; s_radian = def_hwport_pi / 180.0; /* 서울특별시청 위치 */ s_lat[0] = 37.566788; /* 위도 */ s_lon[0] = 126.978039; /* 경도 */ /* 부산시청 위치 */ s_lat[1] = 35.180202; /* 위도 */ s_lon[1] = 129.075388; /* 경도 */ /* 단위를 라디안(radian)으로 변환 */ s_lat_radian[0] = s_lat[0] * s_radian; s_lat_radian[1] = s_lat[1] * s_radian; s_lon_delta_radian = (s_lon[0] - s_lon[1]) * s_radian; s_distance = sin(s_lat_radian[0]) * sin(s_lat_radian[1]); s_distance = s_distance + cos(s_lat_radian[0]) * cos(s_lat_radian[1]) * cos(s_lon_delta_radian); s_result = round(s_earth_round * acos(s_distance)); (void)fprintf(stdout, "%f m\n", s_result); /* 이 예제에서는 대략 "서울특별시청"과 "부산시청"간의 거리는 325km로 나옵니다. */
#define def_hwport_pi (3.14159265358979323846) double s_earth_radius[2]; double s_earth_distance[2]; double s_lat[2]; double s_lon[2]; double s_lat_delta; double s_lon_delta; double s_lat_distance; double s_lon_distance; double s_result; /* 지구의 반지름 */ s_earth_radius[0] = 6356700.0; /* 극(極)반지름 */ s_earth_radius[1] = 6378100.0; /* 적도(赤道, Equator)반지름 */ /* 지구의 둘레 (2pi * R) */ s_earth_distance[0] = s_earth_radius[0] * (2.0 * def_hwport_pi); s_earth_distance[1] = s_earth_radius[1] * (2.0 * def_hwport_pi); /* 서울특별시청 위치 */ s_lat[0] = 37.566788; /* 위도 */ s_lon[0] = 126.978039; /* 경도 */ /* 부산시청 위치 */ s_lat[1] = 35.180202; /* 위도 */ s_lon[1] = 129.075388; /* 경도 */ /* 위도, 경도 각각의 변위값 */ s_lat_delta = (s_lat[0] >= s_lat[1]) ? s_lat[0] - s_lat[1] : s_lat[1] - s_lat[0]; s_lon_delta = (s_lon[0] >= s_lon[1]) ? s_lon[0] - s_lon[1] : s_lon[1] - s_lon[0]; /* 미터단위로 변환 */ #if 0L /* 위도에 따른 경도간의 거리는 다르기 때문에 이 부분은 적도지역에서만 유효한 공식입니다. */ s_lat_distance = (s_lat_delta * s_earth_distance[0]) / 360.0; s_lon_distance = (s_lon_delta * s_earth_distance[1]) / 360.0; #else /* 대한민국이 위치한 위도 37°만을 고려한 경도 1°간의 거리를 기준으로 계산하는 방법입니다. (위도에 따른 경도간의 거리를 산출할수 있다면 보다 개선될수 있겠죠.) */ s_lat_distance = (s_lat_delta * s_earth_distance[0]) / 360.0; s_lon_distance = s_lon_delta * 88907.949 /* 위도 37°에서 경도 1°간의 거리는 약 88907.949m 로 계산하였습니다. */; #endif /* 피타고라스의 정리에 따른 삼각형 dx(경도의 변위 거리), dy(위도의 변위 거리)를 가지고 distance(거리)를 구합니다. (distance^2 = dx^2 + dy^2) */ s_result = round(sqrt(pow(s_lat_distance, 2.0) + pow(s_lon_distance, 2.0))); (void)fprintf(stdout, "%f m\n", s_result); /* 이 예제에서는 대략 "서울특별시청"과 "부산시청"간의 거리는 324km로 나옵니다. */ /* IMPORTANT!!! 지구는 둥글고 위도간 경도의 거리는 차이가 있기 때문에 극지방에 가까워지거나 위도의 차이가 큰 지점간의 계산은 이 방법으로는 오차가 커지게 됩니다. 하지만 대한민국 정도의 내륙땅에서의 지점간 거리는 그 오차가 무시할 수준으로 볼수도 있기에 활용할수 있는 방법이기도 합니다. */
function hwport_wgs84_degree_distance(s_latitude1, s_longitude1, s_latitude2, s_longitude2) { var def_hwport_pi = 3.14159265358979323846264338327950288; var cg_earth_round = 6371000.0; var s_latitude_radian1; var s_latitude_radian2; var s_longitude_delta_radian; var s_distance; s_latitude_radian1 = s_latitude1 * def_hwport_pi / 180.0; s_latitude_radian2 = s_latitude2 * def_hwport_pi / 180.0; s_longitude_delta_radian = (s_longitude1 - s_longitude2) * def_hwport_pi / 180.0; s_distance = Math.sin(s_latitude_radian1) * Math.sin(s_latitude_radian2); s_distance = s_distance + Math.cos(s_latitude_radian1) * Math.cos(s_latitude_radian2) * Math.cos(s_longitude_delta_radian); return(cg_earth_round * Math.acos(s_distance)); }
SELECT ROUND( 6371000.0 * ACOS( COS(RADIANS(latitude1)) * COS(RADIANS(latitude2)) * COS(RADIANS(longitude2) - RADIANS(longitude1)) + SIN(RADIANS(latituide1)) * SIN(RADIANS(latitude2)) ), 2) AS distance ...;
[s]
) 와 km/h 간의 단위 변환[s]
)는 줄에 매듭을 지어 바다로 던져 1시간동안 움직인 거리를 측정한 것에서 유래되었습니다.
[s]
)는 바다나 공중에서 사용하는 속도의 단위로서, 선박이나 항공기가 1시간에 1해리(海里, nautical mile, nmile, 약 1,852m)만큼 가는 속도를 1kn(1nmile/h) 라고 합니다.
1knot(kn) = 1nmile/h = 1.852km/h
STX($, 24H) | Checksum range | ETX(*, 2AH), Checksum | End of message indicator (0DH, 0AH) | |
$ | Address, | {<value>} | *<checksum> | <CR><LF> |
$GPGGA,071448.00,3730.96956,N,12705.87558,E,1,04,1.71,31.7,M,18.7,M,,*6E => 07:14:48.000000, 37.5161593333,127.0979263333, Calc=4, HDOP=1.71000000, Alt=31.70000000M, DiWGS84=18.70000000M $GPGSA,A,3,23,26,31,27,,,,,,,,,6.26,1.71,6.02*01 $GPGSV,3,1,09,09,22,313,,16,64,311,,19,19,204,,21,21,080,*72 $GPGSV,3,2,09,23,42,286,18,26,63,028,22,27,52,198,29,29,01,037,*7F $GPGSV,3,3,09,31,43,114,25*46 $GPGLL,3730.96956,N,12705.87558,E,071448.00,A,A*63 => 07:14:48.000000, 37.51615933,127.09792633 $GPRMC,071449.00,A,3730.96979,N,12705.87536,E,0.505,,230415,,,A*7F => 07:14:49.000000, 37.51616317,127.09792267, 0.93526000 km/h, 2015/04/23 $GPVTG,,T,,M,0.505,N,0.935,K,A*2C $GPGGA,071449.00,3730.96979,N,12705.87536,E,1,04,1.71,31.7,M,18.7,M,,*6A => 07:14:49.000000, 37.5161631667,127.0979226667, Calc=4, HDOP=1.71000000, Alt=31.70000000M, DiWGS84=18.70000000M $GPGSA,A,3,23,26,31,27,,,,,,,,,6.26,1.71,6.02*01 $GPGSV,3,1,09,09,22,313,,16,64,311,,19,19,204,,21,21,080,*72 $GPGSV,3,2,09,23,42,286,17,26,63,028,22,27,52,198,29,29,01,037,*70 $GPGSV,3,3,09,31,43,114,26*45 $GPGLL,3730.96979,N,12705.87536,E,071449.00,A,A*67 => 07:14:49.000000, 37.51616317,127.09792267 $GPRMC,071450.00,A,3730.96983,N,12705.87534,E,0.544,,230415,,,A*75 $GPVTG,,T,,M,0.544,N,1.008,K,A*2F $GPGGA,071450.00,3730.96983,N,12705.87534,E,1,04,1.71,31.8,M,18.7,M,,*6A $GPGSA,A,3,23,26,31,27,,,,,,,,,6.26,1.71,6.02*01 $GPGSV,3,1,09,09,22,313,,16,64,311,,19,19,204,,21,21,080,*72 $GPGSV,3,2,09,23,42,286,15,26,63,028,22,27,52,198,29,29,01,037,*72 $GPGSV,3,3,09,31,43,114,26*45 $GPGLL,3730.96983,N,12705.87534,E,071450.00,A,A*68 $GPRMC,071451.00,A,3730.96982,N,12705.87530,E,0.175,,230415,,,A*77 $GPVTG,,T,,M,0.175,N,0.324,K,A*25 $GPGGA,071451.00,3730.96982,N,12705.87530,E,1,04,1.71,31.6,M,18.7,M,,*60 $GPGSA,A,3,23,26,31,27,,,,,,,,,6.26,1.71,6.02*01 $GPGSV,3,1,09,09,22,313,,16,64,311,,19,19,204,,21,21,080,*72 $GPGSV,3,2,09,23,42,286,12,26,63,028,22,27,52,198,29,29,01,037,*75 $GPGSV,3,3,09,31,43,114,26*45 $GPGLL,3730.96982,N,12705.87530,E,071451.00,A,A*6C $GPRMC,071452.00,A,3730.96953,N,12705.87530,E,0.441,,230415,,,A*7A $GPVTG,,T,,M,0.441,N,0.818,K,A*23 $GPGGA,071452.00,3730.96953,N,12705.87530,E,1,04,1.71,31.6,M,18.7,M,,*6F $GPGSA,A,3,23,26,31,27,,,,,,,,,6.25,1.71,6.02*02 $GPGSV,3,1,09,09,22,313,,16,64,311,,19,19,204,,21,21,080,*72 $GPGSV,3,2,09,23,42,286,14,26,63,028,22,27,52,198,29,29,01,037,*73 $GPGSV,3,3,09,31,43,114,26*45 $GPGLL,3730.96953,N,12705.87530,E,071452.00,A,A*63 $GPRMC,071453.00,A,3730.96959,N,12705.87499,E,0.195,,230415,,,A*7F $GPVTG,,T,,M,0.195,N,0.362,K,A*29