위치정보(GeoLocation) 중 위도(latitude)와 경도(longitude)로 두 지점간 거리(distance) 구하기
HTML5 , CSS3.0, jQTouch 를 활용하여 아이폰 모바일웹 페이지 제작 중
GeoLocation 정보가 있어 위치정보를 활용한 주변검색을 만들어보고자 한다.
(예를 들자면 지금 있는 위치에서 반경 10Km 이내에 존재하는 극장 정보)
DB에 해당 위치의 위도와 경도를 가지고 있다면 아래 Function을 통해 쉽게 주변검색을 구현할 수 있다.
오라클 솔루션의 Oracle Spatial 툴 사용하라는 것과 이에 대한 예제가 대부분..
뭐 우리같은 작은 회사에서 지도 서비스를 하는 것이 아닌지라 .. ㅡㅡ
그렇게 몇 시간을 허비하고 계산하는 Function을 다 만들어갈 때쯤 radians.라는 값에 대해 검색하던 중... 아무튼 어렵게 어렵게 찾았다..ㅜㅜ;
나름 검색에 일가견이 있다 생각하고 있었는데, ㅡㅡ; 챙피하게시리.. ㅋㅋ
이걸 찾아다니는 또 다른 사람들이 많을 것이라 생각되어 바로 포스팅한다.
-----------------------------------------------------------------------------------------
출처 : http://psoug.org/reference/functions.html
-----------------------------------------------------------------------------------------
CREATE OR REPLACE FUNCTION calc_distance(
pLat1 NUMBER,
pLon1 NUMBER,
pLat2 NUMBER,
pLon2 NUMBER)
RETURN NUMBER
IS
-- r is the spherical radius of earth in Kilometers
cSpherRad CONSTANT NUMBER := 6367;
-- The spherical radius of earth in miles is 3956
a NUMBER;
vLat NUMBER;
vLat1Rad NUMBER;
vLat2Rad NUMBER;
vLon NUMBER;
vLon1Rad NUMBER;
vLon2Rad NUMBER;
BEGIN
/*
Most computers require the arguments of trigonometric functions to be
expressed in radians. To convert lon1, lat1 and lon2,lat2 from
degrees,minutes, seconds to radians, first convert them to decimal
degrees. To convert decimal degrees to radians, multiply the number
of degrees by pi/180 = 0.017453293 radians/degrees.
*/
vLat1Rad := pLat1 * 0.017453293;
vLat2Rad := pLat2 * 0.017453293;
vLon1Rad := pLon1 * 0.017453293;
vLon2Rad := pLon2 * 0.017453293;
vLon := vLon2Rad - vLon1Rad;
vLat := vLat2Rad - vLat1Rad;
a := POWER(SIN(vLat/2),2) + COS(vLat1Rad) * COS(vLat2Rad) *
POWER(SIN(vLon/2),2);
/*
The intermediate result c is the great circle distance in radians.
Inverse trigonometric functions return results expressed in radians.
To express c in decimal degrees, multiply the number of radians by
180/pi = 57.295780 degrees/radian.
The great circle distance d will be in the same units as r.
*/
RETURN ROUND(cSpherRad * 2 * ATAN2(SQRT(a), SQRT(1-a)),1);
EXCEPTION
WHEN OTHERS THEN
RETURN 999;
END calc_distance;
/
-----------------------------------------------------------------------------------------
'개발' 카테고리의 다른 글
[DB] MSSQL 트랜잭션 로그파일 크기 줄이기 (0) | 2011.08.16 |
---|---|
List of HTTP status codes (0) | 2011.02.23 |
오라클(oracle)과 MS-SQL 함수, 쿼리 차이점 (1) | 2010.10.20 |
asp에서 soap 호출(닷넷 웹서비스-asmx) 후 return XML 원형보기 (0) | 2010.10.13 |
RSS의 정의 및 활용도 - 링크주소 (0) | 2010.10.12 |