Dalam tutorial ini, Anda akan memvisualisasikan data analisis geospasial dari BigQuery menggunakan notebook Colab.
Tutorial ini menggunakan set data publik BigQuery berikut:
- San Francisco Ford GoBike Share
- Lingkungan San Francisco
- Laporan Departemen Kepolisian San Francisco (SFPD)
Untuk mengetahui informasi tentang cara mengakses set data publik ini, lihat Mengakses set data publik di konsol Google Cloud .
Anda menggunakan set data publik untuk membuat visualisasi berikut:
- Diagram sebar semua stasiun berbagi sepeda dari set data Ford GoBike Share
- Poligon dalam set data San Francisco Neighborhoods
- Peta koroplet jumlah tempat rental sepeda menurut lingkungan
- Peta panas insiden dari set data Laporan Departemen Kepolisian San Francisco
Membuat notebook Colab
Tutorial ini membuat notebook Colab untuk memvisualisasikan data analisis geospasial. Anda dapat membuka versi notebook bawaan di Colab, Colab Enterprise, atau BigQuery Studio dengan mengklik link di bagian atas versi GitHub dari tutorial—Visualisasi Geospatial BigQuery di Colab.
Buka Colab.
Pada dialog Open notebook, klik New notebook.
Klik
Untitled0.ipynb
dan ubah nama notebook menjadibigquery-geo.ipynb
.Pilih File > Simpan.
Mengautentikasi dengan Google Cloud dan Google Maps
Tutorial ini mengkueri set data BigQuery dan menggunakan Google Maps JavaScript API. Untuk menggunakan resource ini, Anda mengautentikasi runtime Colab dengan Google Cloud dan Maps API.
Autentikasi dengan Google Cloud
Untuk menyisipkan sel kode, klik
Code.Untuk melakukan autentikasi dengan project Anda, masukkan kode berikut:
# 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) # Set GMP_API_KEY to none GMP_API_KEY = None
Ganti PROJECT_ID dengan project ID Anda.
Klik
Run cell.Saat diminta, klik Izinkan untuk memberi Colab akses ke kredensial Anda, jika Anda setuju.
Di halaman Login dengan Google, pilih akun Anda.
Di halaman Sign in to Third-party authored notebook code, klik Continue.
Di Pilih kode notebook yang dibuat pihak ketiga yang dapat diakses, klik Pilih semua, lalu klik Lanjutkan.
Setelah Anda menyelesaikan alur otorisasi, tidak ada output yang dihasilkan di notebook Colab Anda. Tanda centang di samping sel menunjukkan bahwa kode berhasil dijalankan.
Opsional: Mengautentikasi dengan Google Maps
Jika Anda menggunakan Google Maps Platform sebagai penyedia peta untuk peta dasar, Anda harus memberikan kunci API Google Maps Platform. Notebook mengambil kunci dari Colab Secrets Anda.
Langkah ini hanya diperlukan jika Anda menggunakan Maps API. Jika Anda tidak melakukan autentikasi dengan Google Maps Platform, pydeck
akan menggunakan peta carto
.
Dapatkan kunci Google Maps API Anda dengan mengikuti petunjuk di halaman Menggunakan kunci API di dokumentasi Google Maps.
Beralihlah ke notebook Colab Anda, lalu klik
Secrets.Klik Tambahkan secret baru.
Untuk Nama, masukkan
GMP_API_KEY
.Untuk Nilai, masukkan nilai kunci Maps API yang Anda buat sebelumnya.
Tutup panel Secrets.
Untuk menyisipkan sel kode, klik
Code.Untuk mengautentikasi dengan Maps API, masukkan kode berikut:
# 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
Jika diminta, klik Beri akses untuk memberi notebook akses ke kunci Anda, jika Anda setuju.
Klik
Run cell.Setelah Anda menyelesaikan alur otorisasi, tidak ada output yang dihasilkan di notebook Colab Anda. Tanda centang di samping sel menunjukkan bahwa kode berhasil dijalankan.
Menginstal paket Python dan mengimpor library ilmu data
Selain modul Python colabtools
(google.colab
), tutorial ini menggunakan beberapa paket Python dan library ilmu data lainnya.
Di bagian ini, Anda akan menginstal paket pydeck
dan h3
. pydeck
menyediakan rendering spasial skala tinggi di Python, yang didukung oleh deck.gl
.
h3-py
menyediakan Sistem Pengindeksan Geospatial Hierarkis Heksagonal H3 Uber di Python.
Kemudian, Anda mengimpor library h3
dan pydeck
serta library geospasial Python berikut:
geopandas
untuk memperluas jenis data yang digunakan olehpandas
untuk mengizinkan operasi spasial pada jenis geometris.shapely
untuk manipulasi dan analisis objek geometris planar individual.branca
untuk membuat peta warna HTML dan JavaScript.geemap.deck
untuk visualisasi denganpydeck
danearthengine-api
.
Setelah mengimpor library, Anda mengaktifkan tabel interaktif untuk DataFrame pandas
di Colab.
Instal paket pydeck
dan h3
Untuk menyisipkan sel kode, klik
Code.Untuk menginstal paket
pydeck
danh3
, masukkan kode berikut:# Install pydeck and h3. !pip install pydeck>=0.9 h3>=4.2
Klik
Run cell.Setelah Anda menyelesaikan penginstalan, tidak ada output yang dihasilkan di notebook Colab Anda. Tanda centang di samping sel menunjukkan bahwa kode berhasil dijalankan.
Mengimpor library Python
Untuk menyisipkan sel kode, klik
Code.Untuk mengimpor library Python, masukkan kode berikut:
# Import data science libraries. import branca import geemap.deck as gmdk import h3 import pydeck as pdk import geopandas as gpd import shapely
Klik
Run cell.Setelah Anda menjalankan kode, tidak ada output yang dihasilkan di notebook Colab. Tanda centang di samping sel menunjukkan bahwa kode berhasil dijalankan.
Mengaktifkan tabel interaktif untuk DataFrame pandas
Untuk menyisipkan sel kode, klik
Code.Untuk mengaktifkan DataFrame
pandas
, masukkan kode berikut:# Enable displaying pandas data frames as interactive tables by default. from google.colab import data_table data_table.enable_dataframe_formatter()
Klik
Run cell.Setelah Anda menjalankan kode, tidak ada output yang dihasilkan di notebook Colab. Tanda centang di samping sel menunjukkan bahwa kode berhasil dijalankan.
Membuat rutinitas bersama
Di bagian ini, Anda akan membuat rutin bersama yang merender lapisan di peta dasar.
Untuk menyisipkan sel kode, klik
Code.Untuk membuat rutinitas bersama untuk merender lapisan di peta, masukkan kode berikut:
# 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
Klik
Run cell.Setelah Anda menjalankan kode, tidak ada output yang dihasilkan di notebook Colab. Tanda centang di samping sel menunjukkan bahwa kode berhasil dijalankan.
Membuat diagram sebar
Di bagian ini, Anda akan membuat diagram sebar semua stasiun bike share di set data publik San Francisco Ford GoBike Share dengan mengambil data dari tabel bigquery-public-data.san_francisco_bikeshare.bikeshare_station_info
. Diagram
pencar dibuat menggunakan layer
dan scatterplot layer
dari framework deck.gl
.
Diagram sebar berguna saat Anda perlu meninjau subset titik individual (juga dikenal sebagai pemeriksaan di tempat).
Contoh berikut menunjukkan cara menggunakan lapisan dan lapisan diagram sebar untuk merender setiap titik sebagai lingkaran.
Untuk menyisipkan sel kode, klik
Code.Untuk membuat kueri set data publik San Francisco Ford GoBike Share, masukkan kode berikut. Kode ini menggunakan fungsi ajaib
%%bigquery
untuk menjalankan kueri dan menampilkan hasilnya dalam 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 gdf_sf_bikestations --project {GCP_PROJECT_ID} --use_geodataframe station_geom SELECT station_id, name, short_name, station_geom FROM `bigquery-public-data.san_francisco_bikeshare.bikeshare_station_info`
Klik
Run cell.Outputnya mirip dengan hal berikut ini:
Job ID 12345-1234-5678-1234-123456789 successfully executed: 100%
Untuk menyisipkan sel kode, klik
Code.Untuk mendapatkan ringkasan DataFrame, termasuk kolom dan jenis data, masukkan kode berikut:
# Get a summary of the DataFrame gdf_sf_bikestations.info()
Klik
Run cell.Outputnya akan terlihat seperti berikut ini:
<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
Untuk menyisipkan sel kode, klik
Code.Untuk melihat pratinjau lima baris pertama DataFrame, masukkan kode berikut:
# Preview the first five rows gdf_sf_bikestations.head()
Klik
Run cell.Outputnya mirip dengan hal berikut ini:
Untuk merender titik, Anda harus mengekstrak bujur dan lintang sebagai koordinat x dan y dari kolom station_geom
dalam set data bike share.
Karena gdf_sf_bikestations
adalah geopandas.GeoDataFrame
, koordinat diakses langsung dari kolom geometri station_geom
-nya. Anda dapat mengambil
bujur menggunakan atribut .x
kolom dan lintang menggunakan atribut .y
. Kemudian, Anda dapat menyimpannya di kolom bujur dan lintang baru.
Untuk menyisipkan sel kode, klik
Code.Untuk mengekstrak nilai bujur dan lintang dari kolom
station_geom
, masukkan kode berikut:# 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
Klik
Run cell.Setelah Anda menjalankan kode, tidak ada output yang dihasilkan di notebook Colab. Tanda centang di samping sel menunjukkan bahwa kode berhasil dijalankan.
Untuk menyisipkan sel kode, klik
Code.Untuk merender diagram sebar stasiun bike share berdasarkan nilai bujur dan lintang yang Anda ekstrak sebelumnya, masukkan kode berikut:
# 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)
Klik
Run cell.Outputnya mirip dengan hal berikut ini:
Memvisualisasikan poligon
Analisis geospasial memungkinkan Anda menganalisis dan memvisualisasikan data geospasial di BigQuery menggunakan jenis data GEOGRAPHY
dan fungsi geografi GoogleSQL.
Jenis data GEOGRAPHY
dalam analisis geospasial adalah kumpulan titik, linestring, dan
poligon, yang ditampilkan sebagai kumpulan titik, atau subkumpulan permukaan
Bumi. Jenis GEOGRAPHY
dapat berisi objek seperti berikut:
- Poin
- Garis
- Poligon
- Multipoligon
Untuk mengetahui daftar semua objek yang didukung, lihat dokumentasi jenis GEOGRAPHY
.
Jika Anda diberi data geospasial tanpa mengetahui bentuk yang diharapkan, Anda dapat memvisualisasikan data untuk menemukan bentuknya. Anda dapat memvisualisasikan bentuk dengan
mengonversi data geografis ke format GeoJSON
. Kemudian, Anda
dapat memvisualisasikan data GeoJSON
menggunakan lapisan GeoJSON
dari framework deck.gl
.
Di bagian ini, Anda akan membuat kueri data geografis dalam set data San Francisco Neighborhoods, lalu memvisualisasikan poligon.
Untuk menyisipkan sel kode, klik
Code.Untuk mengkueri data geografis dari tabel
bigquery-public-data.san_francisco_neighborhoods.boundaries
dalam set data San Francisco Neighborhoods, masukkan kode berikut. Kode ini menggunakan fungsi ajaib%%bigquery
untuk menjalankan kueri dan menampilkan hasilnya dalam DataFrame:# Query the neighborhood name and geometry from the San Francisco # neighborhoods dataset. %%bigquery gdf_sanfrancisco_neighborhoods --project {GCP_PROJECT_ID} --use_geodataframe geometry SELECT neighborhood, neighborhood_geom AS geometry FROM `bigquery-public-data.san_francisco_neighborhoods.boundaries`
Klik
Run cell.Outputnya mirip dengan hal berikut ini:
Job ID 12345-1234-5678-1234-123456789 successfully executed: 100%
Untuk menyisipkan sel kode, klik
Code.Untuk mendapatkan ringkasan DataFrame, masukkan kode berikut:
# Get a summary of the DataFrame gdf_sanfrancisco_neighborhoods.info()
Klik
Run cell.Hasilnya akan terlihat seperti berikut:
<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
Untuk melihat pratinjau baris pertama DataFrame, masukkan kode berikut:
# Preview the first row gdf_sanfrancisco_neighborhoods.head(1)
Klik
Run cell.Outputnya mirip dengan hal berikut ini:
Dalam hasilnya, perhatikan bahwa data adalah poligon.
Untuk menyisipkan sel kode, klik
Code.Untuk memvisualisasikan poligon, masukkan kode berikut.
pydeck
digunakan untuk mengonversi setiap instance objekshapely
di kolom geometri menjadi formatGeoJSON
:# 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)
Klik
Run cell.Outputnya mirip dengan hal berikut ini:
Membuat peta koroplet
Jika Anda menjelajahi data dengan poligon yang sulit dikonversi ke format GeoJSON
, Anda dapat menggunakan lapisan poligon dari framework deck.gl
. Lapisan poligon dapat memproses data input dari
jenis tertentu seperti array titik.
Di bagian ini, Anda akan menggunakan lapisan poligon untuk merender array titik dan menggunakan hasilnya untuk merender peta koroplet. Peta koroplet menampilkan kepadatan stasiun bike share menurut lingkungan dengan menggabungkan data dari set data San Francisco Neighborhoods dengan set data San Francisco Ford GoBike Share.
Untuk menyisipkan sel kode, klik
Code.Untuk menggabungkan dan menghitung jumlah stasiun per lingkungan dan membuat kolom
polygon
yang berisi array titik, masukkan kode berikut:# 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))
Klik
Run cell.Setelah Anda menjalankan kode, tidak ada output yang dihasilkan di notebook Colab. Tanda centang di samping sel menunjukkan bahwa kode berhasil dijalankan.
Untuk menyisipkan sel kode, klik
Code.Untuk menambahkan kolom
fill_color
untuk setiap poligon, masukkan kode berikut:# 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
Klik
Run cell.Setelah Anda menjalankan kode, tidak ada output yang dihasilkan di notebook Colab. Tanda centang di samping sel menunjukkan bahwa kode berhasil dijalankan.
Untuk menyisipkan sel kode, klik
Code.Untuk merender lapisan poligon, masukkan kode berikut:
# 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)
Klik
Run cell.Outputnya mirip dengan hal berikut ini:
Membuat peta panas
Peta choropleth berguna jika Anda memiliki batas yang bermakna dan diketahui. Jika Anda memiliki data tanpa batas yang bermakna, Anda dapat menggunakan lapisan peta panas untuk merender kepadatan berkelanjutannya.
Dalam contoh berikut, Anda membuat kueri data di tabel bigquery-public-data.san_francisco_sfpd_incidents.sfpd_incidents
dalam set data Laporan Departemen Kepolisian San Francisco (SFPD). Data ini digunakan untuk memvisualisasikan distribusi insiden pada tahun 2015.
Untuk peta panas, sebaiknya kuantisasi dan gabungkan data sebelum
merender. Dalam contoh ini, data dikuantisasi dan digabungkan menggunakan
pengindeksan spasial H3 Carto.
Peta panas dibuat menggunakan lapisan peta panas
dari framework deck.gl
.
Dalam contoh ini, kuantisasi dilakukan menggunakan library Python h3
untuk menggabungkan
titik insiden ke dalam heksagon. Fungsi h3.latlng_to_cell
digunakan untuk memetakan posisi insiden (lintang dan bujur) ke indeks sel H3. Resolusi H3
sembilan memberikan cukup banyak heksagon gabungan untuk peta panas.
Fungsi h3.cell_to_latlng
digunakan untuk menentukan pusat setiap
heksagon.
Untuk menyisipkan sel kode, klik
Code.Untuk membuat kueri data dalam set data Laporan Departemen Kepolisian San Francisco (SFPD), masukkan kode berikut. Kode ini menggunakan fungsi ajaib
%%bigquery
untuk menjalankan kueri dan menampilkan hasilnya dalam DataFrame:# Query the incident key and location data from the SFPD reports dataset. %%bigquery gdf_incidents --project {GCP_PROJECT_ID} --use_geodataframe location_geography SELECT unique_key, location_geography FROM ( SELECT unique_key, SAFE.ST_GEOGFROMTEXT(location) AS location_geography, # WKT string to GEOMETRY EXTRACT(YEAR FROM timestamp) AS year, FROM `bigquery-public-data.san_francisco_sfpd_incidents.sfpd_incidents` incidents ) WHERE year = 2015
Klik
Run cell.Outputnya mirip dengan hal berikut ini:
Job ID 12345-1234-5678-1234-123456789 successfully executed: 100%
Untuk menyisipkan sel kode, klik
Code.Untuk menghitung sel untuk lintang dan bujur setiap insiden, gabungkan insiden untuk setiap sel, buat DataFrame
geopandas
, dan tambahkan pusat setiap segi enam untuk lapisan peta panas, masukkan kode berikut:# Compute the cell for each incident's latitude and longitude. H3_RESOLUTION = 9 gdf_incidents['h3_cell'] = gdf_incidents.geometry.apply( lambda geom: h3.latlng_to_cell(geom.y, geom.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()
Klik
Run cell.Outputnya mirip dengan hal berikut ini:
<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
Untuk menyisipkan sel kode, klik
Code.Untuk melihat pratinjau lima baris pertama DataFrame, masukkan kode berikut:
# Preview the first five rows. gdf_incidents_x_cell.head()
Klik
Run cell.Outputnya mirip dengan hal berikut ini:
Untuk menyisipkan sel kode, klik
Code.Untuk mengonversi data ke dalam format JSON yang dapat digunakan oleh
HeatmapLayer
, masukkan kode berikut:# 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()
Klik
Run cell.Setelah Anda menjalankan kode, tidak ada output yang dihasilkan di notebook Colab. Tanda centang di samping sel menunjukkan bahwa kode berhasil dijalankan.
Untuk menyisipkan sel kode, klik
Code.Untuk merender peta panas, masukkan kode berikut:
# 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)
Klik
Run cell.Outputnya mirip dengan hal berikut ini: