ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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)))

    해당 지하철 ID

    ◆ (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

    댓글

Designed by Tistory.