두 지점사이을 위도와 경도로 구하는것은 많으나
많은 Data 중에서 그것들을 일일이 비교하는 것 보다 좀 더 간단한 게 있지 않을까 하는 생각에서 찾다보니... 맞는 것 같기도 하고 ㅎㅎ
원하는 Data는 한 지점의 좌표를 던졌을 때, 그 주위의 영역안에 있는 지점들 검색.
일단 data table은 이렇다
address lat lon
종로5가 85-5 37.57133378640924 127.0017706415372
종로5가 78-2 37.571308557349745 127.0021464536288
효제동 329-2 37.57149956819151 127.00176611422538
종로5가 78 37.57140226011581 127.00214192655133
효제동 248-1 37.57151758654161 127.00214645538165
효제동 320-2 37.571589667065034 127.00172083577715
효제동 318-2 37.571654538183424 127.00172536383047
효제동 249-1 37.57159687349846 127.00214192817154
효제동 254-1 37.57166534876146 127.00210570570849
효제동 251-1 37.57179509014652 127.00225965488374
-- 위도 : 0.05킬로미터, 경도 0.06미터
vlat : 0.05
vlon : 0.06
특정 지점 : 종로5가 85-5
plat : 37.57133378640924
plon : 127.0017706415372
해당 위도의 1도거리
133.33 * cost(위도)
해당 경도의 1도거리
111.1111 * cos(위도)
지구의 둘레는 약 48,000 km
위도 : 지구 둘레의 절반을 남북으로 180 등분한 것이므로 위도 1도 사이의 거리는 48,000 ÷ 360 = 133.33 km
경도 : 적도에서는 지구 둘레인 48,000 km 를 360 등분한 것이므로
위도와 마찬가지로 1도 사이의 거리는 133.33 km이지만
적도에서는 모든 경선이 만나기 때문에 그 사이의 거리가 모두 0 이 되며
그 중간 지역에서는 1도 사이의 거리는 133.33 × cos(해당 지역의 위도) km
select address, lat_minus, lat, lat_plus, abs(lat - lat_minus) as lat_distance, lon_minus, lon, lon_plus, abs(lon - lon_minus) as lon_distance
from (
select address, lat
, (:plat - (:vlat/133.33 * cos(lat)) ) as lat_minus
, (:plat + (:vlat/133.33 * cos(lat)) ) as lat_plus
, lon
, ( :plon - (:vlon/(111.1111 * cos(lat)) )) as lon_minus
, ( :plon + (:vlon/(111.1111 * cos(lat)) )) as lon_plus
-- select *
from tc00_map m
where lat between (:plat - (:vlat/133.33 * cos(lat)) ) and (:plat + (:vlat/133.33 * cos(lat)) )
and lon between (:plon - (:vlon/(111.1111 * cos(lat)) )) and (:plon + (:vlon/(111.1111 * cos(lat)) ))
)