Best practice per l'analisi spaziale

Questo documento descrive le best practice per ottimizzare le prestazioni delle query geospaziali in BigQuery. Puoi utilizzare queste best practice per migliorare le prestazioni e ridurre costi e latenza.

I set di dati possono contenere grandi raccolte di poligoni, forme multipoligono e linestring 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 della distanza), l'algoritmo sottostante visita in genere la maggior parte dei punti di ogni forma per produrre un risultato. Per alcune operazioni, l'algoritmo visita tutti i punti. Per le forme complesse, visitare ogni punto può aumentare il costo e la durata delle operazioni spaziali. Puoi utilizzare le strategie e i metodi presentati in questa guida per ottimizzare queste operazioni spaziali comuni per migliorare le prestazioni e ridurre i costi.

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

Semplificare le forme

Best practice: utilizza le funzioni di semplificazione e allineamento 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 grande perdita 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 è più utile per migliorare il costo e il rendimento di un set di dati nei seguenti casi d'uso:

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

Il seguente esempio di codice mostra come utilizzare la funzione ST_SIMPLIFY su una tabella di base che ha una colonna GEOGRAPHY denominata geom. Il codice semplifica le forme e rimuove i punti senza alterare alcun bordo di una forma di più della tolleranza specificata di 1 metro.

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 allineare 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 di 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 query sulla vista base_mv utilizzando la stessa semantica di query che useresti per eseguire query sulla tabella di base. Puoi utilizzare questa tecnica per identificare rapidamente una raccolta di forme che devono essere analizzate più in dettaglio e poi puoi eseguire una seconda analisi più approfondita sulla tabella di base. Testa le tue 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 precisione richiesto. Per misurare distanze alla scala di una città o più grandi, imposta una soglia di 10 metri. A scale più piccole, ad esempio quando misuri la distanza tra un edificio e lo specchio d'acqua più vicino, valuta la possibilità di utilizzare una soglia più piccola di 1 metro o meno. 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 diversi parametri di soglia ST_SIMPLIFY in modo che vengano visualizzati meno dettagli a livelli di zoom più elevati.

Utilizzare punti e rettangoli

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

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

Puoi utilizzare il punto centrale geografico di una forma (il suo centroide) 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 informazioni sulle sue dimensioni relative.

L'utilizzo di punti e rettangoli è più utile per migliorare il costo e il rendimento di un set di dati quando devi misurare la distanza tra due punti, ad esempio tra due città.

Ad esempio, considera di caricare un database di appezzamenti di terreno negli Stati Uniti in una tabella BigQuery e poi di determinare lo specchio d'acqua più vicino. In questo caso, il precalcolo dei centroidi dei pacchi utilizzando la funzione ST_CENTROID in combinazione con il metodo descritto nella sezione Semplificare 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 centroide del pacco deve essere preso in considerazione nel calcolo. Il precalcolo dei centroidi dei pacchi in questo modo può anche ridurre la variabilità del rendimento, perché è probabile che forme diverse di pacchi 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 rettangolo di inviluppo intorno alla forma di input. Sebbene non sia efficiente come l'utilizzo di un singolo punto, può ridurre il verificarsi di determinati casi limite. Questa variante offre comunque un rendimento buono e coerente, poiché l'output della funzione ST_BOUNDINGBOX contiene sempre solo quattro punti da considerare. Il risultato delriquadro di delimitazionee 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.

Utilizzare gli scafi

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

Se immagini di avvolgere una forma con una pellicola e di calcolare il confine della pellicola, questo confine viene chiamato involucro. 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 involucro comporta la necessità di memorizzare 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 la precisione, ma a scapito di prestazioni ridotte. La funzione ST_CONVEXHULL è simile alla funzione ST_EXTENT, tranne per il fatto che la forma di output contiene più punti e il numero di punti varia in base alla complessità della forma di input. Sebbene il vantaggio in termini di prestazioni sia probabilmente trascurabile per piccoli set di dati di forme non complesse, per set di dati molto grandi con forme grandi e complesse, la funzione ST_CONVEXHULL offre un buon equilibrio tra costo, prestazioni e precisione.

Utilizzare i sistemi a griglia

Best practice: utilizza i sistemi di griglie geospaziali per confrontare le aree.

Se i tuoi casi d'uso prevedono l'aggregazione dei 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 a griglia standardizzato per confrontare aree diverse.

Ad esempio, un rivenditore potrebbe voler analizzare le variazioni demografiche nel tempo nelle aree in cui si trovano i suoi negozi o in cui sta valutando di costruirne uno nuovo. In alternativa, una compagnia assicurativa potrebbe voler migliorare la propria comprensione dei rischi per la proprietà analizzando i rischi naturali prevalenti in una determinata area.

L'utilizzo di sistemi di griglie standard come S2 e H3 può accelerare 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 omogenei tra le sezioni di censimento. Inoltre, i tratti censuari e altri confini amministrativi cambiano nel tempo e richiedono uno sforzo per correggere questi cambiamenti. L'utilizzo di sistemi a griglia per l'analisi spaziale può risolvere questi problemi.

Utilizzare la ricerca vettoriale e gli indici vettoriali

Best practice: utilizza la ricerca vettoriale e gli indici vettoriali per le query geospaziali di ricerca dei vicini più prossimi.

Le funzionalità di ricerca vettoriale sono state introdotte in BigQuery per consentire casi d'uso di machine learning come la ricerca semantica, il rilevamento di somiglianze e la generazione aumentata dal recupero. 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 spaziali sui vicini più prossimi confrontando i vettori che rappresentano i punti nello spazio.

Puoi utilizzare la ricerca vettoriale per cercare funzionalità per 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 le funzionalità nelle vicinanze.

Ad esempio, considera di trovare i dieci edifici più vicini a un particolare edificio di riferimento di cui conosci già la posizione. Puoi memorizzare i centroidi di ogni edificio come vettore in una nuova tabella, indicizzare la tabella e 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 chiamato geom_vector. L'area di interesse in questo esempio è la città di Norfolk, Virginia, Stati Uniti, rappresentata dal codice FIPS 51710, come mostrato nel seguente esempio di codice:

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 determinato 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 cluster di forme di edifici più vicini all'edificio di ancoraggio:

Dati geospaziali visualizzati in BigQuery.

Quando esegui questa query nella console Google Cloud , fai clic su Informazioni sul 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.

Dividere forme grandi

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

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

Passaggi successivi