Utilizzo dei dati geospaziali
L'analisi geospaziale ti consente di analizzare i dati geografici in BigQuery. I dati geografici sono noti anche come dati geospaziali.
I tipi di oggetti comuni quando si utilizzano i dati geospaziali includono i seguenti:
- Una geometria rappresenta una superficie sulla Terra. Viene spesso descritta utilizzando punti, linee, poligoni o una raccolta di punti, linee e poligoni. Una raccolta di geometrie è una geometria che rappresenta l'unione spaziale di tutte le forme nella raccolta.
- Un elemento spaziale rappresenta un oggetto spaziale logico. Combina una geometria con attributi aggiuntivi specifici dell'applicazione.
- Una raccolta di elementi spaziali è un insieme di elementi spaziali.
In BigQuery, the
GEOGRAPHY
tipo di dati rappresenta un valore di geometria o una raccolta di geometrie. Per rappresentare gli elementi spaziali, crea una tabella con una colonna GEOGRAPHY per la geometria più colonne aggiuntive per gli attributi. Ogni riga della tabella è un elemento spaziale e l'intera tabella rappresenta una raccolta di elementi spaziali.
Il tipo di dati GEOGRAPHY descrive un insieme di punti sulla superficie terrestre. Un
insieme di punti è un insieme di punti, linee e poligoni sullo
WGS84
WGS84, con bordi geodetici. Puoi utilizzare il tipo di dati GEOGRAPHY
chiamando una delle funzioni geografiche GoogleSQL
.
Caricamento dei dati geospaziali
I singoli punti sulla Terra possono essere descritti solo da una coppia di longitudine e latitudine.
Ad esempio, puoi caricare un file CSV contenente valori di longitudine e latitudine
e poi utilizzare la
ST_GEOGPOINT
funzione per convertirli in valori GEOGRAPHY.
Per le aree geografiche più complesse, puoi caricare i seguenti formati di dati geospaziali in una colonna GEOGRAPHY:
- Testo Well-Known (WKT)
- Binario Well-Known (WKB)
- GeoJSON
- GeoParquet
Caricamento dei dati WKT o WKB
WKT è un formato di testo per descrivere le singole forme geometriche utilizzando punti, linee, poligoni con fori facoltativi o una raccolta di punti, linee o poligoni. WKB è la versione binaria del formato WKT. WKB può essere codificato in esadecimale per i formati che non supportano i dati binari, come JSON.
Ad esempio, il seguente comando definisce un punto in WKT:
POINT(-121 41)
Per descrivere un elemento spaziale, WKT viene in genere incorporato in un formato di file contenitore, ad esempio un file CSV, o in una tabella di database. Una riga di file o una riga di tabella corrisponde in genere all'elemento spaziale. L'intero file o l'intera tabella corrisponde alla raccolta di elementi. Per caricare i dati WKT in
BigQuery, fornisci uno schema che
specifichi una GEOGRAPHY colonna per i dati geospaziali.
Ad esempio, potresti avere un file CSV contenente i seguenti dati:
"POLYGON((-124.49 47.35,-124.49 40.73,-116.49 40.73,-116.49 47.35,-124.49 47.35))",poly1
"POLYGON((-85.6 31.66,-85.6 24.29,-78.22 24.29,-78.22 31.66,-85.6 31.66))",poly2
"POINT(1 2)",point1
Puoi caricare questo file eseguendo il comando load dello strumento a riga di comando bq:
bq load --source_format=CSV \
--schema="geography:GEOGRAPHY,name:STRING" \
mydataset.mytable filename1.csv
Per ulteriori informazioni sul caricamento dei dati in BigQuery, consulta Introduzione al caricamento dei dati.
Per eseguire lo streaming dei dati WKT in una tabella BigQuery esistente con una colonna GEOGRAPHY, serializza i dati come stringa nella richiesta API.
bq
Esegui il comando insert dello strumento a riga di comando bq:
echo '{"geo": "LINESTRING (-118.4085 33.9416, -73.7781 40.6413)"}' \
| bq insert my_dataset.geo_table
Python
Prima di provare questo esempio, segui le istruzioni di configurazione di Python nella guida rapida di BigQuery per l'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Python BigQuery.
Per eseguire l'autenticazione in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, vedi Configura l'autenticazione per le librerie client.
Per ulteriori informazioni sullo streaming dei dati in BigQuery, consulta Streaming dei dati in BigQuery.
Puoi anche convertire una stringa di testo WKT in un valore GEOGRAPHY utilizzando la
ST_GEOGFROMTEXT
funzione.
Caricamento dei dati GeoJSON
GeoJSON è un formato basato su JSON per geometrie ed elementi spaziali. Ad esempio, il seguente comando definisce un punto in GeoJSON:
{ "type": "Point", "coordinates": [-121,41] }
I dati GeoJSON possono contenere uno dei seguenti tipi di oggetti:
- Oggetti geometria. Un oggetto geometria è una forma spaziale, descritta come unione di punti, linee e poligoni con fori facoltativi.
- Oggetti elemento. Un oggetto elemento contiene una geometria più coppie nome/valore aggiuntive, il cui significato è specifico dell'applicazione.
- Raccolte di elementi. Una raccolta di elementi è un insieme di oggetti elemento.
Esistono due modi per caricare i dati GeoJSON in BigQuery:
- Carica i file GeoJSON delimitati da nuova riga.
- Carica i singoli oggetti geometria GeoJSON incorporati in altri tipi di file.
Caricamento dei file GeoJSON delimitati da nuova riga
Un file GeoJSON delimitato da nuova riga contiene un elenco di oggetti elemento GeoJSON, uno per riga nel file. Un oggetto elemento GeoJSON è un oggetto JSON con i seguenti membri:
type. Per gli oggetti elemento, il valore deve essereFeature. BigQuery convalida il valore, ma non lo include nello schema della tabella.geometry. Il valore è un oggettoGeometryGeoJSON onull. BigQuery converte questo membro in un valoreGEOGRAPHY.properties. Il valore è un oggetto JSON o null. Se il valore non ènull, BigQuery carica ogni membro dell'oggetto JSON come colonna della tabella separata. Per ulteriori informazioni su come BigQuery analizza i tipi di dati JSON, consulta Dettagli sul caricamento dei dati JSON.id. Facoltativo. Se presente, il valore è una stringa o un numero. BigQuery carica questo valore in una colonna denominataid.
Se l'oggetto elemento contiene altri membri non elencati qui, BigQuery li converte direttamente in colonne della tabella.
Puoi caricare un file GeoJSON delimitato da nuova riga utilizzando il comando bq
load dello strumento a riga di comando bq, come segue:
bq load \ --source_format=NEWLINE_DELIMITED_JSON \ --json_extension=GEOJSON \ --autodetect \ DATASET.TABLE \ FILE_PATH_OR_URI
Sostituisci quanto segue:
DATASETè il nome del set di dati.TABLEè il nome della tabella di destinazione.FILE_PATH_OR_URIè un percorso a un file locale o un URI Cloud Storage.
L'esempio precedente abilita
il rilevamento automatico dello schema. Per un maggiore controllo sulla modalità di conversione dei valori all'interno dell'oggetto properties da parte di BigQuery, puoi fornire uno schema esplicito. Per ulteriori informazioni, consulta
Specificare gli schemi.
Se fornisci uno schema esplicito, non includere una colonna type di primo livello nella definizione dello schema. Per ogni membro del membro properties, definisci colonne separate, non una singola colonna nidificata.
Come definito nella RFC 7946,
una struttura di dati GeoJSON completa è un singolo oggetto JSON. Molti sistemi esportano i dati GeoJSON come un singolo oggetto FeatureCollection contenente tutte le geometrie. Per caricare questo formato in BigQuery, devi convertire il file rimuovendo l'oggetto FeatureCollection a livello di root e dividendo i singoli oggetti elemento in righe separate. Ad esempio, il seguente comando utilizza lo strumento a riga di comando jq per dividere un file GeoJSON in formato delimitato da nuova riga:
cat ~/file1.json | jq -c '.features[]' > converted.json
Creazione di una tabella esterna da un file GeoJSON delimitato da nuova riga
Puoi eseguire query su un file GeoJSON delimitato da nuova riga archiviato in Cloud Storage mediante
la creazione di una tabella esterna. Per creare la
tabella esterna, utilizza l'
CREATE EXTERNAL TABLE
istruzione DDL. Nella clausola OPTIONS, imposta l'opzione format su NEWLINE_DELIMITED_JSON e l'opzione json_extension su GEOJSON.
Esempio:
CREATE EXTERNAL TABLE mydataset.table1 OPTIONS (
format="NEWLINE_DELIMITED_JSON",
json_extension = 'GEOJSON',
uris = ['gs://mybucket/geofile.json']
);
Caricamento dei dati di geometria GeoJSON
L'analisi geospaziale supporta il caricamento di singoli oggetti geometria GeoJSON incorporati come stringhe di testo in altri tipi di file. Ad esempio, puoi caricare un file CSV in cui una delle colonne contiene un oggetto geometria GeoJSON.
Per caricare questo tipo di dati GeoJSON in BigQuery, fornisci uno
schema che specifichi una GEOGRAPHY colonna per i
dati GeoJSON. Devi fornire manualmente lo schema. In caso contrario, se il rilevamento automatico è abilitato, BigQuery carica i dati come valore STRING.
L'analisi geospaziale non supporta il caricamento di oggetti elemento GeoJSON o raccolte di elementi utilizzando questo approccio. Se devi caricare oggetti elemento, valuta la possibilità di utilizzare file GeoJSON delimitati da nuova riga.
Per eseguire lo streaming dei dati GeoJSON in una tabella BigQuery esistente con una colonna GEOGRAPHY, serializza i dati come stringa nella richiesta API.
bq
Esegui il comando insert dello strumento a riga di comando bq:
echo '{"geo": "{\"type\": \"LineString\", \"coordinates\": [[-118.4085, 33.9416], [-73.7781, 40.6413]]}"}' \
| bq insert my_dataset.geo_table
Python
Prima di provare questo esempio, segui le istruzioni di configurazione di Python nella guida rapida di BigQuery per l'utilizzo delle librerie client. Per ulteriori informazioni, consulta la documentazione di riferimento dell'API Python BigQuery.
Per eseguire l'autenticazione in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, vedi Configura l'autenticazione per le librerie client.
Puoi anche convertire un oggetto geometria GeoJSON in un valore GEOGRAPHY utilizzando
la ST_GEOGFROMGEOJSON
funzione. Ad esempio, puoi archiviare le geometrie come valori STRING e poi eseguire una query che chiama ST_GEOGFROMGEOJSON.
Caricamento dei file GeoParquet
GeoParquet è una specifica che aggiunge tipi geospaziali al formato di file Parquet. GeoParquet include metadati che forniscono una semantica definita ai dati geospaziali contenuti, evitando i problemi di interpretazione che si verificano con altri formati di dati geospaziali .
Quando carichi i file Parquet, BigQuery verifica la presenza di metadati GeoParquet. Se esistono metadati GeoParquet, BigQuery carica per impostazione predefinita tutte le colonne che descrive in una colonna GEOGRAPHY corrispondente.
Per ulteriori informazioni sul caricamento dei file Parquet, consulta
Caricare i dati Parquet.
Creazione di una tabella esterna dai dati GeoParquet
Le tabelle esterne
che fanno riferimento ai file GeoParquet mappano le colonne pertinenti al tipo GEOGRAPHY.
Le statistiche disponibili nel file GeoParquet (bbox, covering) non vengono utilizzate per accelerare le query su una tabella esterna.
Sistemi di coordinate e bordi
Nell'analisi geospaziale, i punti sono posizioni sulla superficie di uno sferoide WGS84, espresse come longitudine e latitudine geodetica. Un bordo è una geodetica sferica tra due endpoint. Ovvero, i bordi sono il percorso più breve sulla superficie di una sfera.
Il formato WKT non fornisce un sistema di coordinate. Quando carichi i dati WKT, l'analisi geospaziale presuppone che i dati utilizzino le coordinate WGS84 con bordi sferici. Assicurati che i dati di origine corrispondano a questo sistema di coordinate, a meno che le aree geografiche non siano abbastanza piccole da poter ignorare la differenza tra i bordi sferici e planari.
GeoJSON utilizza esplicitamente le coordinate WGS84 con bordi planari. Quando carichi i dati GeoJSON, l'analisi geospaziale converte i bordi planari in bordi sferici. L'analisi geospaziale aggiunge punti aggiuntivi alla linea, se necessario, in modo che la sequenza di bordi convertita rimanga entro 10 metri dalla linea originale. Questo processo è noto come tassellazione o densificazione non uniforme. Non puoi controllare direttamente il processo di tassellazione.
Per caricare le aree geografiche con bordi sferici, utilizza WKT. Per caricare le aree geografiche con
bordi planari, spesso chiamate geometrie, è più semplice utilizzare GeoJSON. Tuttavia,
se i dati di geometria sono già in formato WKT, un'altra opzione è caricare i
dati come tipo STRING e poi utilizzare la
ST_GEOGFROMTEXT
funzione per convertirli in valori GEOGRAPHY. Imposta il parametro planar su TRUE per interpretare i dati come planari.
I file GeoParquet includono metadati sul sistema di coordinate e sui bordi utilizzati per creare i dati. Quando leggi i file GeoParquet con bordi planari, l'analisi geospaziale converte i bordi planari in bordi sferici. I file GeoParquet con sistemi di coordinate diversi da WGS84 vengono rifiutati.
Quando scegli un formato di scambio, assicurati di comprendere il sistema di coordinate utilizzato dai dati di origine. La maggior parte dei sistemi supporta esplicitamente l'analisi della geografia (a differenza della geometria) da WKT oppure presuppone bordi planari.
Le coordinate devono essere prima la longitudine e poi la latitudine. Se l'area geografica ha segmenti o bordi lunghi, devono essere tassellati, perché l'analisi geospaziale li interpreta come geodetiche sferiche, che potrebbero non corrispondere al sistema di coordinate di origine dei dati.
Orientamento del poligono
Su una sfera, ogni poligono ha un poligono complementare. Ad esempio, un poligono che descrive i continenti della Terra avrebbe un poligono complementare che descrive gli oceani della Terra. Poiché i due poligoni sono descritti dagli stessi anelli di confine, sono necessarie regole per risolvere l'ambiguità relativa a quale dei due poligoni è descritto da una determinata stringa WKT.
Quando carichi stringhe WKT e WKB da file o utilizzando importazione di flussi di dati, l'analisi geospaziale presuppone che i poligoni nell'input siano orientati come segue: se percorri il confine del poligono nell'ordine dei vertici di input, l'interno del poligono si trova a sinistra. L'analisi geospaziale utilizza la stessa regola quando esporta oggetti geografici in stringhe WKT e WKB.
Se utilizzi la ST_GEOGFROMTEXT
funzione per convertire una stringa WKT in un valore GEOGRAPHY, il parametro oriented
specifica in che modo la funzione determina il poligono:
FALSE: interpreta l'input come il poligono con l'area più piccola. Questo è il comportamento predefinito.TRUE: utilizza la regola di orientamento a sinistra descritta in precedenza. Questa opzione ti consente di caricare poligoni con un'area maggiore di un emisfero.
Poiché le stringhe GeoJSON sono definite su una mappa planare, l'orientamento può essere determinato senza ambiguità, anche se l'input non segue la regola di orientamento definita nella specifica del formato GeoJSON, RFC 7946.
Gestione dei dati spaziali formattati in modo errato
Quando carichi dati spaziali da altri strumenti in BigQuery, potresti riscontrare errori di conversione a causa di dati WKT o GeoJSON non validi. Ad esempio, un errore come Edge K has duplicate vertex with edge N indica che il poligono ha vertici duplicati (oltre al primo e all'ultimo).
Per evitare problemi di formattazione, puoi utilizzare una funzione che genera output conforme agli standard. Ad esempio, quando esporti i dati da PostGIS, puoi utilizzare la funzione PostGIS ST_MakeValid per standardizzare l'output.
In alternativa, importa i dati come testo e poi convertili chiamando
ST_GEOGFROMTEXT
o ST_GEOGFROMGEOJSON
con il parametro make_valid. Quando make_valid è TRUE, queste funzioni
tentano di riparare i poligoni non validi.
Per trovare o ignorare i dati formattati in modo errato, utilizza il prefisso della funzione SAFE per restituire i dati problematici. Ad esempio, la seguente query utilizza il prefisso SAFE per recuperare i dati spaziali formattati in modo errato.
SELECT geojson AS bad_geojson FROM mytable WHERE geojson IS NOT NULL AND SAFE.ST_GEOGFROMGEOJSON(geojson) IS NULL
Vincoli
L'analisi geospaziale non supporta le seguenti funzionalità nei formati geospaziali:
- Geometrie tridimensionali. Include il suffisso "Z" nel formato WKT e la coordinata di altitudine nel formato GeoJSON.
- Sistemi di riferimento lineari. Include il suffisso "M" nel formato WKT.
- Oggetti geometria WKT diversi dalle primitive di geometria o dalle geometrie multipart. In particolare, l'analisi geospaziale supporta solo Point, MultiPoint, LineString, MultiLineString, Polygon, MultiPolygon e GeometryCollection.
Consulta
ST_GEOGFROMGEOJSON
e
ST_GEOGFROMTEXT
per i vincoli specifici dei formati di input GeoJSON e WKT.
Integrare i dati raster geospaziali con Google Earth Engine
Le informazioni geospaziali vengono spesso presentate come dati basati su griglia o raster. I dati raster organizzano i dati regionalmente continui, come immagini satellitari, previsioni meteorologiche e copertura del suolo, in una griglia di pixel. Sebbene
BigQuery sia specializzato principalmente in dati vettoriali tabulari,
che rappresentano elementi con confini e punti, puoi integrare i dati raster
nelle tue analisi BigQuery utilizzando la
funzione.ST_REGIONSTATS
Questa funzione utilizza Earth Engine, la piattaforma di analisi raster di Google, per eseguire calcoli e aggregazioni sui dati raster per un'analisi geospaziale avanzata. Per ulteriori informazioni, consulta
Utilizzare i dati raster.
Per informazioni sull'esportazione dei dati di Earth Engine in BigQuery, consulta Esportare in BigQuery. Per ulteriori informazioni sulle integrazioni tra Earth Engine e BigQuery, consulta Integrazione di BigQuery nella documentazione di Earth Engine.
Trasformare i dati geospaziali
Se la tabella contiene colonne separate per longitudine e latitudine, puoi
trasformare i valori in aree geografiche utilizzando le funzioni geografiche GoogleSQL
come ST_GEOGPOINT.
Ad esempio, se hai due colonne DOUBLE per longitudine e latitudine, puoi creare una colonna geografica con la seguente query:
SELECT *, ST_GEOGPOINT(longitude, latitude) AS g FROM mytable
BigQuery può convertire le stringhe WKT e GeoJSON in tipi geografici.
Se i dati sono in un altro formato, ad esempio Shapefile, utilizza uno strumento esterno per convertire i dati in un formato di file di input supportato, ad esempio un file CSV, con le colonne GEOGRAPHY codificate come stringhe WKT o GeoJSON.
Partizionare e raggruppare i dati geospaziali
Puoi partizionare e
raggruppare le tabelle che contengono GEOGRAPHY
colonne. Puoi utilizzare una colonna GEOGRAPHY come colonna di clustering, ma non puoi utilizzarla come colonna di partizionamento.GEOGRAPHY
Se archivi i dati GEOGRAPHY in una tabella e le query filtrano i dati utilizzando un predicato spaziale, assicurati che la tabella sia raggruppata in cluster in base alla colonna GEOGRAPHY.
In genere, questo migliora le prestazioni delle query e potrebbe ridurre i costi. Un predicato spaziale chiama una funzione geografica booleana e ha una colonna GEOGRAPHY come uno degli argomenti. L'esempio seguente mostra un predicato spaziale che utilizza la funzione ST_DWITHIN:
WHERE ST_DWITHIN(geo, ST_GeogPoint(longitude, latitude), 100)
Utilizzare JOIN con i dati spaziali
Le JOIN spaziali sono JOIN di due tabelle con una funzione geografica predicativa nella clausola WHERE. Ad esempio:
-- how many stations within 1 mile range of each zip code? SELECT zip_code AS zip, ANY_VALUE(zip_code_geom) AS polygon, COUNT(*) AS bike_stations FROM `bigquery-public-data.new_york.citibike_stations` AS bike_stations, `bigquery-public-data.geo_us_boundaries.zip_codes` AS zip_codes WHERE ST_DWITHIN( zip_codes.zip_code_geom, ST_GEOGPOINT(bike_stations.longitude, bike_stations.latitude), 1609.34) GROUP BY zip ORDER BY bike_stations DESC
Le JOIN spaziali funzionano meglio quando i dati geografici vengono mantenuti. L'esempio precedente crea i valori geografici nella query. È più efficiente archiviare i valori geografici in una tabella BigQuery.
Ad esempio, la seguente query recupera le coppie di longitudine e latitudine e le converte in punti geografici. Quando esegui questa query, devi specificare una nuova tabella di destinazione in cui archiviare i risultati della query:
SELECT *, ST_GEOGPOINT(pLongitude, pLatitude) AS p FROM mytable
BigQuery implementa JOIN spaziali ottimizzate per gli operatori INNER JOIN e CROSS JOIN con le seguenti funzioni predicative GoogleSQL:
Le JOIN spaziali non sono ottimizzate:
- Per le JOIN
LEFT,RIGHToFULL OUTER - Nei casi che coinvolgono le anti-JOIN
- Quando il predicato spaziale è negato
Una JOIN che utilizza il predicato ST_DWITHIN è ottimizzata solo quando il parametro distance è un'espressione costante.
Esportare i dati spaziali
Quando esporti i dati spaziali da BigQuery, i valori della colonna GEOGRAPHY vengono sempre formattati come stringhe WKT. Per esportare i dati in formato GeoJSON,
utilizza la ST_ASGEOJSON
funzione.
Se gli strumenti che utilizzi per analizzare i dati esportati non riconoscono il
GEOGRAPHY tipo di dati, puoi convertire i valori delle colonne in stringhe utilizzando una
funzione geografica come
ST_ASTEXT
o ST_ASGEOJSON.
L'analisi geospaziale aggiunge punti aggiuntivi alla linea, se necessario, in modo che la sequenza di bordi convertita rimanga entro 10 metri dalla linea geodetica originale.
Ad esempio, la seguente query utilizza ST_ASGEOJSON per convertire i valori GeoJSON in stringhe.
SELECT ST_ASGEOJSON(ST_MAKELINE(ST_GEOGPOINT(1,1), ST_GEOGPOINT(3,2)))
I dati risultanti avranno il seguente aspetto:
{ "type": "LineString", "coordinates": [ [1, 1], [1.99977145571783, 1.50022838764041], [2.49981908082299, 1.75018082434274], [3, 2] ] }
La linea GeoJSON ha due punti aggiuntivi. L'analisi geospaziale aggiunge questi punti in modo che la linea GeoJSON segua da vicino lo stesso percorso sul terreno della linea originale.
Passaggi successivi
- Per iniziare a utilizzare l'analisi geospaziale, consulta Introduzione all'analisi geospaziale per gli analisti di dati.
- Per scoprire di più sulle opzioni di visualizzazione per l'analisi geospaziale, consulta Visualizzare i dati geospaziali.
- Per la documentazione sulle funzioni GoogleSQL nell'analisi geospaziale, consulta Funzioni geografiche in GoogleSQL.