BigQuery GIS 데이터 작업

BigQuery GIS를 사용하면 BigQuery에서 지리 데이터를 분석할 수 있습니다. 지리 데이터는 지리공간 데이터라고도 합니다.

BigQuery GIS는 GEOGRAPHY 데이터 유형에 대한 지원을 표준 SQL에 추가합니다. GEOGRAPHY 데이터 유형은 지구 표면의 점 세트를 나타냅니다. 점 세트는 WGS84 참조 회전 타원체상의 점, 선, 다각형으로 구성된 집합이며 측지 에지를 포함합니다.

표준 SQL 지리 함수 중 하나를 호출하여 GEOGRAPHY 데이터 유형을 사용합니다. 지리 함수의 출력은 WKT(Well Known Text)로 렌더링됩니다. WKT에서는 경도를 첫 번째 형식으로, 위도를 두 번째 형식으로 사용합니다.

지리공간 데이터 형식

지구상의 한 점을 간단하게 (longitude, latitude) 쌍으로 나타낼 수 있습니다. 지리공간 데이터가 다음과 같은 지원되는 형식인 경우, 선이나 다각형처럼 더 복잡한 지리를 표현하기 위해 BigQuery를 사용하여 지리공간 데이터를 GEOGRAPHY 열에 로드할 수 있습니다.

WKT와 GeoJSON의 차이

도형 객체와 공간 지형지물 및 지형지물 컬렉션의 비교

공간 데이터를 사용하여 작업할 때 일반적인 유형의 객체는 다음과 같습니다.

  • 개별 도형 또는 GEOGRAPHY 값은 지구의 표면적을 나타냅니다. 이는 종종 점, 선, 다각형이나 점, 선, 다각형 컬렉션을 사용하여 설명합니다. 도형 컬렉션은 컬렉션에 있는 모든 모양의 공간 집합을 나타냅니다.
  • 공간 지형지물은 논리적 공간 객체를 나타냅니다. 이는 도형을 임의의 추가 애플리케이션별 속성과 결합합니다.
  • 공간 지형지물 컬렉션은 지형지물 객체의 집합입니다.

WKT는 점, 선, 구멍(선택사항)이 있는 다각형이나 점, 선, 다각형 컬렉션을 사용하여 개별 도형 모양을 설명하는 텍스트 형식입니다. 예를 들어 WKT에서 점은 다음과 같이 표현됩니다.

POINT(-121 41)

공간 지형지물을 설명하기 위해 WKT는 일반적으로 일부 컨테이너 파일 형식, CSV 파일, 데이터베이스 테이블에 삽입됩니다. 파일 행 또는 테이블 행은 일반적으로 공간 지형지물에 해당합니다. 전체 파일 또는 테이블은 지형지물 컬렉션에 해당합니다.

WKB는 WKT 형식의 바이너리 버전입니다.

GeoJSON은 더욱 복잡한 JSON 기반 형식으로 도형과 공간 지형지물을 나타냅니다. 예를 들어 GeoJSON에서 점은 다음과 같이 표현됩니다.

{ "type": "Point", "coordinates": [-121,41] }

GeoJSON은 다음 중 하나를 나타내는 데 사용됩니다.

  • 개별 도형 객체. 단일 객체에는 점, 선, 구멍(선택사항)이 있는 다각형의 집합으로 설명된 복잡한 공간 모양이 있을 수 있습니다. 이는 WKT 형식 사용량과 유사합니다.
  • 지형지물 객체. 지형지물 객체는 도형과 임의의 명명된 추가 속성이 있는 객체입니다. 이는 CSV 파일에서 WKT 열이 있는 한 행과 유사합니다.
  • 지형지물 컬렉션 - 지형지물 컬렉션은 데이터베이스의 테이블 또는 여러 개의 행과 열이 있는 CSV 파일과 유사한 지형지물 객체의 집합입니다.

BigQuery GIS는 GeoJSON에서 개별 도형 객체만 지원합니다. GeoJSON 지형지물 객체, 지형지물 컬렉션, GeoJSON 파일 형식은 현재 지원되지 않습니다.

좌표계와 에지

WKT 형식은 좌표계를 제공하지 않으므로 BigQuery GIS가 좌표계를 정의합니다. BigQuery GIS에서 WKT 점은 WGS84 회전 타원체의 표면상 위치입니다(경도+측지 위도로 표현). 에지는 두 엔드포인트 간의 구체 측지선입니다. GeoJSON에서 좌표계는 명시적으로 평면 에지가 있는 WGS84 좌표입니다.

이러한 두 종류의 에지를 변환하기 위해, BigQuery GIS는 필요한 경우 선에 별도의 점을 추가하여 변환된 에지의 시퀀스가 원래의 선에서 10미터 이내에 유지되도록 합니다. 이러한 프로세스를 공간 분할 또는 균일하지 않은 고밀도화라고 합니다. 지금은 사용자가 공간 분할 프로세스를 직접 제어할 수 없습니다.

구면 에지가 있는 지리를 가져오려면 다음 예와 같이 WKT를 사용합니다.

SELECT
  *,
  ST_GeogFromText(wkt) AS g
FROM
  mytable

평면 에지가 있는 지리('도형'이라고도 함)를 가져오려면 다음 예와 같이 GeoJSON을 사용합니다.

SELECT
  *,
  ST_GeogFromGeoJSON(geocol) AS g
FROM
  mytable

결과에서 원래의 GeoJSON 열을 제외할 수도 있습니다.

SELECT
  * EXCEPT(geocol),
  ST_GeogFromGeoJSON(geocol) AS geocol
FROM
  mytable

올바른 형식을 사용해야 합니다. 대부분의 시스템은 WKT에서 (도형이 아니라) 지리의 분석을 위한 지원을 보급하거나 평면 에지를 가정합니다. 이 경우 GeoJSON이 교환 형식으로 사용됩니다.

좌표에서는 경도가 첫 번째 형식이고, 위도가 두 번째 형식이어야 합니다. 지리에 긴 세그먼트 또는 에지가 있으면 BigQuery GIS에서 이를 구면 측지선으로 해석하지만 이 값이 데이터의 출처인 좌표계에 대응하지 않을 수 있으므로 공간 분할이 적용되어야 합니다.

다각형 방향

구체의 각 다각형에는 보완 다각형이 있습니다. 예를 들어 지구의 대륙을 나타내는 다각형에는 지구의 대양을 나타내는 보완 다각형이 있습니다. 두 다각형은 동일한 경계 링으로 표현되므로 특정 WKT 문자열이 나타내는 다각형이 둘 중 무엇인지를 확실히 알려주는 규칙이 필요합니다.

개발자가 파일에서 직접 또는 스트리밍 처리를 통해 WKT 및 WKB 문자열을 로드할 때 다각형의 경계를 입력 카테고리 순서로 순회하면 BigQuery GIS는 입력된 다각형의 왼쪽이 내부라고 가정합니다. BigQuery GIS는 WKT 및 WKB 문자열로 지리 객체를 내보낼 때도 동일한 규칙을 사용합니다.

개발자가 ST_GeogFromText 함수를 사용하여 WKT 문자열에서 지리 객체를 빌드할 경우 WKT 문자열이 나타내는 다각형을 결정하는 옵션에는 두 가지가 있습니다.

  1. (기본값) 더 작은 영역이 있는 다각형으로 입력을 해석합니다. 방향성이 있는 다각형이라고 가정하지 않습니다(oriented = FALSE).

  2. 반구보다 큰 영역이 있는 다각형을 로드할 수 있는 방향성 있는 다각형이라고 가정합니다(oriented = TRUE).

GeoJSON 문자열을 로드할 경우에는 이 규칙이 적용되지 않습니다. GeoJSON 문자열은 평면 지도에 정의되므로 입력이 GeoJSON RFC 7946, 섹션 3.1.6에 정의된 방향 규칙(다각형: 반시계 방향 외부 링, 시계 방향 내부 링)을 따르지 않더라도 방향을 분명히 결정할 수 있습니다.

BigQuery GIS 데이터 로드

BigQuery GIS 데이터를 BigQuery로 로드하면 GEOGRAPHY 열을 테이블의 스키마 정의에 지정할 수 있습니다. 열의 데이터 유형을 GEOGRAPHY로 지정하면 BigQuery GIS에서 이 데이터가 WKT인지 아니면 GeoJSON 형식인지를 감지할 수 있습니다.

GeoJSON 도형 객체를 GEOGRAPHY 열로 로드하면 JSON 객체가 아니라 텍스트 문자열로 형식이 지정됩니다. 이는 객체가 줄바꿈으로 구분된 JSON 파일에서 로드되는 경우에도 마찬가지입니다.

스키마 자동 감지를 사용하여 데이터를 로드하면 지리 값이 STRING으로 로드됩니다. 현재 스키마 자동 감지 기능은 지리 열을 감지할 수 없습니다.

데이터를 BigQuery로 로드하는 데 관한 자세한 내용은 Cloud Storage에서 데이터 로드 소개를 참조하세요.

BigQuery GIS 데이터 변환

테이블에 별도의 경도와 위도 열이 포함되어 있으면 ST_GeogPoint와 같은 표준 SQL 지리 함수를 사용하여 값을 지리정보로 변환할 수 있습니다. 예를 들어 경도와 위도를 위한 두 개의 DOUBLE 열이 있으면 다음 쿼리를 사용하여 지리 열을 생성할 수 있습니다.

SELECT
  *,
  ST_GeogPoint(longitude, latitude) AS g
FROM
  mytable

BigQuery는 현재 WKT와 GeoJSON 문자열을 지리 유형으로 변환할 수 있게 지원합니다. 셰이프파일과 기타 여러 형식은 외부 도구를 사용하여 변환됩니다.

부적절한 형식의 공간 데이터 처리

데이터를 BigQuery로 로드할 때 다른 도구의 올바르지 않은 WKT 또는 GeoJSON 데이터가 GEOGRAPHY 열로 변환되지 않는 경우가 간혹 있습니다. 예를 들어 Edge K has duplicate vertex with edge N 같은 오류는 다각형에 (첫 번째와 마지막 교점 외에) 중복된 교점이 존재함을 나타냅니다.

형식 지정 문제를 방지하려면 표준을 준수하는 결과를 생성하는 함수를 사용합니다. 예를 들어 PostGIS에서 데이터를 내보내려면 ST_MakeValid 함수를 사용하여 출력을 표준화합니다.

부적절한 형식의 데이터를 찾거나 무시하려면 SAFE 함수 프리픽스를 사용하여 문제가 있는 데이터를 출력합니다. 예를 들어 다음 쿼리는 SAFE 프리픽스를 사용하여 부적절한 형식의 공간 데이터를 검색합니다.

SELECT
  geojson AS bad_geojson
FROM
  mytable
WHERE
  geojson IS NOT NULL
  AND SAFE.ST_GeogFromGeoJson(geojson) IS NULL

BigQuery GIS 데이터 파티션 나누기 및 클러스터링

GEOGRAPHY 열이 포함된 테이블을 클러스터링하고 파티션을 나눌 수 있습니다. GEOGRAPHY 열을 클러스터링 열로 사용할 수 있지만 GEOGRAPHY 열을 파티션 나누기 열로 사용할 수 없습니다.

쿼리가 공간 조건자를 사용하여 데이터를 필터링하는 경우에 파티션을 나누거나 클러스터링한 테이블에 GEOGRAPHY 데이터를 저장하려면 지리 데이터가 공간적으로 압축되어 있는지 확인합니다. 공간 조건자는 부울 지리 함수를 호출하고 GEOGRAPHY 열을 인수 중 하나로 사용합니다. 다음 예는 ST_DWithin 함수를 사용하는 공간 조건자를 보여줍니다.

WHERE ST_DWithin(geo, ST_GeogPoint(longitude, latitude), 100)

예를 들어 COUNTRY, STATE, ZIP의 열이 포함된 테이블이 있으면 이 테이블에 열 하나를 추가하여 이러한 열의 연결된 버전을 저장합니다. 다음 쿼리 조각은 이러한 경우를 나타냅니다.

CONCAT(country, '+', IFNULL(state, ''), '+', IFNULL(zip, '')) as loc

이 예에서는 누락된 값을 제거하기 위해 IFNULL이 사용되었습니다. 연결된 열을 만든 후에는 이 열을 사용하여 테이블을 클러스터링할 수 있습니다.

JOIN을 공간 데이터와 함께 사용

공간 JOIN은 WHERE 절에 조건자 지리 함수가 있는 두 테이블의 조인입니다. 예를 들면 다음과 같습니다.

#standardSQL
-- how many stations within 1 mile range of each zip code?
SELECT
    zipcode AS zip,
    ST_GeogFromText(ANY_VALUE(zip_codes.zipcode_geom)) AS polygon,
    COUNT(*) AS bike_stations
FROM
    `bigquery-public-data.new_york.citibike_stations` AS bike_stations,
    `bigquery-public-data.utility_us.zipcode_area` AS zip_codes
WHERE ST_DWithin(
         ST_GeogFromText(zip_codes.zipcode_geom),
         ST_GeogPoint(bike_stations.longitude, bike_stations.latitude),
         1609.34)
GROUP BY zip
ORDER BY bike_stations DESC

지리 데이터가 유지되면 공간 조인 성능이 향상됩니다. 위의 예는 쿼리의 지리 값을 생성합니다. 지리 값을 BigQuery 테이블에 저장하면 성능이 더 향상됩니다.

예를 들어 다음 쿼리는 경도와 위도 쌍을 검색하여 지리적 점으로 변환합니다. 이 쿼리를 실행하려면 쿼리 결과를 저장할 새로운 대상 테이블을 지정해야 합니다.

SELECT
  *,
  ST_GeogPoint(pLongitude, pLatitude) AS p
FROM
  mytable

BigQuery는 다음 표준 SQL 조건자 함수를 사용하여 INNER JOIN 연산자와 CROSS JOIN 연산자에 최적화된 공간 JOIN을 구현합니다.

다음과 같은 경우에는 공간 조인이 최적화되지 않습니다.

  • LEFT, RIGHT 또는 FULL OUTER 조인의 경우
  • ANTI 조인과 관련된 경우
  • 공간 조건자를 부정하는 경우

ST_DWithin 조건자를 사용하는 JOIN은 거리 매개변수가 상수 표현식일 때만 최적화됩니다.

공간 데이터 내보내기

BigQuery에서 공간 데이터를 내보낼 때 GEOGRAPHY 열은 형식이 항상 WKT 문자열로 지정됩니다. 데이터를 GeoJSON 형식으로 내보내려면 ST_AsGeoJSON 함수를 사용합니다.

내보낸 데이터를 분석하는 데 사용되는 도구가 GEOGRAPHY 데이터 유형을 인식하지 못하면 ST_AsText 또는 ST_AsGeoJSON과 같은 지리 함수를 사용하여 열 값을 문자열로 변환하면 됩니다. BigQuery GIS는 필요한 경우 줄에 점을 추가하여 에지의 변환된 시퀀스가 원래의 측지선에서 10미터 이내에 유지되도록 합니다.

예를 들어 다음 쿼리는 ST_AsGeoJSON을 사용하여 GeoJSON 값을 문자열로 변환합니다.

SELECT
  ST_AsGeoJSON(ST_MakeLine(ST_GeogPoint(1,1), ST_GeogPoint(3,2)))

결과 데이터는 다음과 유사한 형태입니다.

{ "type": "LineString", "coordinates": [ [1, 1], [1.99977145571783, 1.50022838764041], [2.49981908082299, 1.75018082434274], [3, 2] ] }

GeoJSON 선에 두 개의 점이 추가되었습니다. BigQuery GIS는 이러한 점을 추가하여 GeoJSON 선이 지면에서 원래의 선과 동일한 경로를 밀접하게 따르도록 합니다.

BigQuery 클라이언트 라이브러리의 지리 작업

Python용 BigQuery 클라이언트 라이브러리만 현재 GEOGRAPHY 데이터 유형을 지원합니다. 다른 클라이언트 라이브러리의 경우에는 ST_ASTEXT 또는 ST_ASGEOJSON 함수를 사용하여 GEOGRAPHY 값을 문자열로 변환하세요. 예를 들어 ST_AsText 함수 ST_AsText(ANY_VALUE(zip_regions_geometry.geometry)) AS geometry를 사용하세요.

ST_AsText를 사용하여 텍스트로 변환하면 하나의 값만 저장되며, WKT로 변환하면 데이터가 GEOGRAPHY 유형 대신 STRING 유형으로 주석 처리됩니다.

다음 단계

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

도움이 필요하시나요? 지원 페이지를 방문하세요.