GeoJSON 데이터 함수 사용

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

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

JSON 객체를 지오메트리로 해석하고 특정 조건을 충족하는 지오메트리가 포함된 행을 검색할 수 있는 다양한 내장 함수가 있습니다.

예제와 함께 진행하려면 고급 DDL 입력 모드를 사용하여 OCI 콘솔에서 테이블을 생성합니다. DDL 문은 아래와 같습니다.

CREATE TABLE IF NOT EXISTS PointsOfInterest (
    id INTEGER, poi JSON,
PRIMARY KEY(id));

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

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

사이트맵

경계 GeoJSON 형상 내의 형상을 결정합니다.

boolean geo_inside(any*, any*)

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

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

런타임 동작은 다음과 같습니다.

주: 다각형의 내부는 다각형의 경계를 정의하는 선형 링의 점을 제외한 다각형 영역의 모든 점입니다.

예:북부 캘리포니아의 자연공원을 찾습니다.

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]
                ]]
             });

설명:

결과:

{"park_name":"portola redwoods state park",
"park_location":"15000 Skyline Blvd"}

사이트맵

GeoJSON 형상과 교차하는 형상을 결정합니다.

boolean geo_intersect(any*, any*)

첫 번째 및 두 번째 매개변수 any*는 모든 형상 객체일 수 있습니다.

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

런타임 동작은 다음과 같습니다.

두 매개변수가 각각 단일 형상 객체를 반환하는 경우 이 함수는 두 형상에 공통점이 있으면 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]
          ]
        ]
    }
);

설명:

결과:

{"County_needs_regulation":"Tarrant","Contact_phone":"469 745 5687"}
{"County_needs_regulation":"Kinga","Contact_phone":"469 384 7612"}

지오 거리

두 지형 공간 객체 사이의 거리를 결정합니다.

double geo_distance(any*, any*)

첫 번째 및 두 번째 매개변수 any*는 모든 형상 객체일 수 있습니다.

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

측지선 개요

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

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

geodetic-vs-straight-line.jpg에 대한 설명은 다음과 같습니다.

그림 geodetic-vs-straight-line.jpg에 대한 설명

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

런타임 동작은 다음과 같습니다.

그렇지 않으면 함수는 두 입력 형상 사이의 측지 거리(미터)를 반환합니다.

주: 결과는 거리별로 오름차순으로 정렬됩니다(먼저 가장 짧은 거리를 표시).

예:지정된 위치에서 가장 가까운 레스토랑은 얼마입니까?

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" ;

설명:

결과:

{"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_거리

점에 근접한 지형 공간 객체를 결정합니다.

boolean geo_within_distance(any*, any*,double)

첫 번째 및 두 번째 매개변수 any* 는 모든 형상 객체일 수 있습니다.

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

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

런타임 동작은 다음과 같습니다.

마지막으로, 두 매개변수 모두 단일 형상 객체를 각각 반환하는 경우 첫 번째 형상이 두 번째 형상에서 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
);

설명:

결과:

{"city_hall_address":"70 North 1st street","distance_in_meters":1736.0144040331768}

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

지오 근처

점에 근접한 지형 공간 객체를 결정합니다.

boolean geo_near(any*, any*, double)

첫 번째 및 두 번째 매개변수 any*는 모든 형상 객체일 수 있습니다.

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

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

런타임 동작은 다음과 같습니다.

마지막으로, 처음 두 매개변수 모두 단일 형상 객체를 각각 반환하는 경우 첫 번째 형상이 두 번째 형상에서 N미터 거리 내에 있으면 true를 반환합니다. 여기서 N은 세 번째 매개변수에서 반환된 숫자입니다. 그렇지 않으면 false입니다.

주: geo_near는 내부적으로 geo_within_distance와 두 형상 사이의 거리(암시적) 순서로 변환됩니다. 그러나 질의에 이미 (명시적) 정렬 기준이 있는 경우 거리별 정렬이 수행되지 않습니다. 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
);

설명:

결과:

{"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
);

설명:

결과:

{"gas_station_address":"33 North Avenue","distance_in_meters":886.7004173859665}

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

지오메트리_is_geometry

지형 공간 객체를 검증합니다.

boolean geo_is_geometry(any*)

매개변수 any*는 임의의 형상 객체일 수 있습니다.

함수는 제공된 입력이 적합한 형상 객체인지 여부를 결정합니다.

예:도시 홀을 가리키는 위치가 유효한 기하학적 객체인지 확인합니다.

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}

관련 항목