Visualizzare i dati di analisi geospaziali utilizzando un notebook di Colab


In questo tutorial, visualizzerai i dati di analisi geospaziali di BigQuery utilizzando un notebook Colab.

Questo tutorial utilizza i seguenti set di dati pubblici di BigQuery:

Per informazioni su come accedere a questi set di dati pubblici, consulta Accedere ai set di dati pubblici nella Google Cloud console.

Utilizza i set di dati pubblici per creare le seguenti visualizzazioni:

  • Un grafico a dispersione di tutte le stazioni di bike sharing del set di dati Ford GoBike Share
  • Poligoni nel set di dati Quartieri di San Francisco
  • Una mappa coropletica del numero di stazioni di bike sharing per quartiere
  • Una mappa di calore degli incidenti del set di dati dei report del Dipartimento di Polizia di San Francisco

Obiettivi

  • Configura l'autenticazione con Google Cloud e, facoltativamente, Google Maps.
  • Esegui query sui dati in BigQuery e scarica i risultati in Colab.
  • Utilizza gli strumenti di data science di Python per eseguire trasformazioni e analisi.
  • Crea visualizzazioni, tra cui grafici a dispersione, poligoni, mappe coropletiche e mappe di calore.

Costi

In questo documento utilizzi i seguenti componenti fatturabili di Google Cloud:

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il Calcolatore prezzi. I nuovi Google Cloud utenti potrebbero avere diritto a una prova gratuita.

Al termine delle attività descritte in questo documento, puoi evitare la fatturazione continua eliminando le risorse che hai creato. Per ulteriori informazioni, consulta la sezione Pulizia.

Prima di iniziare

  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. Assicurati di disporre delle autorizzazioni necessarie per eseguire le attività descritte in questo documento.

Ruoli obbligatori

Se crei un nuovo progetto, sei il proprietario del progetto e ti vengono concesse tutte le autorizzazioni IAM necessarie per completare questo tutorial.

Se utilizzi un progetto esistente, per eseguire i job di query devi disporre del seguente ruolo a livello di progetto.

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.

    Vai a IAM
  2. Seleziona il progetto.
  3. Fai clic su Concedi accesso.
  4. Nel campo Nuovi principali, inserisci il tuo identificatore utente. In genere si tratta dell'indirizzo email di un Account Google.

  5. Nell'elenco Seleziona un ruolo, seleziona un ruolo.
  6. Per concedere altri ruoli, fai clic su Aggiungi un altro ruolo e aggiungi ogni ruolo aggiuntivo.
  7. Fai clic su Salva.

Per saperne di più sui ruoli in BigQuery, consulta Ruoli IAM predefiniti.

Creare un notebook di Colab

Questo tutorial crea un blocco note di Colab per visualizzare i dati di analisi geospaziali. Puoi aprire una versione predefinita del notebook in Colab, Colab Enterprise o BigQuery Studio facendo clic sui link nella parte superiore della versione GitHub del tutorial Visualizzazione geospaziale di BigQuery in Colab.

  1. Apri Colab.

    Apri Colab

  2. Nella finestra di dialogo Apri blocco note, fai clic su Nuovo blocco note.

  3. Fai clic su Untitled0.ipynb e modifica il nome del notebook in bigquery-geo.ipynb.

  4. Seleziona File > Salva.

Eseguire l'autenticazione con Google Cloud e Google Maps

Questo tutorial esegue query sui set di dati BigQuery e utilizza l'API JavaScript di Google Maps. Per utilizzare queste risorse, devi autenticare il runtime di Colab con Google Cloud e l'API Maps.

Autentica con Google Cloud

  1. Per inserire una cella di codice, fai clic su Codice.

  2. Per autenticarti con il tuo progetto, inserisci il seguente codice:

    # 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)

    Sostituisci PROJECT_ID con l'ID progetto.

  3. Fai clic su  Esegui cella.

  4. Se accetti, quando richiesto fai clic su Consenti per concedere a Colab l'accesso alle tue credenziali.

  5. Nella pagina Accedi con Google, scegli il tuo account.

  6. Nella pagina Accedi al codice del notebook creato da terze parti, fai clic su Continua.

  7. In Seleziona a cosa può accedere il codice del notebook creato da terze parti, fai clic su Seleziona tutto e poi su Continua.

    Dopo aver completato il flusso di autorizzazione, nel tuo blocco note di Colab non viene generato alcun output. Il segno di spunta accanto alla cella indica che il codice è stato eseguito correttamente.

(Facoltativo) Autentica con Google Maps

Se utilizzi Google Maps Platform come provider di mappe per le mappe di base, devi fornire una chiave API di Google Maps Platform. Il notebook recupera la chiave dai tuoi secret di Colab.

Questo passaggio è necessario solo se utilizzi l'API Maps. Se non ti autentichi con Google Maps Platform, pydeck utilizza la mappa carto.

  1. Per ottenere la chiave API di Google Maps, segui le istruzioni riportate nella pagina Utilizzare le chiavi API della documentazione di Google Maps.

  2. Passa al tuo blocco note di Colab e fai clic su  Secrets.

  3. Fai clic su Aggiungi nuovo secret.

  4. In Nome, inserisci GMP_API_KEY.

  5. In Valore, inserisci il valore della chiave API Maps generato in precedenza.

  6. Chiudi il riquadro Secrets.

  7. Per inserire una cella di codice, fai clic su Codice.

  8. Per autenticarti con l'API Maps, inserisci il seguente codice:

    # 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. Se accetti, quando richiesto fai clic su Concedi l'accesso per concedere al notebook l'accesso alla tua chiave.

  10. Fai clic su  Esegui cella.

    Dopo aver completato il flusso di autorizzazione, nel tuo blocco note di Colab non viene generato alcun output. Il segno di spunta accanto alla cella indica che il codice è stato eseguito correttamente.

Installa i pacchetti Python e importa le librerie di data science

Oltre ai moduli Python colabtools (google.colab), questo tutorial utilizza diversi altri pacchetti e librerie di data science per Python.

In questa sezione, installerai i pacchetti pydeck e h3. pydeck fornisce il rendering spaziale su larga scala in Python, basato su deck.gl. h3-py fornisce il sistema di indicizzazione geospaziale gerarchico esagonale H3 di Uber in Python.

Importa poi le librerie h3 e pydeck e le seguenti librerie geospaziali Python:

  • geopandas per estendere i tipi di dati utilizzati da pandas in modo da consentire operazioni spaziali sui tipi geometrici.
  • shapely per la manipolazione e l'analisi di singoli oggetti geometrici piani.
  • branca per generare mappe di colori HTML e JavaScript.
  • geemap.deck per la visualizzazione con pydeck e earthengine-api.

Dopo aver importato le librerie, attiva le tabelle interattive per i pandas DataFrame in Colab.

Installa i pacchetti pydeck e h3

  1. Per inserire una cella di codice, fai clic su Codice.

  2. Per installare i pacchetti pydeck e h3, inserisci il seguente codice:

    # Install pydeck and h3.
    !pip install pydeck>=0.9 h3>=4.2
  3. Fai clic su  Esegui cella.

    Al termine dell'installazione, nel blocco note di Colab non viene generato alcun output. Il segno di spunta accanto alla cella indica che il codice è stato eseguito correttamente.

Importa le librerie Python

  1. Per inserire una cella di codice, fai clic su Codice.

  2. Per importare le librerie Python, inserisci il seguente codice:

    # Import data science libraries.
    import branca
    import geemap.deck as gmdk
    import h3
    import pydeck as pdk
    import geopandas as gpd
    import shapely
  3. Fai clic su  Esegui cella.

    Dopo aver eseguito il codice, non viene generato alcun output nel tuo notebook Colab. Il segno di spunta accanto alla cella indica che il codice è stato eseguito correttamente.

Attivare le tabelle interattive per i DataFrame di Pandas

  1. Per inserire una cella di codice, fai clic su Codice.

  2. Per attivare i DataFrame pandas, inserisci il seguente codice:

    # Enable displaying pandas data frames as interactive tables by default.
    from google.colab import data_table
    data_table.enable_dataframe_formatter()
  3. Fai clic su  Esegui cella.

    Dopo aver eseguito il codice, non viene generato alcun output nel tuo notebook Colab. Il segno di spunta accanto alla cella indica che il codice è stato eseguito correttamente.

Creare routine condivise

In questa sezione crei due routine condivise: una routine condivisa che visualizza i livelli su una mappa di base e una routine condivisa che converte un DataFrame pandas in un DataFrame geopandas.

  1. Per inserire una cella di codice, fai clic su Codice.

  2. Per creare una routine condivisa per il rendering dei livelli su una mappa, inserisci il seguente codice:

    # 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. Fai clic su  Esegui cella.

    Dopo aver eseguito il codice, non viene generato alcun output nel tuo notebook Colab. Il segno di spunta accanto alla cella indica che il codice è stato eseguito correttamente.

  4. Per inserire una cella di codice, fai clic su Codice.

  5. Per creare una routine condivisa che converta un DataFrame pandas in un DataFrame geopandas, inserisci il seguente codice:

    # 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. Fai clic su  Esegui cella.

    Dopo aver eseguito il codice, non viene generato alcun output nel tuo notebook Colab. Il segno di spunta accanto alla cella indica che il codice è stato eseguito correttamente.

Creare un grafico a dispersione

In questa sezione, crei un grafico a dispersione di tutte le stazioni di bike sharing nel set di dati pubblico Ford GoBike Share di San Francisco recuperando i dati dalla tabella bigquery-public-data.san_francisco_bikeshare.bikeshare_station_info. Il grafico a dispersione viene creato utilizzando un livello e un livello grafico a dispersione del framework deck.gl.

I grafici a dispersione sono utili quando devi esaminare un sottoinsieme di singoli punti (noto anche come controllo a campione).

Il seguente esempio mostra come utilizzare un livello e un livello di grafico a dispersione per visualizzare i singoli punti come cerchi. Per eseguire il rendering dei punti, devi estrarre la longitudine e la latitudine come coordinate x e y dalla colonna station_geom nel set di dati di bike sharing.

Le coordinate vengono estratte convertendo i dati in un geopandas DataFrame, che converte ogni elemento della colonna station_geom in un shapely oggetto. shapely fornisce metodi e proprietà Python che ti consentono di estrarre componenti come x e y.

  1. Per inserire una cella di codice, fai clic su Codice.

  2. Per eseguire una query sul set di dati pubblico Ford GoBike Share di San Francisco, inserisci il seguente codice. Questo codice utilizza la funzione comando magico %%bigquery per eseguire la query e restituire i risultati in un 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. Fai clic su  Esegui cella.

    L'output è simile al seguente:

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

  4. Per inserire una cella di codice, fai clic su Codice.

  5. Per convertire i dati in un DataFrame geopandas, inserisci il seguente codice:

    # 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. Fai clic su  Esegui cella.

    L'output dovrebbe essere simile al seguente:

    <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. Per inserire una cella di codice, fai clic su Codice.

  8. Per visualizzare l'anteprima delle prime cinque righe del DataFrame, inserisci il seguente codice:

    # Preview the first five rows
    gdf_sf_bikestations.head()
  9. Fai clic su  Esegui cella.

    L'output è simile al seguente:

    Le prime cinque righe del DataFrame.

  10. Per inserire una cella di codice, fai clic su Codice.

  11. Per estrarre i valori di longitudine e latitudine dalla colonna station_geom, inserisci il seguente codice:

    # 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. Fai clic su  Esegui cella.

    Dopo aver eseguito il codice, non viene generato alcun output nel tuo notebook Colab. Il segno di spunta accanto alla cella indica che il codice è stato eseguito correttamente.

  13. Per inserire una cella di codice, fai clic su Codice.

  14. Per visualizzare il grafico a dispersione delle stazioni di bike sharing in base ai valori di longitudine e latitudine estratti in precedenza, inserisci il seguente codice:

    # 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. Fai clic su  Esegui cella.

    L'output è simile al seguente:

    Il grafico a dispersione visualizzato delle stazioni di bike sharing.

Visualizzare i poligoni

L'analisi geospaziale ti consente di analizzare e visualizzare i dati geospaziali in BigQuery utilizzando i tipi di dati GEOGRAPHY e le funzioni geografiche di GoogleSQL.

Il tipo di dati GEOGRAPHY nell'analisi geospaziale è una raccolta di punti, linee e poligoni, rappresentata come un insieme di punti o un sottoinsieme della superficie della Terra. Un tipo GEOGRAPHY può contenere oggetti come:

  • Punti
  • Righe
  • Poligoni
  • Multipoligoni

Per un elenco di tutti gli oggetti supportati, consulta la documentazione del tipo GEOGRAPHY.

Se ti vengono forniti dati geospaziali senza conoscere le forme previste, puoi visualizzare i dati per scoprirle. Puoi visualizzare le forme con la conversione dei dati geografici in formato GeoJSON. Puoi quindi visualizzare i dati GeoJSON utilizzando un livello GeoJSON del framework deck.gl.

In questa sezione esegui una query sui dati geografici nel set di dati Quartieri di San Francisco e poi visualizzi i poligoni.

  1. Per inserire una cella di codice, fai clic su Codice.

  2. Per eseguire query sui dati geografici della tabella bigquery-public-data.san_francisco_neighborhoods.boundaries nel set di dati Quartieri di San Francisco, inserisci il seguente codice. Questo codice utilizza la funzione comando magico %%bigquery per eseguire la query e restituire i risultati in un 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. Fai clic su  Esegui cella.

    L'output è simile al seguente:

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

  4. Per inserire una cella di codice, fai clic su Codice.

  5. Per convertire i risultati in formato geopandas, inserisci il seguente codice:

    # Convert the query results to geopandas format.
    gdf_sanfrancisco_neighborhoods = pandas_to_geopandas(df_sanfrancisco_neighborhoods)
    gdf_sanfrancisco_neighborhoods.info()
  6. Fai clic su  Esegui cella.

    I risultati dovrebbero essere simili ai seguenti:

    <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. Per visualizzare l'anteprima della prima riga del DataFrame, inserisci il seguente codice:

    # Preview the first row
    gdf_sanfrancisco_neighborhoods.head(1)
  8. Fai clic su  Esegui cella.

    L'output è simile al seguente:

    La prima riga del DataFrame.

    Nei risultati, nota che i dati sono un poligono.

  9. Per inserire una cella di codice, fai clic su Codice.

  10. Per visualizzare i poligoni, inserisci il seguente codice. pydeck viene utilizzato per convertire ogni istanza di oggetto shapely nella colonna della geometria nel formato 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. Fai clic su  Esegui cella.

    L'output è simile al seguente:

    I poligoni visualizzati dal set di dati dei quartieri di San Francisco.

Creare una mappa coropletica

Se stai esaminando dati con poligoni difficili da convertire in formato GeoJSON, puoi utilizzare un livello poligono del framework deck.gl. Un livello poligono può elaborare dati di input di tipi specifici, ad esempio un array di punti.

In questa sezione utilizzerai un livello poligono per eseguire il rendering di un array di punti e utilizzerai i risultati per eseguire il rendering di una mappa di tipo choropleth. La mappa di tipo choropleth mostra la densità delle stazioni di bike sharing per quartiere unendo i dati del set di dati dei quartieri di San Francisco con il set di dati di Ford GoBike Share di San Francisco.

  1. Per inserire una cella di codice, fai clic su Codice.

  2. Per aggregare e conteggiare il numero di stazioni per quartiere e creare una colonna polygon contenente un array di punti, inserisci il seguente codice:

    # 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. Fai clic su  Esegui cella.

    Dopo aver eseguito il codice, non viene generato alcun output nel tuo notebook Colab. Il segno di spunta accanto alla cella indica che il codice è stato eseguito correttamente.

  4. Per inserire una cella di codice, fai clic su Codice.

  5. Per aggiungere una colonna fill_color per ciascuno dei poligoni, inserisci il seguente codice:

    # 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. Fai clic su  Esegui cella.

    Dopo aver eseguito il codice, non viene generato alcun output nel tuo notebook Colab. Il segno di spunta accanto alla cella indica che il codice è stato eseguito correttamente.

  7. Per inserire una cella di codice, fai clic su Codice.

  8. Per eseguire il rendering del livello poligono, inserisci il seguente codice:

    # 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. Fai clic su  Esegui cella.

    L'output è simile al seguente:

    Il livello poligonale visualizzato per i quartieri di San Francisco.

Creare una mappa termica

Le mappe choropleth sono utili quando sono noti confini significativi. Se hai dati senza confini significativi noti, puoi utilizzare un livello mappa termica per visualizzarne la densità continua.

Nell'esempio seguente esegui una query sui dati della tabella bigquery-public-data.san_francisco_sfpd_incidents.sfpd_incidents nel set di dati Report del Dipartimento di polizia di San Francisco (SFPD). I dati vengono utilizzati per visualizzare la distribuzione degli incidenti nel 2015.

Per le mappe di calore, ti consigliamo di quantizzare e aggregare i dati prima del rendering. In questo esempio, i dati vengono quantizzati e aggregati utilizzando l'indicizzazione spaziale H3 di Carto. La mappa termica viene creata utilizzando un livello mappa termica del framework deck.gl.

In questo esempio, la quantizzazione viene eseguita utilizzando la libreria Python h3 per aggregare i punti di incidente in esagoni. La funzione h3.latlng_to_cell viene utilizzata per mappare la posizione dell'incidente (latitudine e longitudine) a un indice di cella H3. Una risoluzione H3 di nove fornisce esagoni aggregati sufficienti per la mappa termica. La funzione h3.cell_to_latlng viene utilizzata per determinare il centro di ogni esagono.

  1. Per inserire una cella di codice, fai clic su Codice.

  2. Per eseguire una query sui dati nel set di dati Report del Dipartimento di Polizia di San Francisco (SFPD), inserisci il seguente codice. Questo codice utilizza la funzione magica %%bigquery per eseguire la query e restituire i risultati in un 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. Fai clic su  Esegui cella.

    L'output è simile al seguente:

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

  4. Per inserire una cella di codice, fai clic su Codice.

  5. Per convertire i risultati in un DataFrame geopandas, inserisci il seguente codice:

    # Convert the results into a geopandas.GeoDataFrame.
    gdf_incidents = pandas_to_geopandas(df_sanfrancisco_incidents_2015, geometry_column='location')
  6. Fai clic su  Esegui cella.

    Dopo aver eseguito il codice, non viene generato alcun output nel tuo notebook Colab. Il segno di spunta accanto alla cella indica che il codice è stato eseguito correttamente.

  7. Per inserire una cella di codice, fai clic su Codice.

  8. Per calcolare la cella per la latitudine e la longitudine di ogni incidente, aggrega gli incidenti per ogni cella, crea un geopandas DataFrame e aggiungi il centro di ogni esagono per il livello della mappa di calore, inserisci il seguente codice:

    # 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. Fai clic su  Esegui cella.

    L'output è simile al seguente:

    <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. Per inserire una cella di codice, fai clic su Codice.

  11. Per visualizzare l'anteprima delle prime cinque righe del DataFrame, inserisci il seguente codice:

    # Preview the first five rows.
    gdf_incidents_x_cell.head()
  12. Fai clic su  Esegui cella.

    L'output è simile al seguente:

    Le prime cinque righe del DataFrame.

  13. Per inserire una cella di codice, fai clic su Codice.

  14. Per convertire i dati in un formato JSON utilizzabile da HeatmapLayer, inserisci il seguente codice:

    # 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. Fai clic su  Esegui cella.

    Dopo aver eseguito il codice, non viene generato alcun output nel tuo notebook Colab. Il segno di spunta accanto alla cella indica che il codice è stato eseguito correttamente.

  16. Per inserire una cella di codice, fai clic su Codice.

  17. Per visualizzare la mappa di calore, inserisci il seguente codice:

    # 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. Fai clic su  Esegui cella.

    L'output è simile al seguente:

    La mappa termica visualizzata.

Esegui la pulizia

Per evitare che al tuo account Google Cloud vengano addebitati costi relativi alle risorse utilizzate in questo tutorial, elimina il progetto che contiene le risorse oppure mantieni il progetto ed elimina le singole risorse.

Elimina il progetto

Console

  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

Eliminare la chiave API di Google Maps e il notebook

Dopo aver eliminato il Google Cloud progetto, se hai utilizzato l'API Google Maps, elimina la chiave API Google Maps dai tuoi segreti di Colab e, facoltativamente, elimina il notebook.

  1. In Colab, fai clic su  Secrets.

  2. Alla fine della riga GMP_API_KEY, fai clic su  Elimina.

  3. (Facoltativo) Per eliminare il notebook, fai clic su File > Sposta nel casso.

Passaggi successivi