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 i costi e la latenza.
I set di dati possono contenere grandi raccolte di poligoni, forme multipoligonali e 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 di distanza), l'algoritmo sottostante di solito visita 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, la visita di 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 al fine di migliorare il rendimento e ridurre i costi.
Questo documento presuppone che le tabelle geospaziali di BigQuery siano raggruppate in base a una colonna geografica.
Semplificare le forme
Best practice: utilizza le funzioni di semplificazione e adeguamento alla griglia per archiviare una versione semplificata del tuo 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 in 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 il costo 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.
- Vuoi velocizzare le visualizzazioni senza perdere i dettagli delle forme.
Il seguente esempio di codice mostra come utilizzare la funzione ST_SIMPLIFY
in una tabella di base con una colonna GEOGRAPHY
denominata geom
. Il codice semplifica le forme e rimuove i punti senza modificare i bordi di una forma per più della tolleranza indicata 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 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
10e-5 = 0,00001. Questa risoluzione equivale a circa 1 metro nel peggiore
delle ipotesi, ovvero 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 più a fondo, quindi puoi eseguire una seconda analisi più approfondita sulla tabella di base. Testa le query per scoprire 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 una scala corrispondente a una città o più grande, imposta una soglia di 10 metri. A scale più piccole, ad esempio quando misuri la distanza tra un edificio e il corpo d'acqua più vicino, ti consigliamo di utilizzare una soglia più bassa di 1 metro o meno. L'utilizzo di valori di soglia inferiori comporta la rimozione di meno punti dalla forma specificata.
Quando pubblichi i livelli della mappa da un servizio web, puoi precalcolare le visualizzazioni materializzate per diversi livelli di zoom con il progetto bigquery-geotools, un driver per Geoserver che ti consente di pubblicare livelli spaziali da BigQuery. Questo driver crea più viste materializzate con parametri di soglia ST_SIMPLIFY
diversi in modo da visualizzare meno dettagli a livelli di zoom più elevati.
Usare punti e rettangoli
Best practice:riduci la forma a un punto o 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 in questa sezione non rappresentano con precisione i dettagli e le proporzioni della forma, ma sono ottimizzati per rappresentare la posizione della forma.
Puoi utilizzare il punto centrale geografico di una forma (il suo centro di massa) 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 conservare le 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, puoi caricare un database di lotti di terreno negli Stati Uniti in una tabella BigQuery e determinare il corpo d'acqua più vicino.
In questo caso, la precomputazione 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 centroide del lotto deve essere preso in considerazione nel calcolo. Precompilare i centroidi dei lotti in questo modo può anche ridurre la variabilità del rendimento, perché le forme dei lotti diverse hanno maggiori probabilità di contenere numeri diversi di punti.
Una variante di questo metodo consiste nell'utilizzare la funzione
ST_BOUNDINGBOX
invece della funzione ST_CENTROID
per calcolare un'involucro rettangolare
intorno alla forma di input. Sebbene non sia molto efficiente come l'utilizzo di un singolo punto,
puoi ridurre la frequenza 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 della delimitazione sarà di tipo STRUCT
, il che significa che dovrai calcolare le distanze manualmente o utilizzare il metodo dell'indice di vettore descritto più avanti in questo documento.
Utilizzare le carene
Best practice:utilizza una carena 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 è 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 una carena comporta la necessità di memorizzare e prendere in considerazione 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 comporta una riduzione delle prestazioni. 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 i set di dati di piccole dimensioni con forme non complesse, per i set di dati di grandi dimensioni con forme grandi e complesse, la funzione ST_CONVEXHULL
offre un buon equilibrio tra costo, prestazioni e accuratezza.
Utilizzare sistemi di griglia
Best practice:utilizza 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 tra le aggregazioni statistiche di queste aree, puoi utilizzare un sistema di griglie 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 la possibilità di aprire un nuovo negozio. In alternativa, una compagnia di assicurazioni potrebbe voler migliorare la propria comprensione dei rischi relativi 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 di reti può anche semplificare lo sviluppo di analisi e migliorare l'efficienza dello sviluppo.
Ad esempio, i confronti che utilizzano i circondari censuari negli Stati Uniti presentano incoerenze nelle dimensioni, il che significa che è necessario applicare fattori correttivi per eseguire confronti tra circondari censuari simili. Inoltre, i lotti censuari e altri confini amministrativi cambiano nel tempo e richiedono un impegno per correggere queste variazioni. L'utilizzo di sistemi di griglia per l'analisi spaziale può risolvere questi problemi.
Utilizzare la ricerca di vettori e gli indici di vettori
Best practice: utilizza la ricerca vettoriale e gli indici vettoriali per le query geospaziali con il metodo del vicino più vicino.
Le funzionalità di ricerca vettoriale sono state introdotte in BigQuery per abilitare casi d'uso di machine learning come la ricerca semantica, il rilevamento di somiglianze e la generazione basata sul recupero. La chiave per abilitare questi casi d'uso è un metodo di indicizzazione chiamato ricerca del vicino più prossimo approssimativa. 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 la ricerca vettoriale per cercare elementi in base al raggio. Innanzitutto, imposta un raggio per la ricerca. Puoi scoprire il raggio ottimale nel set di risultati di una ricerca del vicino più vicino. Dopo aver stabilito il raggio, utilizza la funzione
ST_DWITHIN
per identificare gli elementi nelle vicinanze.
Ad esempio, potresti trovare i dieci edifici più vicini a un determinato edificio principale 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 di vettori.
Per questo esempio, puoi anche utilizzare i dati di Overture Maps in BigQuery per creare una tabella separata delle forme degli edifici corrispondenti a un'area di interesse e un vettore denominato geom_vector
. L'area di interesse in questo esempio
è la città di Norfolk, in Virginia, Stati Uniti, rappresentata dal
codice FIPS
51710, come mostrato nel seguente esempio di codice:
CREATE TABLE geo-solution-demos.vector_search.norfolk_buildings
AS (
SELECT
*,
[
ST_X(ST_CENTROID(building.geometry)),
ST_Y(ST_CENTROID(building.geometry))] AS geom_vector
FROM geo-solution-demos.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
`geo-solution-demos.vector_search.norfolk_buildings`(geom_vector)
OPTIONS (index_type = 'IVF')
Questa query identifica i 10 edifici più vicini a un determinato edificio di riferimento, rappresentato come anchor_building_id
:
declare anchor_building_id STRING;
SET anchor_building_id = '08b2af6202ce5fff02007d1778948bc4';
SELECT base.*
FROM
VECTOR_SEARCH(
TABLE `geo-solution-demos.vector_search.norfolk_buildings`,
'geom_vector',
(
SELECT
geom_vector
FROM
`geo-solution-demos.vector_search.norfolk_buildings`
WHERE id = anchor_building_id
),
top_k => 10,
distance_type => 'EUCLIDEAN',
options => '{"fraction_lists_to_search":0.1}')
Quando visualizzi i dati geospaziali in BigQuery Geo Viz, l'output è un cluster di forme di edifici più vicine all'edificio di riferimento, come visualizzato nell'immagine seguente:
Quando esegui questa query nella console Google Cloud, fai clic su Informazioni sul job e verifica che Modalità di utilizzo dell'indice di vettori sia impostata su FULLY_USED
. Ciò indica che la query utilizza l'indice di vettori building_vector_index
creato in precedenza.
Dividere forme di grandi dimensioni
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
- Scopri come utilizzare i sistemi di griglia per l'analisi spaziale.
- Scopri di più sulle funzioni geografiche di BigQuery.
- Scopri come gestire gli indici vettoriali.
- Scopri di più sulle best practice per l'indicizzazione e il clustering spaziali in BigQuery.
- Per ulteriori informazioni sull'analisi e sulla visualizzazione dei dati geospaziali in BigQuery, consulta Guida introduttiva all'analisi geospaziale.