GeoJSON 데이터 함수 사용

GeoJson 사양은 지구상의 지리적 모양을 나타내야 하는 JSON 객체의 구조 및 콘텐츠를 정의합니다(지오메트리라고 함). GeoJson 사양에 따르면 JSON 객체가 형상 객체가 되려면 typecoordinates라는 두 개의 필드가 있어야 합니다. 여기서 type 필드 값은 형상의 종류를 지정하고 좌표 값은 요소가 기하학적 모양을 정의하는 배열이어야 합니다.

모든 종류의 형상은 위치 집합에 따라 지정됩니다. 그러나 선 문자열과 다각형의 경우 위치를 연결하는 선에 의해 실제 형상 모양이 형성됩니다. GeoJson 사양은 가로 축과 세로 축이 각각 경도 및 위도인 (평면) 카티션 좌표계의 점을 연결하는 직선으로 두 점 사이의 선을 정의합니다.

JSON 객체를 형상으로 해석하고 특정 조건을 충족하는 형상이 포함된 행을 검색할 수 있도록 하는 다양한 내장 함수가 있습니다.

예제와 함께 수행하려면 Advanced DDL Input Mode를 사용하여 OCI 콘솔에서 테이블을 생성합니다. DDL 문은 다음과 같습니다.
CREATE TABLE IF NOT EXISTS PointsOfInterest (
    id INTEGER, poi JSON, 
PRIMARY KEY(id));

DDL 문으로 테이블을 생성하는 단계는 싱글톤 테이블 생성: 고급 DDL 입력 모드를 참조하십시오.

OCI 콘솔에서 생성된 테이블로 데이터를 로드하려면 테이블 이름을 누릅니다. 테이블 세부정보가 표시됩니다. 데이터 업로드를 누릅니다. 업로드할 파일 선택을 누르고 업로드할 JSON 파일을 제공합니다. GeoJSON 데이터에 대한 DDL 및 JSON 파일은 여기에서 다운로드할 수 있습니다.

geo_inside

경계 GeoJSON 형상 내의 형상을 결정합니다.
boolean geo_inside(any*, any*)
  • 첫번째 매개변수 any*는 임의의 기하학적 객체일 수 있습니다.
  • 두번째 매개변수 any*는 다각형이어야 합니다.

이 함수는 첫 번째 매개변수가 가리키는 형상이 두 번째 매개변수가 가리키는 다각형 안에 완전히 포함되는지 여부를 결정합니다.

두 매개변수 중 하나라도 유효한 단일 형상 객체를 반환하지 않고 컴파일 시 감지할 수 있는 경우 함수에서 오류가 발생합니다.

런타임 동작은 다음과 같습니다.
  • 매개변수가 0개 이상의 항목을 반환하는 경우 false를 반환합니다.
  • 파라미터가 NULL을 반환하는 경우 NULL을 반환합니다.
  • 런타임 시 매개변수가 적합한 지오메트리 객체가 아닌 항목을 반환하는 경우 false를 반환합니다.
  • 두 번째 매개변수가 다각형이 아닌 형상 객체를 반환하는 경우 false를 반환합니다.
  • 두 매개변수가 각각 하나의 형상 객체를 반환하고 두 번째 형상이 다각형인 경우
    • 첫 번째 형상이 두 번째 다각형 안에 완전히 포함된 경우, 즉 모든 점이 다각형의 내부에 속하는 경우 true를 반환합니다.
    • 그렇지 않으면 false를 반환합니다.

주:

다각형의 내부는 다각형의 경계를 정의하는 선형 링의 점을 제외한 다각형 영역의 모든 점입니다.
예: 북부 캘리포니아의 자연공원을 찾습니다.
SELECT t.poi.name AS park_name, 
t.poi.address.street AS park_location
FROM PointsOfInterest t
WHERE t.poi.kind = "nature park"
AND geo_inside(t.poi.location,
              { "type" : "polygon",
                "coordinates": [[
                  [-120.1135253906249, 36.99816565700228],
                  [-119.0972900390625, 37.391981943533544],
                  [-119.2840576171875, 37.97451499202459],
                  [-120.2069091796874, 38.035112420612975],
                  [-122.3822021484375, 37.74031329210266],
                  [-122.2283935546875, 37.15156050223665],
                  [-121.5362548828124, 36.85325222344018],
                  [-120.1135253906249, 36.99816565700228]
                ]]
             });
설명:
  • PointsOfInterest 테이블을 질의하여 nature park에 대한 행을 필터링합니다.
  • 다각형을 geo_inside 함수의 두번째 매개변수로 지정합니다.
  • 지정한 다각형의 좌표는 미국 캘리포니아 주 북부 지역의 좌표에 해당합니다.
  • geo_inside 함수는 자연 공원의 위치가 지정된 위치 지점 내에 완전히 포함된 경우에만 행을 반환합니다.
결과:
{"park_name":"portola redwoods state park",
"park_location":"15000 Skyline Blvd"}

geo_intersect

GeoJSON 형상과 교차하는 형상을 결정합니다.
boolean geo_intersect(any*, any*)

첫 번째 및 두 번째 매개변수 any*는 임의의 기하학적 객체일 수 있습니다.

이 함수는 매개변수로 지정된 두 형상에 공통점이 있는지 여부를 결정합니다. 두 매개변수 중 하나라도 유효한 단일 형상 객체를 반환하지 않고 컴파일 시 감지할 수 있는 경우 함수에서 오류가 발생합니다.

런타임 동작은 다음과 같습니다.
  • 매개변수가 0개 이상의 항목을 반환하는 경우 false를 반환합니다.
  • 파라미터가 NULL을 반환하는 경우 NULL을 반환합니다.
  • 런타임 시 매개변수가 적합한 지오메트리 객체가 아닌 항목을 반환하는 경우 false를 반환합니다.

두 매개변수가 각각 하나의 형상 객체를 반환하는 경우 두 형상에 공통점이 있으면 함수는 true를 반환하고 그렇지 않으면 false를 반환합니다.

예: 텍사스에서는 지하수 공급에 대한 액세스를 규제하는 것을 고려하고 있습니다. 수확기는 물 방위 침투성 바위, 바위 골절 또는 통합되지 않은 물자의 지하 층입니다. 정부는 수확기에 매우 가까운 위치에 새로운 규정을 적용하고자합니다.

aquifer의 좌표가 이미 매핑되었습니다. 당신은 당신이 새로운 규정에 대한 회담에 참여하기 위해 영향을받는 각 카운티에 대한 카운티 정부에 알릴 수 있도록 텍사스 주에있는 모든 카운티를 알고 싶어.
SELECT t.poi.county AS County_needs_regulation,
t.poi.contact AS Contact_phone
FROM PointsOfInterest t WHERE
geo_intersect(
    t.poi.location,
    { 

     "type" : "polygon",
      "coordinates": [
          [
            [-97.668457031249, 29.34387539941801],
            [-95.207519531258, 29.19053283229458],
            [-92.900390625653, 30.37287518811801],
            [-94.636230468752, 32.21280106801518],
            [-97.778320312522, 32.45415593941475],
            [-99.799804687541, 31.18460913574325],
            [-97.668457031249, 29.34387539941801]
          ]
        ]
    }
);
설명:
  • 위의 질의는 aquifer의 위치와 교차하는 위치를 인출합니다. 즉, 위치 좌표가 aquifer의 위치와 공통점이 있는 경우입니다.
  • geo_intersect를 사용하여 위치의 좌표에 지정된 수확기의 좌표와 공통되는 점이 있는지 확인합니다.
결과:
{"County_needs_regulation":"Tarrant","Contact_phone":"469 745 5687"}
{"County_needs_regulation":"Kinga","Contact_phone":"469 384 7612"}

geo_distance

두 지형 공간 객체 간의 거리를 결정합니다.
double geo_distance(any*, any*)

첫 번째 및 두 번째 매개변수 any*는 임의의 기하학적 객체일 수 있습니다.

이 함수는 두 입력 형상 사이의 측지 거리를 반환합니다. 반환된 거리는 첫 번째 점이 첫 번째 형상에 속하고 두 번째 점이 두 번째 형상에 속하는 점 쌍의 거리 중 최소값입니다. 이러한 두 점 사이의 거리는 점을 연결하는 측지선의 길이입니다.

측지선 개요

두 점 사이의 측지선은 지구의 타원면에서 두 점 사이에 그려질 수 있는 가장 짧은 선입니다. 단순화되었지만 더 많은 그림 정의를 위해 지구의 표면이 구형이라고 가정합니다. 그런 다음 지구상의 두 점 사이의 측지선은 점에 해당하는 큰 원의 두 점 사이의 작은 호, 즉 구의 교차로와 지구의 중심과 두 점에 의해 정의된 평면에 의해 형성되는 원입니다.

다음 그림은 로스 앤젤레스와 런던 사이의 측지선과 직선의 차이를 보여줍니다.


두 매개변수 중 하나라도 유효한 단일 형상 객체를 반환하지 않고 컴파일 시 감지할 수 있는 경우 함수에서 오류가 발생합니다.

런타임 동작은 다음과 같습니다.
  • 매개변수가 0개 이상의 품목을 반환하는 경우 -1을 반환합니다.
  • 파라미터가 NULL을 반환하는 경우 NULL을 반환합니다.
  • 매개변수 중 하나라도 형상 객체가 아닌 경우 -1을 반환합니다.
그렇지 않으면 함수는 2개의 입력 형상 사이의 측지 거리(미터)를 반환합니다.

주:

결과는 거리를 기준으로 오름차순으로 정렬됩니다(가장 짧은 거리를 먼저 표시).
예: 지정된 위치에서 가장 가까운 레스토랑은 얼마나 떨어져 있습니까?
SELECT 
t.poi.name AS restaurant_name,
t.poi.address.street AS street_name,
geo_distance(
    t.poi.location,
    { 
       "type" : "point",
       "coordinates": [-121.94034576416016,37.2812239247177]
    }
) AS distance_in_meters
FROM PointsOfInterest t
WHERE t.poi.kind = "restaurant" ;
설명:
  • PointsOfInterest 테이블을 질의하여 레스토랑에 대한 행을 필터링합니다.
  • 올바른 위치 지점을 제공하고 geo_distance 함수를 사용하여 거리를 결정합니다.
결과:
{"restaurant_name":"Coach Sports Bar & Grill","street_name":"80 Edward St","distance_in_meters":799.2645323337218}
{"restaurant_name":"Ricos Taco","street_name":"80 East Boulevard St","distance_in_meters":976.5361117138553}
{"restaurant_name":"Effie's Restaurant and Bar","street_name":"80 Woodeard St","distance_in_meters":2891.0508307646282}    

현재 위치와 가장 가까운 레스토랑 사이의 거리는 799 미터입니다.

geo_within_distance

점에 근접한 지형 공간 객체를 결정합니다.
boolean geo_within_distance(any*, any*,double)

첫 번째 및 두 번째 매개변수 any* 는 임의의 기하학적 객체일 수 있습니다.

이 함수는 첫 번째 형상이 두 번째 형상에서 N미터 거리 내에 있는지 여부를 결정합니다.

두 매개변수 중 하나라도 유효한 단일 형상 객체를 반환하지 않고 컴파일 시 감지할 수 있는 경우 함수에서 오류가 발생합니다.

런타임 동작은 다음과 같습니다.
  • 매개변수가 0개 이상의 항목을 반환하는 경우 false를 반환합니다.
  • 처음 두 개의 파라미터 중 하나가 NULL을 반환하면 NULL을 반환합니다.
  • 처음 두 매개변수 중 하나라도 유효한 형상 객체가 아닌 항목을 반환하면 false를 반환합니다.

마지막으로 두 매개변수가 각각 단일 형상 객체를 반환하는 경우 첫 번째 형상이 두 번째 형상에서 N미터 거리 내에 있으면 true를 반환합니다. 여기서 N은 세 번째 매개변수에서 반환된 숫자입니다. 그렇지 않으면 false입니다. 두 형상 사이의 거리는 첫 번째 점이 첫 번째 형상에 속하고 두 번째 점이 두 번째 형상에 속하는 점 쌍의 거리 중 최소값으로 정의됩니다. N이 음수이면 0으로 설정됩니다.

예: 다음 5km 내에 시청이 있습니까? 얼마나 멀리 있습니까?
SELECT t.poi.address.street AS city_hall_address,
geo_distance(
    t.poi.location,
    { 
        "type" : "point",
        "coordinates" : [-120.653828125,38.85682013474361]
    }

) AS distance_in_meters
FROM PointsOfInterest t
WHERE t.poi.kind = "city hall" AND
geo_within_distance( 
    t.poi.location,
    { 
        "type" : "point",
        "coordinates" : [-120.653828125,38.85682013474361]
    },
    5000
);
설명:
  • PointsOfInterest 테이블을 질의하여 시청장에 대한 행을 필터링합니다.
  • geo_within_distance 함수를 사용하여 지정된 위치의 5km(5000m) 내에 시청을 필터링할 수 있습니다.
  • 또한 geo_distance 함수를 사용하여 위치와 시청 사이의 실제 거리를 가져옵니다.
결과:
{"city_hall_address":"70 North 1st street","distance_in_meters":1736.0144040331768}

시청은 현재 위치에서 1736m(1.73km)입니다.

geo_near

점에 근접한 지형 공간 객체를 결정합니다.
boolean geo_near(any*, any*, double)

첫 번째 및 두 번째 매개변수 any*는 임의의 기하학적 객체일 수 있습니다.

이 함수는 첫 번째 형상이 두 번째 형상에서 N미터 거리 내에 있는지 여부를 결정합니다.

두 매개변수 중 하나라도 유효한 단일 형상 객체를 반환하지 않고 컴파일 시 감지할 수 있는 경우 함수에서 오류가 발생합니다.

런타임 동작은 다음과 같습니다.
  • 매개변수가 0개 이상의 항목을 반환하는 경우 false를 반환합니다.
  • 처음 두 개의 파라미터 중 하나가 NULL을 반환하면 NULL을 반환합니다.
  • 처음 두 매개변수 중 하나라도 유효한 형상 객체가 아닌 항목을 반환하면 false를 반환합니다.
마지막으로, 처음 두 매개변수 모두 각각 단일 형상 객체를 반환하는 경우 첫 번째 형상이 두 번째 형상에서 N미터 거리 내에 있으면 true를 반환합니다. 여기서 N은 세 번째 매개변수에서 반환된 숫자입니다. 그렇지 않으면 false입니다.

주:

geo_near는 두 형상 사이의 거리에 따라 내부적으로 geo_within_distance 및 (암시적) 순서로 변환됩니다. 그러나 query에 이미 (명시적) order-by가 있는 경우 거리별 ordering이 수행되지 않습니다. geo_near 함수는 최상위 술어여야 하는 WHERE 절에만 나타날 수 있습니다. 즉, OR 또는 NOT 연산자 아래에 중첩되어 있지 않아야 합니다.
예 1: 제공된 위치에서 3km 이내의 병원이 있습니까?
SELECT 
t.poi.name AS hospital_name,
t.poi.address.street AS hospital_address
FROM PointsOfInterest t
WHERE t.poi.kind = "hospital" 
AND
geo_near( 
    t.poi.location,
    {"type" : "point",
     "coordinates" : [-122.03493933105469,37.32949164059004]  
    },
    3000
);
설명:
  • PointsOfInterest 테이블을 질의하여 hospital에 대한 행을 필터링합니다.
  • geo_near 함수를 사용하여 지정된 위치의 3000m 내에 있는 병원을 필터링합니다.
결과:
{"hospital_name":"St. Marthas hospital","hospital_address":"18000 West Blvd"}
{"hospital_name":"Memorial hospital","hospital_address":"10500 South St"}
예 2: 지정된 위치에서 다음 1마일 이내의 주유소는 어느 정도입니까?
SELECT 
t.poi.address.street AS gas_station_address,
geo_distance(
    t.poi.location,
    { 
        "type" : "point",
        "coordinates" : [-121.90768646240233,37.292081740702365] 
    }
) AS distance_in_meters
FROM PointsOfInterest t
WHERE t.poi.kind = "gas station" AND
geo_near( 
    t.poi.location,
    { 
        "type" : "point",
        "coordinates" : [-121.90768646240233,37.292081740702365]
    },
    1600
);
설명:
  • PointsOfInterest 테이블을 질의하여 gas station에 대한 행을 필터링합니다.
  • geo_near 함수를 사용하여 지정된 위치의 1마일(1600m) 내에 주유소를 필터링할 수 있습니다.
  • 또한 geo_distance 함수를 사용하여 위치와 주유소 사이의 실제 거리를 인출합니다.
결과:
{"gas_station_address":"33 North Avenue","distance_in_meters":886.7004173859665}

다음 마일 내에 가장 가까운 주유소까지의 실제 거리는 886m입니다.

geo_is_geometry

지리 공간 객체를 검증합니다.
boolean geo_is_geometry(any*)

any* 매개변수는 임의의 기하학적 객체일 수 있습니다.

함수는 제공된 입력이 적합한 형상 객체인지 여부를 결정합니다.
  • 매개변수가 0개 이상의 항목을 반환하는 경우 false를 반환합니다.
  • 매개변수가 NULL을 반환하는 경우 NULL을 반환합니다.
  • 입력이 적합한 단일 형상 객체인 경우 true를 반환합니다. 그렇지 않으면 false입니다.
예: 시청장을 가리키는 위치가 유효한 기하학적 객체인지 확인합니다.
SELECT geo_is_geometry(t.poi.location) AS city_hall
FROM PointsOfInterest t
WHERE t.poi.kind = "city hall" 

설명: geo_is_geometry 함수를 사용하여 지정된 위치가 유효한 기하학적 객체인지 여부를 확인합니다.

결과:
{ "city_hall" : true}