Colab 노트북을 사용하여 지리정보 분석 데이터 시각화


이 튜토리얼에서는 Colab 노트북을 사용하여 BigQuery의 지리 공간 분석 데이터를 시각화합니다.

이 튜토리얼에서는 다음 BigQuery 공개 데이터 세트를 사용합니다.

이러한 공개 데이터 세트에 액세스하는 방법에 대한 자세한 내용은 Google Cloud 콘솔에서 공개 데이터 세트에 액세스를 참고하세요.

공개 데이터 세트를 사용하여 다음과 같은 시각화를 만듭니다.

  • Ford GoBike Share 데이터 세트의 모든 자전거 공유 스테이션의 분산 플롯
  • 샌프란시스코 지역 데이터 세트의 다각형
  • 동네별 자전거 공유 스테이션 수를 보여주는 등치 지역도
  • 샌프란시스코 경찰서 신고 데이터 세트의 히트맵

목표

  • Google Cloud 및 원하는 경우 Google 지도로 인증을 설정합니다.
  • BigQuery에서 데이터를 쿼리하고 결과를 Colab에 다운로드합니다.
  • Python 데이터 과학 도구를 사용하여 변환 및 분석을 실행합니다.
  • 산점도, 다각형, 지도 히트맵, 히트맵을 비롯한 시각화를 만듭니다.

비용

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud구성요소를 사용합니다.

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용합니다. 신규 Google Cloud 사용자는 무료 체험판을 이용할 수 있습니다.

이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

시작하기 전에

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the BigQuery and Google Maps JavaScript APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the BigQuery and Google Maps JavaScript APIs.

    Enable the APIs

  8. 이 문서의 태스크를 수행하는 데 필요한 권한이 있는지 확인합니다.

필요한 역할

새 프로젝트를 만드는 경우 프로젝트 소유자가 되며 이 튜토리얼을 완료하는 데 필요한 모든 필수 IAM 권한이 부여됩니다.

기존 프로젝트를 사용하는 경우 쿼리 작업을 실행하려면 다음과 같은 프로젝트 수준 역할이 필요합니다.

Make sure that you have the following role or roles on the project:

Check for the roles

  1. In the Google Cloud console, go to the IAM page.

    Go to IAM
  2. Select the project.
  3. In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.

  4. For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.

Grant the roles

  1. In the Google Cloud console, go to the IAM page.

    IAM으로 이동
  2. 프로젝트를 선택합니다.
  3. 액세스 권한 부여를 클릭합니다.
  4. 새 주 구성원 필드에 사용자 식별자를 입력합니다. 일반적으로 Google 계정의 이메일 주소입니다.

  5. 역할 선택 목록에서 역할을 선택합니다.
  6. 역할을 추가로 부여하려면 다른 역할 추가를 클릭하고 각 역할을 추가합니다.
  7. 저장을 클릭합니다.

BigQuery의 역할에 대한 자세한 내용은 사전 정의된 IAM 역할을 참고하세요.

Colab 노트북 만들기

이 튜토리얼에서는 Colab 노트북을 빌드하여 지리정보 분석 데이터를 시각화합니다. 튜토리얼의 GitHub 버전 상단에 있는 링크(Colab의 BigQuery Geospatial Visualization)를 클릭하여 Colab, Colab Enterprise 또는 BigQuery 스튜디오에서 사전 빌드된 버전의 노트북을 열 수 있습니다.

  1. Colab을 엽니다.

    Colab 열기

  2. 노트북 열기 대화상자에서 새 노트북을 클릭합니다.

  3. Untitled0.ipynb를 클릭하고 노트북 이름을 bigquery-geo.ipynb로 변경합니다.

  4. 파일 > 저장을 선택합니다.

Google Cloud 및 Google 지도로 인증

이 튜토리얼에서는 BigQuery 데이터 세트를 쿼리하고 Google 지도 JavaScript API를 사용합니다. 이러한 리소스를 사용하려면 Google Cloud 및 Maps API로 Colab 런타임을 인증합니다.

Google Cloud로 인증

  1. 코드 셀을 삽입하려면 코드를 클릭합니다.

  2. 프로젝트로 인증하려면 다음 코드를 입력합니다.

    # REQUIRED: Authenticate with your project.
    GCP_PROJECT_ID = "PROJECT_ID"  #@param {type:"string"}
    
    from google.colab import auth
    from google.colab import userdata
    
    auth.authenticate_user(project_id=GCP_PROJECT_ID)

    PROJECT_ID를 프로젝트 ID로 바꿉니다.

  3.  셀 실행을 클릭합니다.

  4. 메시지가 표시되면 허용을 클릭하여 Colab에 사용자 인증 정보에 대한 액세스 권한을 부여합니다(동의하는 경우).

  5. Google 계정으로 로그인 페이지에서 계정을 선택합니다.

  6. 서드 파티 작성 노트북 코드에 로그인 페이지에서 계속을 클릭합니다.

  7. 서드 파티 작성 노트북 코드가 액세스할 수 있는 항목 선택에서 모두 선택을 클릭한 다음 계속을 클릭합니다.

    승인 흐름을 완료한 후에는 Colab 노트북에 출력이 생성되지 않습니다. 셀 옆의 체크표시는 코드가 성공적으로 실행되었음을 나타냅니다.

선택사항: Google 지도로 인증

기본 지도의 지도 제공업체로 Google Maps Platform을 사용하는 경우 Google Maps Platform API 키를 제공해야 합니다. 노트북이 Colab Secrets에서 키를 가져옵니다.

이 단계는 Maps API를 사용하는 경우에만 필요합니다. Google Maps Platform으로 인증하지 않으면 pydeck는 대신 carto 맵을 사용합니다.

  1. Google 지도 문서의 API 키 사용 페이지에 나온 안내에 따라 Google 지도 API 키를 가져옵니다.

  2. Colab 노트북으로 전환한 다음  보안 비밀을 클릭합니다.

  3. 새 보안 비밀 추가를 클릭합니다.

  4. 이름GMP_API_KEY을 입력합니다.

  5. 에 이전에 생성한 Maps API 키 값을 입력합니다.

  6. Secrets 패널을 닫습니다.

  7. 코드 셀을 삽입하려면 코드를 클릭합니다.

  8. 지도 API로 인증하려면 다음 코드를 입력합니다.

    # Authenticate with the Google Maps JavaScript API.
    GMP_API_SECRET_KEY_NAME = "GMP_API_KEY" #@param {type:"string"}
    
    if GMP_API_SECRET_KEY_NAME:
      GMP_API_KEY = userdata.get(GMP_API_SECRET_KEY_NAME) if GMP_API_SECRET_KEY_NAME else None
    else:
      GMP_API_KEY = None
  9. 메시지가 표시되면 액세스 권한 부여를 클릭하여 노트북에 키에 대한 액세스 권한을 부여합니다(동의하는 경우).

  10.  셀 실행을 클릭합니다.

    승인 흐름을 완료한 후에는 Colab 노트북에 출력이 생성되지 않습니다. 셀 옆의 체크표시는 코드가 성공적으로 실행되었음을 나타냅니다.

Python 패키지 설치 및 데이터 과학 라이브러리 가져오기

이 튜토리얼에서는 colabtools (google.colab) Python 모듈 외에도 다른 여러 Python 패키지와 데이터 과학 라이브러리를 사용합니다.

이 섹션에서는 pydeckh3 패키지를 설치합니다. pydeckdeck.gl를 기반으로 Python에서 대규모 공간 렌더링을 제공합니다. h3-py는 Python에서 Uber의 H3 육각형 계층적 지리공간 색인 생성 시스템을 제공합니다.

그런 다음 h3pydeck 라이브러리와 다음 Python 지리 공간 라이브러리를 가져옵니다.

  • geopandas: pandas에서 사용하는 데이터 유형을 확장하여 도형 유형에 대한 공간 작업을 허용합니다.
  • 개별 평면 기하학 객체의 조작 및 분석을 위한 shapely
  • branca: HTML 및 JavaScript 컬러맵을 생성합니다.
  • pydeckearthengine-api를 사용한 시각화의 경우 geemap.deck

라이브러리를 가져온 후 Colab의 pandas DataFrame에 대화형 테이블을 사용 설정합니다.

pydeckh3 패키지 설치

  1. 코드 셀을 삽입하려면 코드를 클릭합니다.

  2. pydeckh3 패키지를 설치하려면 다음 코드를 입력합니다.

    # Install pydeck and h3.
    !pip install pydeck>=0.9 h3>=4.2
  3.  셀 실행을 클릭합니다.

    설치를 완료한 후 Colab 노트북에 출력이 생성되지 않습니다. 셀 옆의 체크표시는 코드가 성공적으로 실행되었음을 나타냅니다.

Python 라이브러리 가져오기

  1. 코드 셀을 삽입하려면 코드를 클릭합니다.

  2. Python 라이브러리를 가져오려면 다음 코드를 입력합니다.

    # Import data science libraries.
    import branca
    import geemap.deck as gmdk
    import h3
    import pydeck as pdk
    import geopandas as gpd
    import shapely
  3.  셀 실행을 클릭합니다.

    코드를 실행한 후 Colab 노트북에 출력이 생성되지 않습니다. 셀 옆의 체크표시는 코드가 성공적으로 실행되었음을 나타냅니다.

pandas DataFrame에 대화형 표 사용 설정

  1. 코드 셀을 삽입하려면 코드를 클릭합니다.

  2. pandas DataFrames를 사용 설정하려면 다음 코드를 입력합니다.

    # Enable displaying pandas data frames as interactive tables by default.
    from google.colab import data_table
    data_table.enable_dataframe_formatter()
  3.  셀 실행을 클릭합니다.

    코드를 실행한 후 Colab 노트북에 출력이 생성되지 않습니다. 셀 옆의 체크표시는 코드가 성공적으로 실행되었음을 나타냅니다.

공유 루틴 만들기

이 섹션에서는 두 가지 공유 루틴을 만듭니다. 하나는 기본 지도에서 레이어를 렌더링하는 공유 루틴이고 다른 하나는 pandas DataFrame을 geopandas DataFrame으로 변환하는 공유 루틴입니다.

  1. 코드 셀을 삽입하려면 코드를 클릭합니다.

  2. 지도에서 레이어를 렌더링하기 위한 공유 루틴을 만들려면 다음 코드를 입력합니다.

    # Set Google Maps as the base map provider.
    MAP_PROVIDER_GOOGLE = pdk.bindings.base_map_provider.BaseMapProvider.GOOGLE_MAPS.value
    
    # Shared routine for rendering layers on a map using geemap.deck.
    def display_pydeck_map(layers, view_state, **kwargs):
      deck_kwargs = kwargs.copy()
    
      # Use Google Maps as the base map only if the API key is provided.
      if GMP_API_KEY:
        deck_kwargs.update({
          "map_provider": MAP_PROVIDER_GOOGLE,
          "map_style": pdk.bindings.map_styles.GOOGLE_ROAD,
          "api_keys": {MAP_PROVIDER_GOOGLE: GMP_API_KEY},
        })
    
      m = gmdk.Map(initial_view_state=view_state, ee_initialize=False, **deck_kwargs)
    
      for layer in layers:
        m.add_layer(layer)
      return m
  3.  셀 실행을 클릭합니다.

    코드를 실행한 후 Colab 노트북에 출력이 생성되지 않습니다. 셀 옆의 체크표시는 코드가 성공적으로 실행되었음을 나타냅니다.

  4. 코드 셀을 삽입하려면 코드를 클릭합니다.

  5. pandas DataFrame을 geopandas DataFrame으로 변환하는 공유 루틴을 만들려면 다음 코드를 입력합니다.

    # Shared routine for converting a pandas dataframe to a GeoPandas dataframe.
    def pandas_to_geopandas(df, geometry_column='geometry'):
    
      # Use shapely library to parse WKT strings into shapely Geometry based
      # objects
      df[geometry_column] = df[geometry_column].dropna().apply(shapely.from_wkt)
    
      # Convert to a geopandas Dataframe
      return gpd.GeoDataFrame(df, geometry=geometry_column, crs='EPSG:4326')
      
  6.  셀 실행을 클릭합니다.

    코드를 실행한 후 Colab 노트북에 출력이 생성되지 않습니다. 셀 옆의 체크표시는 코드가 성공적으로 실행되었음을 나타냅니다.

분산형 차트 만들기

이 섹션에서는 bigquery-public-data.san_francisco_bikeshare.bikeshare_station_info 테이블에서 데이터를 가져와 샌프란시스코 Ford GoBike Share 공개 데이터 세트의 모든 자전거 공유 정거장의 산점도를 만듭니다. 분산형 그래프는 deck.gl 프레임워크의 레이어분산형 그래프 레이어를 사용하여 만들어집니다.

산점도는 개별 포인트의 하위 집합을 검토해야 할 때 유용합니다(스팟 체크라고도 함).

다음 예에서는 레이어와 산점표 레이어를 사용하여 개별 점을 원으로 렌더링하는 방법을 보여줍니다. 지점을 렌더링하려면 자전거 공유 데이터 세트의 station_geom 열에서 경도와 위도를 x 및 y 좌표로 추출해야 합니다.

station_geom 열의 각 항목을 shapely 객체로 변환하는 geopandas DataFrame으로 데이터를 변환하여 좌표를 추출합니다. shapely는 x 및 y와 같은 구성요소를 추출할 수 있는 Python 메서드와 속성을 제공합니다.

  1. 코드 셀을 삽입하려면 코드를 클릭합니다.

  2. 샌프란시스코 Ford GoBike Share 공개 데이터 세트를 쿼리하려면 다음 코드를 입력합니다. 이 코드는 %%bigquery 매직 함수를 사용하여 쿼리를 실행하고 DataFrame으로 결과를 반환합니다.

    # Query the station ID, station name, station short name, and station
    # geometry from the bike share dataset.
    # NOTE: In this tutorial, the denormalized 'lat' and 'lon' columns are
    # ignored. They are decomposed components of the geometry.
    %%bigquery df_sanfrancisco_bike_stations --project {GCP_PROJECT_ID}
    
    SELECT
      station_id,
      name,
      short_name,
      station_geom
    FROM
      `bigquery-public-data.san_francisco_bikeshare.bikeshare_station_info`
  3.  셀 실행을 클릭합니다.

    출력은 다음과 비슷합니다.

    Job ID 12345-1234-5678-1234-123456789 successfully executed: 100%

  4. 코드 셀을 삽입하려면 코드를 클릭합니다.

  5. 데이터를 geopandas DataFrame으로 변환하려면 다음 코드를 입력합니다.

    # Convert the data to a geopandas.GeoDataFrame.
    gdf_sf_bikestations = pandas_to_geopandas(df_sanfrancisco_bike_stations, geometry_column='station_geom')
    gdf_sf_bikestations.info()
  6.  셀 실행을 클릭합니다.

    다음과 유사하게 출력됩니다.

    <class 'geopandas.geodataframe.GeoDataFrame'>
    RangeIndex: 472 entries, 0 to 471
    Data columns (total 4 columns):
    #   Column        Non-Null Count  Dtype
    ---  ------        --------------  -----
    0   station_id    472 non-null    object
    1   name          472 non-null    object
    2   short_name    472 non-null    object
    3   station_geom  472 non-null    geometry
    dtypes: geometry(1), object(3)
    memory usage: 14.9+ KB
    
  7. 코드 셀을 삽입하려면 코드를 클릭합니다.

  8. DataFrame의 처음 5개 행을 미리 보려면 다음 코드를 입력합니다.

    # Preview the first five rows
    gdf_sf_bikestations.head()
  9.  셀 실행을 클릭합니다.

    출력은 다음과 비슷합니다.

    DataFrame의 처음 5개 행

  10. 코드 셀을 삽입하려면 코드를 클릭합니다.

  11. station_geom 열에서 경도와 위도 값을 추출하려면 다음 코드를 입력합니다.

    # Extract the longitude (x) and latitude (y) from station_geom.
    gdf_sf_bikestations["longitude"] = gdf_sf_bikestations["station_geom"].x
    gdf_sf_bikestations["latitude"] = gdf_sf_bikestations["station_geom"].y
  12.  셀 실행을 클릭합니다.

    코드를 실행한 후 Colab 노트북에 출력이 생성되지 않습니다. 셀 옆의 체크표시는 코드가 성공적으로 실행되었음을 나타냅니다.

  13. 코드 셀을 삽입하려면 코드를 클릭합니다.

  14. 이전에 추출한 경도 및 위도 값을 기반으로 자전거 공유 스테이션의 산점도를 렌더링하려면 다음 코드를 입력합니다.

    # Render a scatter plot using pydeck with the extracted longitude and
    # latitude columns in the gdf_sf_bikestations geopandas.GeoDataFrame.
    scatterplot_layer = pdk.Layer(
      "ScatterplotLayer",
      id="bike_stations_scatterplot",
      data=gdf_sf_bikestations,
      get_position=['longitude', 'latitude'],
      get_radius=100,
      get_fill_color=[255, 0, 0, 140],  # Adjust color as desired
      pickable=True,
    )
    
    view_state = pdk.ViewState(latitude=37.77613, longitude=-122.42284, zoom=12)
    display_pydeck_map([scatterplot_layer], view_state)
  15.  셀 실행을 클릭합니다.

    출력은 다음과 비슷합니다.

    자전거 공유소의 렌더링된 산점도

다각형 시각화

지리정보 분석을 사용하면 GEOGRAPHY 데이터 유형과 GoogleSQL 지리 함수를 사용하여 BigQuery에서 지리공간 데이터를 분석하고 시각화할 수 있습니다.

지리정보 분석의 GEOGRAPHY 데이터 유형은 점, 유도선, 다각형의 모음으로, 점 집합 또는 지구 표면의 하위 집합으로 표시됩니다. GEOGRAPHY 유형에는 다음과 같은 객체가 포함될 수 있습니다.

  • 포인트
  • 다각형
  • 다중 다각형

지원되는 모든 객체 목록은 GEOGRAPHY 유형 문서를 참고하세요.

예상되는 도형을 알지 못하는 상태에서 지리 공간 데이터가 제공되는 경우 데이터를 시각화하여 도형을 찾을 수 있습니다. 지리적 데이터를 GeoJSON 형식으로 변환하여 도형을 시각화할 수 있습니다. 그런 다음 deck.gl 프레임워크의 GeoJSON 레이어를 사용하여 GeoJSON 데이터를 시각화할 수 있습니다.

이 섹션에서는 샌프란시스코 지역 데이터 세트의 지리적 데이터를 쿼리한 후 다각형을 시각화합니다.

  1. 코드 셀을 삽입하려면 코드를 클릭합니다.

  2. San Francisco Neighborhoods 데이터 세트의 bigquery-public-data.san_francisco_neighborhoods.boundaries 테이블에서 지리적 데이터를 쿼리하려면 다음 코드를 입력합니다. 이 코드는 %%bigquery 매직 함수를 사용하여 쿼리를 실행하고 DataFrame으로 결과를 반환합니다.

    # Query the neighborhood name and geometry from the San Francisco
    # neighborhoods dataset.
    %%bigquery df_sanfrancisco_neighborhoods --project {GCP_PROJECT_ID}
    
    SELECT
      neighborhood,
      neighborhood_geom AS geometry
    FROM
      `bigquery-public-data.san_francisco_neighborhoods.boundaries`
  3.  셀 실행을 클릭합니다.

    출력은 다음과 비슷합니다.

    Job ID 12345-1234-5678-1234-123456789 successfully executed: 100%

  4. 코드 셀을 삽입하려면 코드를 클릭합니다.

  5. 결과를 geopandas 형식으로 변환하려면 다음 코드를 입력합니다.

    # Convert the query results to geopandas format.
    gdf_sanfrancisco_neighborhoods = pandas_to_geopandas(df_sanfrancisco_neighborhoods)
    gdf_sanfrancisco_neighborhoods.info()
  6.  셀 실행을 클릭합니다.

    다음과 같은 결과가 표시됩니다.

    <class 'geopandas.geodataframe.GeoDataFrame'>
    RangeIndex: 117 entries, 0 to 116
    Data columns (total 2 columns):
    #   Column        Non-Null Count  Dtype
    ---  ------        --------------  -----
    0   neighborhood  117 non-null    object
    1   geometry      117 non-null    geometry
    dtypes: geometry(1), object(1)
    memory usage: 2.0+ KB
    
  7. DataFrame의 첫 번째 행을 미리 보려면 다음 코드를 입력합니다.

    # Preview the first row
    gdf_sanfrancisco_neighborhoods.head(1)
  8.  셀 실행을 클릭합니다.

    출력은 다음과 비슷합니다.

    DataFrame의 첫 번째 행입니다.

    결과에서 데이터가 다각형임을 확인할 수 있습니다.

  9. 코드 셀을 삽입하려면 코드를 클릭합니다.

  10. 다각형을 시각화하려면 다음 코드를 입력합니다. pydeck는 도형 열의 각 shapely 객체 인스턴스를 GeoJSON 형식으로 변환하는 데 사용됩니다.

    # Visualize the polygons.
    geojson_layer = pdk.Layer(
        'GeoJsonLayer',
        id="sf_neighborhoods",
        data=gdf_sanfrancisco_neighborhoods,
        get_line_color=[127, 0, 127, 255],
        get_fill_color=[60, 60, 60, 50],
        get_line_width=100,
        pickable=True,
        stroked=True,
        filled=True,
      )
    view_state = pdk.ViewState(latitude=37.77613, longitude=-122.42284, zoom=12)
    display_pydeck_map([geojson_layer], view_state)
  11.  셀 실행을 클릭합니다.

    출력은 다음과 비슷합니다.

    샌프란시스코 지역 데이터 세트에서 렌더링된 다각형

등치 지역도 만들기

GeoJSON 형식으로 변환하기 어려운 다각형이 포함된 데이터를 탐색하는 경우 deck.gl 프레임워크의 다각형 레이어를 대신 사용할 수 있습니다. 다각형 레이어는 점 배열과 같은 특정 유형의 입력 데이터를 처리할 수 있습니다.

이 섹션에서는 다각형 레이어를 사용하여 점 배열을 렌더링하고 결과를 사용하여 등치 지역도를 렌더링합니다. 지도에는 샌프란시스코 지역 데이터 세트의 데이터를 샌프란시스코 Ford GoBike 공유 데이터 세트와 결합하여 동네별로 공유 자전거 충전소의 밀도를 보여주는 지도 표시입니다.

  1. 코드 셀을 삽입하려면 코드를 클릭합니다.

  2. 동네별로 충전소 수를 집계하고 계산하고 점 배열이 포함된 polygon 열을 만들려면 다음 코드를 입력합니다.

    # Aggregate and count the number of stations per neighborhood.
    gdf_count_stations = gdf_sanfrancisco_neighborhoods.sjoin(gdf_sf_bikestations, how='left', predicate='contains')
    gdf_count_stations = gdf_count_stations.groupby(by='neighborhood')['station_id'].count().rename('num_stations')
    gdf_stations_x_neighborhood = gdf_sanfrancisco_neighborhoods.join(gdf_count_stations, on='neighborhood', how='inner')
    
    # To simulate non-GeoJSON input data, create a polygon column that contains
    # an array of points by using the pandas.Series.map method.
    gdf_stations_x_neighborhood['polygon'] = gdf_stations_x_neighborhood['geometry'].map(lambda g: list(g.exterior.coords))
  3.  셀 실행을 클릭합니다.

    코드를 실행한 후 Colab 노트북에 출력이 생성되지 않습니다. 셀 옆의 체크표시는 코드가 성공적으로 실행되었음을 나타냅니다.

  4. 코드 셀을 삽입하려면 코드를 클릭합니다.

  5. 각 다각형에 fill_color 열을 추가하려면 다음 코드를 입력합니다.

    # Create a color map gradient using the branch library, and add a fill_color
    # column for each of the polygons.
    colormap = branca.colormap.LinearColormap(
      colors=["lightblue", "darkred"],
      vmin=0,
      vmax=gdf_stations_x_neighborhood['num_stations'].max(),
    )
    gdf_stations_x_neighborhood['fill_color'] = gdf_stations_x_neighborhood['num_stations'] \
      .map(lambda c: list(colormap.rgba_bytes_tuple(c)[:3]) + [0.7 * 255])   # force opacity of 0.7
  6.  셀 실행을 클릭합니다.

    코드를 실행한 후 Colab 노트북에 출력이 생성되지 않습니다. 셀 옆의 체크표시는 코드가 성공적으로 실행되었음을 나타냅니다.

  7. 코드 셀을 삽입하려면 코드를 클릭합니다.

  8. 다각형 레이어를 렌더링하려면 다음 코드를 입력합니다.

    # Render the polygon layer.
    polygon_layer = pdk.Layer(
      'PolygonLayer',
      id="bike_stations_choropleth",
      data=gdf_stations_x_neighborhood,
      get_polygon='polygon',
      get_fill_color='fill_color',
      get_line_color=[0, 0, 0, 255],
      get_line_width=50,
      pickable=True,
      stroked=True,
      filled=True,
    )
    view_state = pdk.ViewState(latitude=37.77613, longitude=-122.42284, zoom=12)
    display_pydeck_map([polygon_layer], view_state)
  9.  셀 실행을 클릭합니다.

    출력은 다음과 비슷합니다.

    샌프란시스코 지역의 렌더링된 다각형 레이어

히트맵 만들기

지도 면적 표시는 의미 있는 경계가 알려진 경우에 유용합니다. 의미 있는 경계가 알려지지 않은 데이터가 있는 경우 히트맵 레이어를 사용하여 연속 밀도를 렌더링할 수 있습니다.

다음 예에서는 샌프란시스코 경찰서 (SFPD) 신고 데이터 세트의 bigquery-public-data.san_francisco_sfpd_incidents.sfpd_incidents 테이블에 있는 데이터를 쿼리합니다. 이 데이터는 2015년의 이슈 분포를 시각화하는 데 사용됩니다.

히트맵의 경우 렌더링하기 전에 데이터를 정규화하고 집계하는 것이 좋습니다. 이 예에서는 Carto H3 공간 색인 생성을 사용하여 데이터가 양자화되고 집계됩니다. 히트맵은 deck.gl 프레임워크의 히트맵 레이어를 사용하여 만들어집니다.

이 예에서는 h3 Python 라이브러리를 사용하여 퀀타이징을 실행하여 사고 지점을 6각형으로 집계합니다. h3.latlng_to_cell 함수는 이슈의 위치 (위도 및 경도)를 H3 셀 색인에 매핑하는 데 사용됩니다. H3 해상도가 9이면 히트맵에 충분한 집계된 육각형이 제공됩니다. h3.cell_to_latlng 함수는 각 육각형의 중심을 결정하는 데 사용됩니다.

  1. 코드 셀을 삽입하려면 코드를 클릭합니다.

  2. 샌프란시스코 경찰서 (SFPD) 신고 데이터 세트의 데이터를 쿼리하려면 다음 코드를 입력합니다. 이 코드는 %%bigquery 매직 함수를 사용하여 쿼리를 실행하고 결과를 DataFrame으로 반환합니다.

    # Query the incident key and location  data from the SFPD reports dataset.
    %%bigquery df_sanfrancisco_incidents_2015  --project {GCP_PROJECT_ID}
    
    SELECT
      unique_key,
      location
    FROM (
      SELECT
        unique_key,
        location, # WKT string
        EXTRACT(YEAR FROM timestamp) AS year,
      FROM `bigquery-public-data.san_francisco_sfpd_incidents.sfpd_incidents` incidents
    )
    WHERE year = 2015
  3.  셀 실행을 클릭합니다.

    출력은 다음과 비슷합니다.

    Job ID 12345-1234-5678-1234-123456789 successfully executed: 100%

  4. 코드 셀을 삽입하려면 코드를 클릭합니다.

  5. 결과를 geopandas DataFrame으로 변환하려면 다음 코드를 입력합니다.

    # Convert the results into a geopandas.GeoDataFrame.
    gdf_incidents = pandas_to_geopandas(df_sanfrancisco_incidents_2015, geometry_column='location')
  6.  셀 실행을 클릭합니다.

    코드를 실행한 후 Colab 노트북에 출력이 생성되지 않습니다. 셀 옆의 체크표시는 코드가 성공적으로 실행되었음을 나타냅니다.

  7. 코드 셀을 삽입하려면 코드를 클릭합니다.

  8. 각 사고의 위도와 경도에 대한 셀을 계산하고, 각 셀의 사고를 집계하고, geopandas DataFrame을 생성하고, 히트맵 레이어의 각 육각형의 중심을 추가하려면 다음 코드를 입력합니다.

    # Compute the cell for each incident's latitude and longitude.
    H3_RESOLUTION = 9
    gdf_incidents['h3_cell'] = df_sanfrancisco_incidents_2015['location'].apply(
        lambda location: h3.latlng_to_cell(location.y, location.x, H3_RESOLUTION)
    )
    
    # Aggregate the incidents for each hexagon cell.
    count_incidents = gdf_incidents.groupby(by='h3_cell')['unique_key'].count().rename('num_incidents')
    
    # Construct a new geopandas.GeoDataFrame with the aggregate results.
    # Add the center of each hexagon for the HeatmapLayer to render.
    gdf_incidents_x_cell = gpd.GeoDataFrame(data=count_incidents).reset_index()
    gdf_incidents_x_cell['h3_center'] = gdf_incidents_x_cell['h3_cell'].apply(h3.cell_to_latlng)
    gdf_incidents_x_cell.info()
  9.  셀 실행을 클릭합니다.

    출력은 다음과 비슷합니다.

    <class 'geopandas.geodataframe.GeoDataFrame'>
    RangeIndex: 969 entries, 0 to 968
    Data columns (total 3 columns):
    #   Column         Non-Null Count  Dtype
    --  ------         --------------  -----
    0   h3_cell        969 non-null    object
    1   num_incidents  969 non-null    Int64
    2   h3_center      969 non-null    object
    dtypes: Int64(1), object(2)
    memory usage: 23.8+ KB
    
  10. 코드 셀을 삽입하려면 코드를 클릭합니다.

  11. DataFrame의 처음 5개 행을 미리 보려면 다음 코드를 입력합니다.

    # Preview the first five rows.
    gdf_incidents_x_cell.head()
  12.  셀 실행을 클릭합니다.

    출력은 다음과 비슷합니다.

    DataFrame의 처음 5개 행

  13. 코드 셀을 삽입하려면 코드를 클릭합니다.

  14. 데이터를 HeatmapLayer에서 사용할 수 있는 JSON 형식으로 변환하려면 다음 코드를 입력합니다.

    # Convert to a JSON format recognized by the HeatmapLayer.
    def _make_heatmap_datum(row) -> dict:
      return {
          "latitude": row['h3_center'][0],
          "longitude": row['h3_center'][1],
          "weight": float(row['num_incidents']),
      }
    
    heatmap_data = gdf_incidents_x_cell.apply(_make_heatmap_datum, axis='columns').values.tolist()
  15.  셀 실행을 클릭합니다.

    코드를 실행한 후 Colab 노트북에 출력이 생성되지 않습니다. 셀 옆의 체크표시는 코드가 성공적으로 실행되었음을 나타냅니다.

  16. 코드 셀을 삽입하려면 코드를 클릭합니다.

  17. 히트맵을 렌더링하려면 다음 코드를 입력합니다.

    # Render the heatmap.
    heatmap_layer = pdk.Layer(
      "HeatmapLayer",
      id="sfpd_heatmap",
      data=heatmap_data,
      get_position=['longitude', 'latitude'],
      get_weight='weight',
      opacity=0.7,
      radius_pixels=99,  # this limitation can introduce artifacts (see above)
      aggregation='MEAN',
    )
    view_state = pdk.ViewState(latitude=37.77613, longitude=-122.42284, zoom=12)
    display_pydeck_map([heatmap_layer], view_state)
  18.  셀 실행을 클릭합니다.

    출력은 다음과 비슷합니다.

    렌더링된 히트맵

삭제

이 튜토리얼에서 사용된 리소스 비용이 Google Cloud 계정에 청구되지 않도록 하려면 리소스가 포함된 프로젝트를 삭제하거나 프로젝트를 유지하고 개별 리소스를 삭제하세요.

프로젝트 삭제

콘솔

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

gcloud

    Delete a Google Cloud project:

    gcloud projects delete PROJECT_ID

Google 지도 API 키 및 노트북 삭제하기

Google Cloud 프로젝트를 삭제한 후 Google 지도 API를 사용했다면 Colab Secrets에서 Google 지도 API 키를 삭제한 다음 원하는 경우 노트북을 삭제합니다.

  1. Colab에서  보안 비밀을 클릭합니다.

  2. GMP_API_KEY 행 끝에서  삭제를 클릭합니다.

  3. 선택사항: 노트북을 삭제하려면 파일 > 휴지통으로 이동을 클릭합니다.

다음 단계