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:
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
- Scopri come utilizzare i sistemi a 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 la visualizzazione dei dati geospaziali in BigQuery, consulta Iniziare a utilizzare l'analisi geospaziale.