-
Map 에서 Circle 안에 있는 좌표 가져오기 SQL, Query카테고리 없음 2020. 9. 1. 19:43
※ 최종 쿼리문
select SUBWAY_YEAR, SUBWAY_MONTH, SUBWAY_STATION_ID, SUM(SUBWAY_RIDE), SUM(SUBWAY_QUIT) from SUBWAY_PASSENGER where SUBSTR(to_char(SUBWAY_DATE), 1, 6) >= to_char(add_months(sysdate, -12), 'yyyymm') and SUBWAY_STATION_ID in ( select SUBWAY_STATION_ID from ( select SUBWAY_STATION_ID, SUBWAY_STATION_NAME, SUBWAY_STATION_LATITUDE, SUBWAY_STATION_LONGITUDE, SQRT( (SUBWAY_STATION_LATITUDE - "중심 위도(X)") * (SUBWAY_STATION_LATITUDE - "중심 위도(X)") + (SUBWAY_STATION_LONGITUDE - "중심 경도(Y)") * (SUBWAY_STATION_LONGITUDE - "중심 경도(Y)") ) radius from SUBWAY_STATION ) a where a.radius < (SQRT( ("사각형의 경도 endX" - "사각형의 경도 startX") * ("사각형의 경도 endX" - "사각형의 경도 startX") + ("사각형의 위도 endY" - "사각형의 위도 startY") * ("사각형의 위도 endY" - "사각형의 위도 startY") ) / (2 * SQRT(2))) * 1 ) group by SUBWAY_YEAR, SUBWAY_MONTH, SUBWAY_STATION_ID order by SUBWAY_YEAR, SUBWAY_MONTH ;
KakaoMap API 를 이용하여 원을 가져올때 사각형의 형태로 startXY 와 endXY의 값을 가지고 위도(Latitude), 경도(Longitude) 를 가지고 반지름을 구한다. 또한 API에서 radius를 주는데 이 값은 m로 주기 때문에 위도 경도와 상관이 없는 값이다.
----------------------------------------- 파라미터 -------------------------------------
[{"name":"선택 영엉의 이름",
"type":"circle",
"cx":126.98613241892349,
"cy":37.56092604468133,126.98613241892349,
"ex":126.9883640891879,
"ey":37.56270305479344,126.9883640891879,
"sx":126.98390085466332,
"sy":37.55914899187359,126.98390085466332,
"radius":197.200405679729}]----------------------------------------- 파라미터 -------------------------------------
※ 원의 중심 좌표를 이용하여 원과 지하철 역의 좌표의 거리를 전부 구한다.
- radius 별명이 거리를 계산하는 부분
- SQRT : 수학에서 말하는 root, 오라클에서 제곱근 명령어
select SUBWAY_STATION_ID, SUBWAY_STATION_NAME, SUBWAY_STATION_LATITUDE, SUBWAY_STATION_LONGITUDE, SQRT( (SUBWAY_STATION_LATITUDE - "중심 위도(X)") * (SUBWAY_STATION_LATITUDE - "중심 위도(X)") + (SUBWAY_STATION_LONGITUDE - "중심 경도(Y)") * (SUBWAY_STATION_LONGITUDE - "중심 경도(Y)") ) radius from SUBWAY_STATION;
※ 정사각형의 대각선의 길이를 이용하여 반지름 구하기
※ 해당하는 지하철역 가져오기
select SUBWAY_STATION_ID from ( select SUBWAY_STATION_ID, SUBWAY_STATION_NAME, SUBWAY_STATION_LATITUDE, SUBWAY_STATION_LONGITUDE, SQRT( (SUBWAY_STATION_LATITUDE - "중심 위도(X)") * (SUBWAY_STATION_LATITUDE - "중심 위도(X)") + (SUBWAY_STATION_LONGITUDE - "중심 경도(Y)") * (SUBWAY_STATION_LONGITUDE - "중심 경도(Y)") ) radius from SUBWAY_STATION ) a where a.radius < (SQRT( ("사각형의 경도 endX" - "사각형의 경도 startX") * ("사각형의 경도 endX" - "사각형의 경도 startX") + ("사각형의 위도 endY" - "사각형의 위도 startY") * ("사각형의 위도 endY" - "사각형의 위도 startY") ) / (2 * SQRT(2)))
◆ (2 * SQRT(2)) 로 나눠준 이유는 정사각형의 대각선을 이용하여 변의 길이를 구하는 방법, 반지름의 값을 구하기 위해서 2*를 해준것. 지름이었다면 SQRT(2), 반지름 이어서 (2 * SQRT(2))
select SUBWAY_DAY_ID, SUBWAY_STATION_ID, SUBWAY_YEAR, SUBWAY_MONTH, SUBWAY_DAY, SUBWAY_RIDE, SUBWAY_QUIT, SUBWAY_DATE from SUBWAY_PASSENGER where SUBWAY_STATION_ID in ( select SUBWAY_STATION_ID from ( select SUBWAY_STATION_ID, SUBWAY_STATION_NAME, SUBWAY_STATION_LATITUDE, SUBWAY_STATION_LONGITUDE, SQRT( (SUBWAY_STATION_LATITUDE - "중심 위도(X)") * (SUBWAY_STATION_LATITUDE - "중심 위도(X)") + (SUBWAY_STATION_LONGITUDE - "중심 경도(Y)") * (SUBWAY_STATION_LONGITUDE - "중심 경도(Y)") ) radius from SUBWAY_STATION ) a where a.radius < (SQRT( ("사각형의 경도 endX" - "사각형의 경도 startX") * ("사각형의 경도 endX" - "사각형의 경도 startX") + ("사각형의 위도 endY" - "사각형의 위도 startY") * ("사각형의 위도 endY" - "사각형의 위도 startY") ) / (2 * SQRT(2))) * 1 ) group by SUBWAY_YEAR
◆ where SUBWAY_STATION_ID in (
select SUBWAY_STATION_ID을 활용하여 for 문 처럼 사용하는 것이다.
ID가 해당 하는 것을 전부 가져오는 방법
◆ * 1 은 현재 범위보다 몇배 큰지를 정할 수 있다.
※ java에서 사용할수 있게 DB에 없는 값을 select 하는 방법
◆ #{selectName} selectName
select SUBWAY_YEAR year, SUBWAY_MONTH month, SUM(SUBWAY_RIDE) ride, SUM(SUBWAY_QUIT) quit, #{selectName} selectName from SUBWAY_PASSENGER where SUBSTR(to_char(SUBWAY_DATE), 1, 6) >= to_char(add_months(sysdate, -12), 'yyyymm') and SUBWAY_STATION_ID in ( select SUBWAY_STATION_ID from ( select SUBWAY_STATION_ID, SUBWAY_STATION_NAME, SUBWAY_STATION_LATITUDE, SUBWAY_STATION_LONGITUDE, SQRT( (SUBWAY_STATION_LATITUDE - #{LatitudeCenter}) * (SUBWAY_STATION_LATITUDE - #{LatitudeCenter}) + (SUBWAY_STATION_LONGITUDE - #{LongitudeCenter}) * (SUBWAY_STATION_LONGITUDE - #{LongitudeCenter}) ) radius from SUBWAY_STATION ) a <![CDATA[ where a.radius < (SQRT( (#{LatitudeEndBoundary} - #{LatitudeStartBoundary}) * (#{LatitudeEndBoundary} - #{LatitudeStartBoundary}) + (#{LongitudeEndBoundary} - #{LongitudeStartBoundary}) * (#{LongitudeEndBoundary} - #{LongitudeStartBoundary}) ) / (2 * SQRT(2))) * 1 ]]> ) group by SUBWAY_YEAR, SUBWAY_MONTH order by SUBWAY_YEAR, SUBWAY_MONTH