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 il rendimento e ridurre i costi e la latenza.

I set di dati possono contenere grandi insiemi di poligoni, forme multipoligonali e linee di linea per rappresentare elementi complessi, come strade, lotti di terreno zone di inondazione. 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 punti. Per le forme complesse, visitare un punto può aumentare il costo e la durata della le operazioni spaziali. Puoi usare le strategie e i metodi presentati in questa guida all'ottimizzazione di queste operazioni spaziali comuni per migliorare le prestazioni una riduzione dei 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 di posizionamento alla griglia per archiviare un'immagine del set di dati originale come vista materializzata.

Molte forme complesse con un numero elevato di punti possono essere semplificate senza molto e una 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 BigQuery viste materializzate per archiviare una una versione semplificata del set di dati originale come vista materializzata, aggiornati automaticamente rispetto alla tabella di base.

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

  • È necessario mantenere un elevato grado di somiglianza con la forma reale.
  • Devi eseguire operazioni ad alta precisione.
  • 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 base tabella 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 su 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 nella peggiore , che si trova 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 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 una scala corrispondente a una città o più grande, imposta una soglia di 10 metri. Su scala ridotta, ad esempio Ad esempio, quando misuri la distanza tra un edificio e il corpo più vicino di Acqua: valuta la possibilità di utilizzare una soglia più piccola, pari o inferiore a 1 metro. Utilizzo di più piccole di soglia 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 diversi parametri di soglia ST_SIMPLIFY in modo che vengano pubblicati meno dettagli 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 oppure 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 geografico centrale di una forma (il centroid) per rappresentano la posizione dell'intera forma. Usa un rettangolo contenente la forma per creare l'estensione della forma, che puoi utilizzare per rappresentare posizione geografica e le informazioni sulla sua dimensione relativa.

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

Ad esempio, considera la possibilità di caricare un database di lotti di terreno negli Stati Uniti in una tabella BigQuery e quindi di determinare lo specchio d'acqua più vicino. In questo caso, il precalcolo dei centroidi di un pacco utilizzando ST_CENTROID funzione in combinazione con il metodo descritto nel Nella sezione Semplifica le forme di questo documento puoi ridurre il numero di confronti eseguiti quando si utilizza il ST_DISTANCE oppure ST_DWITHIN funzioni. Quando utilizzi la funzione ST_CENTROID, il centroide del lotto deve essere preso in considerazione nel calcolo. Precomputing dei centroidi del lotto in questo modo può anche ridurre la variabilità delle prestazioni, perché le forme dei lotti diverse sono probabilmente conterranno un numero diverso di punti.

Una variante di questo metodo consiste nell'utilizzare la funzione ST_BOUNDINGBOX instead of the function 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 gli scafi

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

Se immaginiamo l'incarto di una forma e il calcolo del suo limite avvolgente, tale confine è chiamato scafo. In un involucro convesso, tutti gli angoli della forma risultante sono convessi. Come l'estensione di una forma, lo scafo 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 del posizione della forma. L'utilizzo di questa funzione migliora la precisione, ma comporta una diminuzione delle prestazioni. La funzione ST_CONVEXHULL è simile alla funzione ST_EXTENT, tranne per il fatto che la forma in uscita contiene più punti e il numero di punti varia in base alla complessità della forma in 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 i sistemi a griglia

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

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

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 pensando 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.

Utilizzo sistemi a rete standard come S2 e H3 possono velocizzare le aggregazioni statistiche e le analisi spaziali. Uso della griglia sistemi può inoltre semplificare lo sviluppo dell'analisi e migliorare lo sviluppo efficienza operativa.

Ad esempio, i confronti utilizzando le sezioni censite negli Stati Uniti presentano incoerenze nelle dimensioni, il che significa che i fattori correttivi devono applicati per eseguire confronti omogenei tra le sezioni censite. Inoltre, le sezioni di censimento e altri confini amministrativi cambiano nel tempo e richiedono per correggere questi cambiamenti. 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 disponibile in BigQuery abilitare casi d'uso di machine learning come la ricerca semantica, il rilevamento di somiglianze e il recupero accelerato. La chiave per abilitare questi casi d'uso è di indicizzazione con il nome ricerca al vicino più vicino. 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, stabilisci un per la tua ricerca. Puoi scoprire il raggio ottimale nell'insieme di risultati una ricerca al vicino più prossimo. Dopo aver stabilito il raggio, utilizza la funzione ST_DWITHIN per identificare gli elementi nelle vicinanze.

Ad esempio, valuta la possibilità di individuare i dieci edifici più vicini a un dell'ancoraggio di cui hai 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 corrispondente 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 Visualizzazione geografica BigQuery l'output è un gruppo di forme dell'edificio più vicine all'edificio di ancoraggio, visualizzato nell'immagine seguente:

Dati geospaziali visualizzati in BigQuery Geo Viz.

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 la query sta sfruttando l'indice vettoriale building_vector_index, che hai creati in precedenza.

Dividere forme grandi

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

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

Passaggi successivi