Best practice per l'analisi spaziale

Quando analizzi elementi geospaziali complessi in BigQuery, i set di dati possono contenere grandi raccolte di poligoni, forme multipoligono e stringhe di linee per rappresentare elementi complessi, ad esempio strade, lotti di terreno e zone alluvionali. Ogni forma può contenere migliaia di punti. Nella maggior parte delle operazioni spaziali in BigQuery (ad esempio, intersezioni e calcoli delle distanze), l'algoritmo sottostante di solito visita la maggior parte dei punti in ogni forma per produrre un risultato. Per alcune operazioni, l'algoritmo visita tutti i punti.

L'elaborazione di forme con migliaia di punti può aumentare drasticamente i costi e la durata delle query. Per ottimizzare le prestazioni delle query geospaziali e ridurre la latenza, puoi applicare best practice specifiche per l'analisi spaziale ai tuoi set di dati.

Questo documento presuppone che le tabelle geospaziali di BigQuery siano raggruppate in cluster in una colonna geografica.

Semplifica le forme

Best practice: utilizza le funzioni di semplificazione e di aggancio alla griglia per archiviare una versione semplificata del set di dati originale come vista materializzata.

Molte forme complesse con un numero elevato di punti possono essere semplificate senza una perdita significativa di precisione. Utilizza le funzioni BigQuery ST_SIMPLIFY e ST_SNAPTOGRID separatamente o insieme per ridurre il numero di punti nelle forme complesse. Combina queste funzioni con le viste materializzate di BigQuery per archiviare una versione semplificata del set di dati originale come vista materializzata che viene aggiornata automaticamente in base alla tabella di base.

La semplificazione delle forme è particolarmente utile per migliorare i costi e le prestazioni di un set di dati nei seguenti casi d'uso:

  • Devi mantenere un elevato grado di somiglianza con la forma reale.
  • Devi eseguire operazioni ad alta precisione e accuratezza.
  • Vuoi velocizzare le visualizzazioni senza una perdita visibile dei dettagli della forma.

Il seguente esempio di codice mostra come utilizzare la funzione ST_SIMPLIFY su una tabella di base con una colonna GEOGRAPHY denominata geom. Il codice semplifica le forme e rimuove i punti senza alterare i bordi di una forma di un valore superiore alla tolleranza specificata di 1,0 metri.

CREATE MATERIALIZED VIEW project.dataset.base_mv
  CLUSTER BY geom
AS (
  SELECT
    * EXCEPT (geom),
    ST_SIMPLIFY(geom, 1.0) AS geom
  FROM base_table
)

Il seguente esempio di codice mostra come utilizzare la funzione ST_SNAPTOGRID per agganciare i punti a una griglia con una risoluzione di 0,00001 gradi:

CREATE MATERIALIZED VIEW project.dataset.base_mv
  CLUSTER BY geom
AS (
  SELECT
    * EXCEPT (geom),
    ST_SNAPTOGRID(geom, -5) AS geom
  FROM base_table
)

L'argomento grid_size in questa funzione funge da esponente, il che significa che 10e-5 = 0,00001. Questa risoluzione equivale a circa 1 metro nel caso peggiore, che si verifica all'equatore.

Dopo aver creato queste viste, esegui una query sulla vista base_mv utilizzando la stessa semantica di query che utilizzeresti per eseguire una query sulla tabella di base. Puoi utilizzare questa tecnica per identificare rapidamente una raccolta di forme che devono essere analizzate in modo più approfondito, quindi puoi eseguire una seconda analisi più approfondita sulla tabella di base. Testa le query per vedere quali valori di soglia funzionano meglio per i tuoi dati.

Per i casi d'uso di misurazione, determina il livello di accuratezza richiesto dal tuo caso d'uso. Quando utilizzi la funzione ST_SIMPLIFY, imposta il parametro threshold_meters sul livello di accuratezza richiesto. Per misurare le distanze su scala di una città o più grande, imposta una soglia di 10 metri. Su scale più piccole, ad esempio quando misuri la distanza tra un edificio e il corpo idrico più vicino, valuta la possibilità di utilizzare una soglia più piccola, pari o inferiore a 1 metro. L'utilizzo di valori di soglia più piccoli comporta la rimozione di un numero inferiore di punti dalla forma specificata.

Quando pubblichi i livelli della mappa da un servizio web, puoi precalcolare le viste materializzate per diversi livelli di zoom con il progetto bigquery-geotools, che è un driver per Geoserver che ti consente di pubblicare i livelli spaziali da BigQuery. Questo driver crea più viste materializzate con parametri di soglia ST_SIMPLIFY diversi, in modo che vengano forniti meno dettagli a livelli di zoom più elevati.

Utilizza punti e rettangoli

Best practice: riduci la forma a un punto o a un rettangolo per rappresentare la sua posizione.

Puoi migliorare le prestazioni delle query riducendo la forma a un singolo punto o a un rettangolo. I metodi descritti in questa sezione non rappresentano con precisione i dettagli e le proporzioni della forma, ma ne ottimizzano la rappresentazione della posizione.

Puoi utilizzare il punto centrale geografico di una forma (il suo baricentro) per rappresentare la posizione dell'intera forma. Utilizza un rettangolo contenente la forma per creare l'estensione della forma, che puoi utilizzare per rappresentare la posizione della forma e mantenere le informazioni sulle sue dimensioni relative.

L'utilizzo di punti e rettangoli è molto utile per migliorare i costi e le prestazioni di un set di dati quando devi misurare la distanza tra due punti, ad esempio tra due città.

Ad esempio, immagina di caricare un database di lotti di terreno negli Stati Uniti in una tabella BigQuery e di determinare il corpo idrico più vicino. In questo caso, il precalcolo dei centroidi dei lotti utilizzando la funzione ST_CENTROID in combinazione con il metodo descritto nella sezione Semplifica le forme di questo documento può ridurre il numero di confronti eseguiti quando si utilizzano le funzioni ST_DISTANCE o ST_DWITHIN. Quando utilizzi la funzione ST_CENTROID, il baricentro del lotto deve essere considerato nel calcolo. Il precalcolo dei centroidi dei lotti in questo modo può anche ridurre la variabilità delle prestazioni, poiché è probabile che forme diverse dei lotti contengano un numero diverso di punti.

Una variante di questo metodo consiste nell'utilizzare la funzione ST_BOUNDINGBOX anziché la funzione ST_CENTROID per calcolare un inviluppo rettangolare attorno alla forma di input. Sebbene non sia efficiente come l'utilizzo di un singolo punto, può ridurre l'occorrenza di determinati casi limite. Questa variante offre comunque prestazioni buone e coerenti, poiché l'output della funzione ST_BOUNDINGBOX contiene sempre solo quattro punti da considerare. Il risultato del riquadro di delimitazione sarà di tipo STRUCT, il che significa che dovrai calcolare le distanze manualmente o utilizzare il metodo dell'indice vettoriale descritto più avanti in questo documento.

Usa gli scafi

Best practice: utilizza un hull per ottimizzare la rappresentazione della posizione di una forma.

Se immagini di avvolgere una forma con una pellicola termoretraibile e di calcolare il confine della pellicola, questo confine è chiamato hull (guscio). In un involucro convesso, tutti gli angoli della forma risultante sono convessi. Come l'estensione di una forma, un involucro convesso conserva alcune informazioni sulle dimensioni e sulle proporzioni relative della forma sottostante. Tuttavia, l'utilizzo di un hull comporta la necessità di archiviare e considerare più punti nelle analisi successive.

Puoi utilizzare la funzione ST_CONVEXHULL per ottimizzare la rappresentazione della posizione della forma. L'utilizzo di questa funzione migliora l'accuratezza, ma a scapito di una riduzione delle prestazioni. La funzione ST_CONVEXHULL è simile alla funzione ST_EXTENT, ad eccezione del fatto che la forma di output contiene più punti e varia nel numero di punti in base alla complessità della forma di input. Sebbene il vantaggio in termini di prestazioni sia probabilmente trascurabile per set di dati di piccole dimensioni con forme non complesse, per set di dati di grandi dimensioni con forme grandi e complesse, la funzione ST_CONVEXHULL offre un buon equilibrio tra costi, prestazioni e accuratezza.

Utilizza i sistemi di griglia

Best practice: utilizza sistemi di griglia geospaziale per confrontare le aree.

Se i tuoi casi d'uso prevedono l'aggregazione di dati all'interno di aree localizzate e il confronto delle aggregazioni statistiche di queste aree tra loro, puoi trarre vantaggio dall'utilizzo di un sistema di griglia standardizzato per confrontare aree diverse.

Ad esempio, un rivenditore potrebbe voler analizzare i cambiamenti demografici nel tempo nelle aree in cui si trovano i suoi negozi o in cui sta valutando di aprire un nuovo negozio. In alternativa, una compagnia assicurativa potrebbe voler comprendere meglio i rischi legati alle proprietà analizzando i rischi di calamità naturali prevalenti in una determinata area.

L'utilizzo di sistemi di griglia standard come S2 e H3 può velocizzare queste aggregazioni statistiche e analisi spaziali. L'utilizzo di questi sistemi a griglia può anche semplificare lo sviluppo di analisi e migliorare l'efficienza dello sviluppo.

Ad esempio, i confronti che utilizzano le sezioni di censimento negli Stati Uniti soffrono di incoerenza nelle dimensioni, il che significa che è necessario applicare fattori correttivi per eseguire confronti simili tra le sezioni di censimento. Inoltre, le sezioni di censimento e altri confini amministrativi cambiano nel tempo e richiedono un impegno per correggere queste modifiche. L'utilizzo di sistemi a griglia per l'analisi spaziale può risolvere questi problemi.

Utilizza Vector Search e gli indici vettoriali

Best practice: utilizza Vector Search e gli indici vettoriali per le query geospaziali del vicino più prossimo.

Le funzionalità di Vector Search sono state introdotte in BigQuery per abilitare casi d'uso di machine learning come la ricerca semantica, il rilevamento di somiglianze e la RAG (Retrieval-Augmented Generation). La chiave per abilitare questi casi d'uso è un metodo di indicizzazione chiamato ricerca approssimativa del vicino più prossimo. Puoi utilizzare la ricerca vettoriale per velocizzare e semplificare le query geospaziali del vicino più prossimo confrontando i vettori che rappresentano i punti nello spazio.

Puoi utilizzare Vector Search per cercare le caratteristiche in base al raggio. Innanzitutto, stabilisci un raggio per la ricerca. Puoi scoprire il raggio ottimale nel set di risultati di una ricerca dei vicini più prossimi. Dopo aver stabilito il raggio, utilizza la funzione ST_DWITHIN per identificare gli elementi nelle vicinanze.

Ad esempio, supponiamo di voler trovare i dieci edifici più vicini a un particolare edificio di riferimento di cui conosci già la posizione. Puoi archiviare i centroidi di ogni edificio come vettore in una nuova tabella, indicizzare la tabella ed eseguire ricerche utilizzando la ricerca vettoriale.

Per questo esempio, puoi anche utilizzare i dati di Overture Maps in BigQuery per creare una tabella separata di forme di edifici corrispondenti a un'area di interesse e un vettore denominato geom_vector. L'area di interesse in questo esempio è la città di Norfolk, VA, Stati Uniti, rappresentata dal codice FIPS 51710, come mostrato nell'esempio di codice seguente:

CREATE TABLE vector_search.norfolk_buildings
AS (
  SELECT
    *,
    [
      ST_X(ST_CENTROID(building.geometry)),
      ST_Y(ST_CENTROID(building.geometry))] AS geom_vector
  FROM `bigquery-public-data.overture_maps.building` AS building
  INNER JOIN `bigquery-public-data.geo_us_boundaries.counties` AS county
    ON (st_intersects(county.county_geom, building.geometry))
  WHERE county.county_fips_code = '51710'
)

Il seguente esempio di codice mostra come creare un indice vettoriale nella tabella:

CREATE
  vector index building_vector_index
ON
  vector_search.norfolk_buildings(geom_vector)
  OPTIONS (index_type = 'IVF')

Questa query identifica i 10 edifici più vicini a un particolare edificio di riferimento:

SELECT base.*
FROM
  VECTOR_SEARCH(
    TABLE vector_search.norfolk_buildings,
    'geom_vector',
    (
      SELECT
        geom_vector
      FROM
        vector_search.norfolk_buildings
      WHERE id = '56873794-9873-4fe1-871a-5987bb3a0efb'
    ),
    top_k => 10,
    distance_type => 'EUCLIDEAN',
    options => '{"fraction_lists_to_search":0.1}')

Nel riquadro Risultati delle query, fai clic sulla scheda Visualizzazione. La mappa mostra un gruppo di forme di edifici più vicine all'edificio di riferimento:

Dati geospaziali visualizzati in BigQuery.

Quando esegui questa query nella console Cloud de Confiance , fai clic su Informazioni job e verifica che Modalità di utilizzo dell'indice vettoriale sia impostata su FULLY_USED. Ciò indica che la query utilizza l'indice vettoriale building_vector_index, che hai creato in precedenza.

Dividi forme grandi

Best practice: dividi le forme di grandi dimensioni con la funzione ST_SUBDIVIDE.

Utilizza la funzione ST_SUBDIVIDE per suddividere forme grandi o stringhe di linee lunghe in forme più piccole.

Passaggi successivi