반응형

3 Ways Of Bigquery Geodata Visualization

지난 포스트에 Python으로 하는 H3 공간 분석 를 포스팅한 적이 있습니다. 지리정보는 표현하고자 하는 지리 범위와 차원 깊이, 축에 따라 데이터양이 기하급수적으로 늘어납니다. 이러한 데이터를 csv나 parquet으로 저장해 두고 매번 사용하는 것은 굉장히 까다롭고, 수정/추가 작업에도 문제가 발생합니다.
오늘은 이러한 문제를 극복하기 위해 공식문서 에 소개된 bigquery지리정보를 H3 형태로 시각화하는 3가지 방법을 공유합니다.

I. Bigquery Geo Viz

bigquey geo viz main

Google 지도 API를 사용하여 BigQuery에서 지리정보 데이터를 시각화하기 위한 웹 도구로 SQL 쿼리를 실행하고 대화형 지도에 결과를 표시할 수 있습니다. 이를 통해 유연한 스타일 지정 기능을 사용하여 데이터를 분석 및 탐색할 수 있습니다. 이 방법은 1회성으로 공유가 필요한 데이터를 시각화할 때 또는 빠르게 데이터만 확인하고 싶을 때 아주 유용한 방법입니다.

1. 장단점

장점

  • 쿼리 실행결과를 즉각적으로 시각화해주며, geo data type을 자동인식하여 편리함
  • bigquery에서 지원하는 모든 지리 데이터(point, line, polygon) 지원
  • 구글 지도 API 사용
  • 쿼리 단계에서 전처리 가능

단점

  • 한번에 한 개의 쿼리가 실행되어 그 결과값만 표현이 가능
  • 쿼리가 무거울수록 부하가 급증(로컬에서 실행됨)
  • 시각화 다운로드 불가(오프라인 수정 불가)

2. 활용

WITH geodata as (
    SELECT
    tract_ce,
    jslibs.h3.compact(
      jslibs.h3.ST_H3_POLYFILLFROMGEOG(tract_geom,14)) as geo 
  FROM 
    `bigquery-public-data.geo_census_tracts`.census_tracts_new_york 
  WHERE
    CAST(geo_id AS int64) BETWEEN 36047000600 AND 36047001200
)

SELECT 
  ROUND(ST_AREA(jslibs.h3.ST_H3_BOUNDARY(h3))) as area, 
  jslibs.h3.ST_H3_BOUNDARY(h3) as h3geo 
FROM 
  geodata
CROSS JOIN 
  UNNEST(geo) as h3

빅쿼리의 공공 데이터를 사용하여 뉴욕 브루클린의 거리 일부를 H3로 표현합니다. H3는 Geo Polygon의 해싱된 정보이기 때문에 H3 정보를 Bigquery에서 인식할 수 있는 Polygon으로 바꿔줘야 합니다.
문제는 빅쿼리에는 이러한 변환을 지원하는 함수가 없기 때문에 UDF를 만들어야 합니다. 다만 다행스럽게도 관련된 오픈소스 라이브러리가 많기 때문에 이를 사용하는 방법도 있습니다. 본 게시글에서는 BigQuery JS Libs 를 사용합니다.

해당 라이브러리에 관련한 더 자세한 정보는 함께 보면 좋은 자료를 참고하시기 바랍니다.

스크린샷 2021-02-28 오후 3 59 40

실행시키면 위와 같은 형태의 데이터가 곧바로 출력됩니다.

II. Notebook(Colab)

노트북을 활용한 시각화는 Python으로 하는 H3 공간 분석 와 동일한 방법을 사용합니다.
위 게시물과 차이는 pandas gbq 를 활용해 쿼리를 통신하는 데 있습니다.

query = """
WITH data as (
    SELECT
    tract_ce,
    jslibs.h3.compact(jslibs.h3.ST_H3_POLYFILLFROMGEOG(tract_geom,14)) as geo 
  FROM 
    `bigquery-public-data.geo_census_tracts`.census_tracts_new_york 
  WHERE
    CAST(geo_id AS int64) BETWEEN 36047000600 AND 36047001200
)

SELECT 
  ROUND(st_area(jslibs.h3.ST_H3_BOUNDARY(h3))) as area, 
  jslibs.h3.ST_H3_BOUNDARY(h3) as geometry
FROM 
  data
CROSS JOIN 
  UNNEST(geo) as h3
"""

raw = pd.read_gbq(
    query = query
)

geo = gpd.GeoDataFrame(raw)
geo.crs = {'init': 'epsg:4326'}

III. Google Earth Engine

구글 어스 엔진을 활용하여 지리정보를 시각화할 수 있습니다. API를 활용하기 때문에 II와 같이 colab을 활용하거나 earth engine code editor 를 사용합니다. 따라서 folium 등 지도 라이브러리를 사용한다는 점 역시 동일합니다. 그러나 구글어스엔진에 준비된 여러 위성사진과 레이어를 이용해 더욱 유용한 시각 정보 전달이 가능합니다.

example of earth engine code editor

구글 어스 엔진을 활용한 시각화의 경우 구글 어스 엔진을 활용한 공간 분석 기초를 참고해주시기 바랍니다.

1. 장단점

장점

  • 어스 엔진 코드 에디터를 이용해 즉시 결과를 확인 가능
  • 위성 데이터를 활용하여 매우 세밀하고 현실적인 지도 사용
  • 시계열 표현과 depth 표현에 뛰어남

 

단점

  • 구글 어스(엔진) 가입 필수
  • 빅쿼리와 연동하기 위해서는 데이터를 스토리지에 저장하여 호출해야 하므로 파이프라인 구축이 필요(저장소를 경유해야 함)
  • 더 정교하고, depth 표현이 쉬운 방법 외에 II. notebook 활용 부분과 다른 점이 크게 없다.(오히려 더 복잡해진다.)
반응형
복사했습니다!