Utilizzo dei dati geospaziali
L'analisi geospaziale ti consente di analizzare i dati geografici in BigQuery. I dati geografici sono anche noti come dati geospaziali.
I tipi di oggetti più comuni quando si lavora con i dati geospaziali sono:
- Una Geometria rappresenta un'area della superficie del pianeta. Viene spesso descritto utilizzando punti, linee, poligoni o una raccolta di punti, linee e poligoni. Una raccolta di geometria è una geometrica che rappresenta l'unione spaziale di tutte le forme nella collezione.
- Un elemento spaziale rappresenta un oggetto spaziale logico. Combina una geometria con attributi aggiuntivi specifici per l'applicazione.
- Una raccolta di elementi spaziali è un insieme di elementi spaziali.
In BigQuery, il tipo di dati GEOGRAPHY
rappresenta un valore o una raccolta di geometrie. Per rappresentare le caratteristiche spaziali, crea una tabella con una colonna GEOGRAPHY
per la geometria e colonne aggiuntive per gli attributi. Ogni riga della tabella è una funzionalità spaziale e l'intera tabella rappresenta una raccolta di caratteristiche spaziali.
Il tipo di dati GEOGRAPHY
descrive un set di punti sulla superficie terrestre. Un
set di punti è un insieme di punti, linee e poligoni sullo
sferoide di riferimento
WGS84, con bordi geodetici. Puoi utilizzare il tipo di dati GEOGRAPHY
chiamando una delle funzioni geografiche di 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 i valori di longitudine e latitudine e poi utilizzare la funzione ST_GEOGPOINT
per convertirli in valori di GEOGRAPHY
.
Per aree geografiche più complesse, puoi caricare i seguenti formati di dati geospaziali in una colonna GEOGRAPHY
:
- Testo conosciuto (WKT)
- File binario noto (WKB)
- GeoJSON
Caricamento dei dati WKT o WKB in corso...
WKT è un formato di testo per descrivere singole forme geometriche usando 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 formato esadecimale per i formati che non supportano dati binari, come JSON.
Ad esempio, quanto segue definisce un punto in WKT:
POINT(-121 41)
Per descrivere una funzionalità spaziale, in genere WKT è incorporato in un file di container, ad esempio un file CSV o in una tabella di database. Una riga di file o una riga di tabella in genere corrisponde alla funzionalità spaziale. L'intero file o l'intera tabella
corrisponde alla raccolta di caratteristiche. Per caricare i dati WKT in BigQuery, fornisci uno schema che specifichi una colonna GEOGRAPHY
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 bq
dello strumento a riga di comando load
:
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 trasmettere in flussi i dati WKT a 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 per la configurazione di Python nella guida rapida di BigQuery all'utilizzo delle librerie client. Per saperne di più, consulta la documentazione di riferimento dell'API Python BigQuery.
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 funzione ST_GeogFromText
.
Caricamento dei dati GeoJSON
GeoJSON è un formato basato su JSON per geometrie e funzionalità spaziali. Ad esempio, quanto segue definisce un punto in GeoJSON:
{ "type": "Point", "coordinates": [-121,41] }
I dati GeoJSON possono contenere i seguenti tipi di oggetti:
- Oggetti geometrici. Un oggetto geometrico è una forma spaziale, descritta come un'unione di punti, linee e poligoni con fori facoltativi.
- Oggetti Feature. Un oggetto caratteristica contiene una geometrica e altre coppie nome/valore, il cui significato è specifico per l'applicazione.
- Raccolte di funzionalità. Una raccolta di caratteristiche è un insieme di oggetti di funzionalità.
Esistono due modi per caricare i dati GeoJSON in BigQuery:
- Carica file GeoJSON delimitati da nuove righe.
- Carica i singoli oggetti geometrici di GeoJSON incorporati in altri tipi di file.
Caricamento di file GeoJSON delimitati da nuove righe
Un file GeoJSON delimitato da nuova riga contiene un elenco di oggetti delle funzionalità GeoJSON, uno per riga nel file. Un oggetto GeoJSON è un oggetto JSON con i seguenti membri:
type
. Per gli oggetti delle funzionalità, il valore deve essereFeature
. BigQuery convalida il valore ma non lo include nello schema della tabella.geometry
. Il valore è un oggetto GeoJSONGeometry
onull
. BigQuery converte questo membro in un valoreGEOGRAPHY
.properties
. Il valore può essere qualsiasi oggetto JSON o null. Se il valore non ènull
, BigQuery carica ogni membro dell'oggetto JSON come colonna di tabella separata. Per ulteriori informazioni su come BigQuery analizza i tipi di dati JSON, consulta la sezione Dettagli sul caricamento dei dati JSON.id
(Facoltativo) Se presente, il valore può essere una stringa o un numero. BigQuery carica questo valore in una colonna denominataid
.
Se l'oggetto funzionalità contiene altri membri non elencati qui, BigQuery li converte direttamente in colonne di tabella.
Puoi caricare un file GeoJSON delimitato da nuova riga utilizzando il comando bq
load
dello strumento a riga di comando bq
, come indicato di seguito:
bq load \ --source_format=NEWLINE_DELIMITED_JSON \ --json_extension=GEOJSON \ --autodetect \ DATASET.TABLE \ FILE_PATH_OR_URI
Sostituisci quanto segue:
DATASET
è il nome del tuo set di dati.TABLE
è il nome della tabella di destinazione.FILE_PATH_OR_URI
è un percorso verso un file locale o un URI Cloud Storage.
L'esempio precedente abilita il rilevamento automatico dello schema. Per un maggiore controllo sul modo in cui BigQuery converte i valori all'interno dell'oggetto properties
, puoi fornire uno schema esplicito. Per maggiori informazioni, consulta la sezione Specificare gli schemi manualmente.
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 da RFC 7946,
una struttura di dati GeoJSON completa è un singolo oggetto JSON. Molti sistemi esportano i dati GeoJSON come un singolo oggetto FeatureCollection
che contiene tutte le geometrie. Per caricare questo formato in BigQuery, devi convertire il file rimuovendo l'oggetto FeatureCollection
a livello principale e suddividere i singoli oggetti di funzionalità in righe separate. Ad esempio, il seguente comando utilizza lo strumento a riga di comando jq
per suddividere 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 creando una tabella esterna. Per creare la tabella esterna, utilizza l'istruzione DDL CREATE EXTERNAL TABLE
. 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 geometrici GeoJSON
L'analisi geospaziale supporta il caricamento di singoli oggetti geometrici 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 geometrico GeoJSON.
Per caricare questo tipo di dati GeoJSON in BigQuery, fornisci uno schema che specifica una colonna GEOGRAPHY
per i dati GeoJSON. Devi fornire manualmente lo schema. In caso contrario, se il rilevamento automatico è attivo, BigQuery carica i dati come valore STRING
.
L'analisi geospaziale non supporta il caricamento di oggetti o raccolte di funzionalità GeoJSON utilizzando questo approccio. Se devi caricare oggetti delle funzionalità, valuta la possibilità di utilizzare file GeoJSON delimitati da nuove righe.
Per inviare flussi di dati GeoJSON a 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 per la configurazione di Python nella guida rapida di BigQuery all'utilizzo delle librerie client. Per saperne di più, consulta la documentazione di riferimento dell'API Python BigQuery.
Puoi anche convertire un oggetto geometrico GeoJSON in un valore GEOGRAPHY
utilizzando la funzione ST_GEOGFROMGEOJSON
. Ad esempio, puoi archiviare le geometrie come valori STRING
e poi eseguire una query che chiama ST_GEOGFROMGEOJSON
.
Coordinare sistemi e bordi
Nell'analisi geospaziale, i punti sono posizioni sulla superficie di uno sferoide WGS84, espresso in longitudine e latitudine geodetica. Un bordo è un elemento geodetico sferico tra due endpoint. Ciò significa che i bordi sono il percorso più corto sulla superficie di una sfera.
Il formato WKT non fornisce un sistema di coordinate. Durante il caricamento dei dati WKT, l'analisi geospaziale presuppone che i dati utilizzino le coordinate WGS84 con i bordi sferici. Assicurati che i dati di origine corrispondano al sistema di coordinate, a meno che le aree geografiche non siano abbastanza piccole da poter ignorare la differenza tra bordi sferici e planari.
GeoJSON utilizza esplicitamente le coordinate WGS84 con i bordi planari. Durante il caricamento dei dati GeoJSON, l'analisi geospaziale converte i bordi planari in bordi sferici. L'analisi geospaziale aggiunge ulteriori punti alla linea, in modo che la sequenza convertita di bordi rimanga entro 10 metri dalla linea originale. Questa procedura è nota come tessellazione o densificazione non uniforme. Non puoi controllare direttamente la procedura di tassello.
Per caricare le aree geografiche con bordi sferici, utilizza WKT. Per caricare le aree geografiche con bordi planari, spesso chiamati geometrie, è più semplice utilizzare GeoJSON. Tuttavia, se i dati geometrici sono già in formato WKT, un'altra opzione è caricare i dati come tipo STRING
e utilizzare la funzione ST_GEOGFROMTEXT
per convertirli in valori GEOGRAPHY
. Imposta il parametro planar
su TRUE
per interpretare i dati come piani.
Quando scegli un formato di interscambio, assicurati di comprendere il sistema di coordinate utilizzato dai tuoi dati di origine. La maggior parte dei sistemi supporta in modo esplicito l'area geografica di analisi (anziché la geometria) di WKT, altrimenti presuppone l'impiego di bordi planari.
Le coordinate devono essere prima la longitudine e poi la latitudine. Se l'area geografica ha segmenti o bordi lunghi, devono essere sottoposti a tessell, perché l'analisi geospaziale li interpreta come geodetiche sferiche, che potrebbero non corrispondere al sistema di coordinate in cui hanno avuto origine i 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 terrestri. Poiché i due poligoni sono descritti con gli stessi anelli di delimitazione, sono necessarie delle regole per risolvere l'ambiguità attorno alla quale i due poligoni sono descritti da una determinata stringa WKT.
Quando carichi stringhe WKT e WKB dai file o utilizzando l'importazione di flussi di dati, l'analisi geospaziale presuppone che i poligoni nell'input siano orientati come segue: Se attraversa il confine del poligono nell'ordine dei vertici di input, l'interno del poligono è a sinistra. L'analisi geospaziale utilizza la stessa regola durante l'esportazione di oggetti geografici in stringhe WKT e WKB.
Se utilizzi la funzione ST_GeogFromText
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
: usa la regola di orientamento a sinistra descritta in precedenza. Questa opzione ti consente di caricare poligoni con un'area più grande 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.
Gestire i dati spaziali non formattati correttamente
Quando carichi dati spaziali da altri strumenti a 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 generi un 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 convertili chiamando
ST_GEOGFROMTEXT
o ST_GEOGFROMGEOJSON
con il parametro make_valid
. Quando make_valid
è TRUE
, queste funzioni provano a riparare i poligoni non validi.
Per trovare o ignorare i dati formattati in modo errato, utilizza il prefisso della funzione SAFE
per visualizzare i dati problematici. Ad esempio, la seguente query utilizza il prefisso SAFE
per recuperare i dati spaziali non formattati correttamente.
SELECT geojson AS bad_geojson FROM mytable WHERE geojson IS NOT NULL AND SAFE.ST_GeogFromGeoJson(geojson) IS NULL
Limitazioni
L'analisi geospaziale non supporta le seguenti funzionalità nei formati geospaziali:
- Geometrie tridimensionali. Ciò include il suffisso "Z" nel formato WKT e la coordinata dell'altitudine nel formato GeoJSON.
- Sistemi di riferimento lineari. incluso il suffisso "M" nel formato WKT.
- Oggetti geometrici WKT diversi da primitive di geometria o geometrie multiparti. In particolare, l'analisi geospaziale supporta solo Point, MultiPoint, LineString, MultiLineString, poligono, Multi poligono e GeometryCollection.
Consulta
ST_GeogFromGeoJson
e
ST_GeogFromText
per i vincoli specifici dei formati di input GeoJson e WKT.
Trasformazione dei dati geospaziali
Se la tabella contiene colonne separate per longitudine e latitudine, puoi trasformare i valori in aree geografiche utilizzando le funzioni geografiche di GoogleSQL, ad esempio ST_GeogPoint
.
Ad esempio, se hai due colonne DOUBLE
per longitudine e latitudine, puoi creare una colonna 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 hanno un formato diverso, ad esempio Shapefile, usa uno strumento esterno per convertirli in un formato di file di input supportato, ad esempio un file CSV, con colonne GEOGRAPHY
codificate come stringhe WKT o GeoJSON.
Partizionamento e clustering di dati geospaziali
Puoi eseguire il partizionamento e le tabelle di cluster che contengono colonne GEOGRAPHY
. Puoi utilizzare una colonna GEOGRAPHY
come colonna di clustering, ma non puoi utilizzare una colonna GEOGRAPHY
come colonna di partizionamento.
Se archivi i dati GEOGRAPHY
in una tabella e le query filtrano i dati utilizzando un predicato spaziale, assicurati che la tabella sia aggregata 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 uno degli argomenti una colonna GEOGRAPHY
. L'esempio seguente mostra un predicato spaziale che utilizza la funzione ST_DWithin
:
WHERE ST_DWithin(geo, ST_GeogPoint(longitude, latitude), 100)
Utilizzo di JOIN con dati spaziali
I join funzionali sono join di due tabelle con una funzione geografica predicata 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 unioni spaziali hanno un rendimento migliore 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 coppie di longitudine e latitudine e le converte in punti geografici. Quando esegui questa query, devi specificare una nuova tabella di destinazione per archiviare i risultati:
SELECT *, ST_GeogPoint(pLongitude, pLatitude) AS p FROM mytable
BigQuery implementa i join di join spaziali ottimizzati per gli operatori INNER JOIN e CROSS JOIN con le seguenti funzioni del predicato GoogleSQL:
Le unioni spaziali non sono ottimizzate:
- Per join SINISTRO, DESTRO o ESTERNO COMPLETO
- Nei casi che prevedono l'adesione all'ANTI
- Quando il predicato spaziale viene negato
Un JOIN che utilizza il predicato ST_DWithin
viene ottimizzato solo quando
il parametro della distanza è un'espressione costante.
Esportazione dati spaziali
Quando esporti dati spaziali da BigQuery, i valori della colonna GEOGRAPHY
vengono sempre formattati come stringhe WKT. Per esportare i dati in formato GeoJSON, utilizza la funzione ST_AsGeoJSON
.
Se gli strumenti che utilizzi per analizzare i dati esportati non comprendono il tipo di dati GEOGRAPHY
, puoi convertire i valori delle colonne in stringhe usando una funzione geografica come ST_AsText
o ST_AsGeoJSON
.
L'analisi geospaziale aggiunge ulteriori punti alla linea, 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 avrebbero il seguente aspetto:
{ "type": "LineString", "coordinates": [ [1, 1], [1.99977145571783, 1.50022838764041], [2.49981908082299, 1.75018082434274], [3, 2] ] }
La linea GeoJSON ha altri due punti. 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 la Guida introduttiva all'analisi geospaziale per gli analisti di dati.
- Per scoprire di più sulle opzioni di visualizzazione per l'analisi geospaziale, consulta l'articolo Visualizzare i dati geospaziali.
- Per la documentazione sulle funzioni di GoogleSQL in analisi geospaziali, consulta Funzioni geografiche in GoogleSQL.