GeoJSON 데이터 함수 사용
GeoJson 사양은 지구상의 지리적 모양(지오메트리라고 함)을 나타내는 JSON 객체의 구조와 내용을 정의합니다. GeoJson 사양에 따르면 JSON 객체가 형상 객체가 되려면 type 및 coordinates라는 두 개의 필드가 있어야 합니다. 여기서 유형 필드의 값은 형상의 종류를 지정하고 좌표의 값은 요소가 형상 모양을 정의하는 배열이어야 합니다.
모든 종류의 형상은 위치 세트에 따라 지정됩니다. 그러나 선 문자열과 다각형의 경우 실제 기하학적 모양은 위치를 연결하는 선에 의해 형성됩니다. 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*)
-
첫번째 매개변수
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"}
사이트맵
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의 위치와 공통점이 있는 경우입니다.
-
geo_intersect를 사용하여 위치의 좌표에 지정된 수분기의 좌표와 공통된 점이 있는지 확인합니다.
결과:
{"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에 대한 설명
두 매개변수 중 하나라도 유효한 단일 형상 객체를 반환하지 않고 컴파일 시 감지할 수 있는 경우 함수에서 오류가 발생합니다.
런타임 동작은 다음과 같습니다.
-
매개변수가 0개 이상의 항목을 반환하는 경우 -1을 반환합니다.
-
파라미터가 NULL을 반환하는 경우 NULL을 반환합니다.
-
매개변수 중 하나라도 형상 객체가 아닌 경우 -1을 반환합니다.
그렇지 않으면 함수는 두 입력 형상 사이의 측지 거리(미터)를 반환합니다.
주: 결과는 거리별로 오름차순으로 정렬됩니다(먼저 가장 짧은 거리를 표시).
예:지정된 위치에서 가장 가까운 레스토랑은 얼마입니까?
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_거리
점에 근접한 지형 공간 객체를 결정합니다.
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)입니다.
지오 근처
점에 근접한 지형 공간 객체를 결정합니다.
boolean geo_near(any*, any*, double)
첫 번째 및 두 번째 매개변수 any*는 모든 형상 객체일 수 있습니다.
이 함수는 첫 번째 형상이 두 번째 형상으로부터 N미터 거리 내에 있는지 여부를 결정합니다.
두 매개변수 중 하나라도 유효한 단일 형상 객체를 반환하지 않고 컴파일 시 감지할 수 있는 경우 함수에서 오류가 발생합니다.
런타임 동작은 다음과 같습니다.
-
매개변수가 0개 이상의 항목을 반환하는 경우 false를 반환합니다.
-
처음 두 매개변수 중 하나라도 NULL을 반환하는 경우 NULL을 반환합니다.
-
처음 두 매개변수 중 하나라도 유효한 형상 객체가 아닌 항목을 반환하는 경우 false를 반환합니다.
마지막으로, 처음 두 매개변수 모두 단일 형상 객체를 각각 반환하는 경우 첫 번째 형상이 두 번째 형상에서 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
);
설명:
-
PointsOfInterest테이블을 질의하여 병원에 대한 행을 필터링합니다. -
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테이블을 질의하여 가스 스테이션에 대한 행을 필터링합니다. -
geo_near함수를 사용하여 지정된 위치의 1마일(1600m) 내에 있는 주유소를 필터링합니다. -
또한
geo_distance함수를 사용하여 위치와 주유소 사이의 실제 거리를 인출합니다.
결과:
{"gas_station_address":"33 North Avenue","distance_in_meters":886.7004173859665}
다음 마일 내에 가장 가까운 주유소까지의 실제 거리는 886m입니다.
지오메트리_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}