Utilizzo delle funzioni dati GeoJSON

La specifica GeoJson definisce la struttura e il contenuto degli oggetti JSON che dovrebbero rappresentare le forme geografiche sulla terra (chiamate geometrie). Secondo la specifica GeoJson, affinché un oggetto JSON sia un oggetto geometrico, deve avere due campi chiamati tipo e coordinate, in cui il valore del campo del tipo specifica il tipo di geometria e il valore delle coordinate deve essere un array i cui elementi definiscono la forma geometrica.

Tutti i tipi di geometrie sono specificati in termini di un insieme di posizioni. Tuttavia, per le stringhe di linea e i poligoni, la forma geometrica effettiva è formata dalle linee che collegano le loro posizioni. La specifica GeoJson definisce una linea tra due punti come la linea retta che collega i punti nel sistema di coordinate cartesiane (piatte) i cui assi orizzontali e verticali sono rispettivamente la longitudine e la latitudine.

Esistono varie funzioni integrate che interpretano gli oggetti JSON come geometrie e consentono di cercare le righe contenenti geometrie che soddisfano determinate condizioni.

Per seguire gli esempi, creare una tabella dalla console OCI utilizzando la modalità di input DDL avanzata. L'istruzione DDL è riportata di seguito.

CREATE TABLE IF NOT EXISTS PointsOfInterest (
    id INTEGER, poi JSON,
PRIMARY KEY(id));

Vedere Creazione di una tabella Singleton: modalità di input DDL avanzata per informazioni sulla creazione di una tabella con un'istruzione DDL.

Per caricare i dati nella tabella creata dalla console OCI, fare clic sul nome della tabella. Vengono visualizzati i dettagli della tabella. Fare clic su Carica dati. Fare clic su Seleziona file da caricare e fornire il file JSON da caricare. Puoi scaricare il file DDL e JSON per i dati GeoJSON qui

geo-inside

Determina le geometrie all'interno di una geometria GeoJSON associata.

boolean geo_inside(any*, any*)

La funzione determina se la geometria puntata dal primo parametro è completamente contenuta all'interno del poligono puntato dal secondo parametro.

Se uno qualsiasi dei due parametri non restituisce un singolo oggetto geometria valido e se può essere rilevato in fase di compilazione, la funzione genera un errore.

Il funzionamento runtime è il seguente:

Nota: l'interno di un poligono è costituito da tutti i punti dell'area del poligono ad eccezione dei punti dell'anello lineare che definiscono il contorno del poligono.

Esempio: ricerca di parchi naturali nella California del Nord.

SELECT t.poi.name AS park_name,
t.poi.address.street AS park_location
FROM PointsOfInterest t
WHERE t.poi.kind = "nature park"
AND geo_inside(t.poi.location,
              { "type" : "polygon",
                "coordinates": [[
                  [-
120.1135253906249, 36.99816565700228],
                  [-119.0972900390625, 37.391981943533544],
                  [-119.2840576171875, 37.97451499202459],
                  [-120.2069091796874, 38.035112420612975],
                  [-122.3822021484375, 37.74031329210266],
                  [-122.2283935546875, 37.15156050223665],
                  [-121.5362548828124, 36.85325222344018],
                  [-120.1135253906249, 36.99816565700228]
                ]]
             });

Spiegazione:

Risultato:

{"park_name":"portola redwoods state park",
"park_location":"15000 Skyline Blvd"}

geo-intersezione

Determina le geometrie che si intersecano con una geometria GeoJSON.

boolean geo_intersect(any*, any*)

Il primo e il secondo parametro any* possono essere oggetti geometrici.

La funzione determina se due geometrie specificate come parametri hanno punti in comune. Se uno qualsiasi dei due parametri non restituisce un singolo oggetto geometria valido e se può essere rilevato in fase di compilazione, la funzione genera un errore.

Il funzionamento runtime è il seguente:

Se entrambi i parametri restituiscono un singolo oggetto geometrico ciascuno, la funzione restituisce true se le 2 geometrie hanno punti in comune; altrimenti false.

Esempio:i Texas stanno valutando la possibilità di regolare l'accesso all'approvvigionamento idrico sotterraneo. Una falda acquifera è uno strato sotterraneo di roccia permeabile portante acqua, fratture rocciose o materiali non consolidati. Il governo vuole imporre nuovi regolamenti per le località che sono molto vicine a una falda acquifera.

Le coordinate della falda acquifera sono già state mappate. Si desidera conoscere tutte le contee dello stato del Texas che si intersecano con quella falda acquifera in modo da poter informare il governo della contea per ogni contea interessata di partecipare ai colloqui per le nuove normative.

SELECT t.poi.county AS County_needs_regulation,
t.poi.contact AS Contact_phone
FROM PointsOfInterest t WHERE
geo_intersect(
    t.poi.location,
    {

     "type" : "polygon",
      "coordinates": [
          [
            [-97.668457031249, 29.34387539941801],
            [-95.207519531258, 29.19053283229458],
            [-92.900390625653, 30.37287518811801],
            [-94.636230468752, 32.21280106801518],
            [-97.778320312522, 32.45415593941475],
            [-99.799804687541, 31.18460913574325],
            [-97.668457031249, 29.34387539941801]
          ]
        ]
    }
);

Spiegazione:

Risultato:

{"County_needs_regulation":"Tarrant","Contact_phone":"469 745 5687"}
{"County_needs_regulation":"Kinga","Contact_phone":"469 384 7612"}

distanza_geo

Determina la distanza tra due oggetti geospaziali.

double geo_distance(any*, any*)

Il primo e il secondo parametro any* possono essere oggetti geometrici.

La funzione restituisce la distanza geodetica tra le due geometrie di input. La distanza restituita è la distanza minima tra le distanze di qualsiasi coppia di punti in cui il primo punto appartiene alla prima geometria e il secondo punto alla seconda geometria. Tra due di questi punti, la loro distanza è la lunghezza della linea geodetica che collega i punti.

Panoramica della linea geodetica

Una linea geodetica tra 2 punti è la linea più breve che può essere disegnata tra i 2 punti sulla superficie ellissoidale della terra. Per una definizione semplificata, ma più illustrativa, supponiamo per un momento che la superficie della terra sia una sfera. Quindi, la linea geodetica tra due punti sulla terra è l'arco minore tra i due punti sul grande cerchio corrispondente ai punti, cioè il cerchio che si forma dall'intersezione della sfera e il piano definito dal centro della terra e dai due punti.

La figura seguente mostra la differenza tra le linee geodetiche e rette tra Los Angeles e Londra.

Segue la descrizione dell'immagine geodetic-vs-straight-line.jpg

Descrizione dell'illustrazione geodetic-vs-straight-line.jpg

Se uno qualsiasi dei due parametri non restituisce un singolo oggetto geometria valido e se può essere rilevato in fase di compilazione, la funzione genera un errore.

Il funzionamento runtime è il seguente:

In caso contrario, la funzione restituisce la distanza geodetica in metri tra le 2 geometrie di input.

Nota: i risultati vengono ordinati in ordine crescente in base alla distanza (visualizzando prima la distanza più breve).

Esempio: quanto dista il ristorante più vicino dalla posizione specificata?

SELECT
t.poi.name AS restaurant_name,
t.poi.address.street AS street_name,
geo_distance(
    t.poi.location,
    {
       "type" : "point",
       "coordinates": [-
121.94034576416016,37.2812239247177]
    }
) AS distance_in_meters
FROM PointsOfInterest t
WHERE t.poi.kind = "restaurant" ;

Spiegazione:

Risultato:

{"restaurant_name":"Coach Sports Bar & Grill","street_name":"80 Edward St","distance_in_meters":799.2645323337218}
{"restaurant_name":"Ricos Taco","street_name":"80 East Boulevard St","distance_in_meters":976.5361117138553}
{"restaurant_name":"Effie's Restaurant and Bar","street_name":"80 Woodeard St","distance_in_meters":2891.0508307646282}

La distanza tra la posizione attuale e il ristorante più vicino è di 799 metri.

geo-within-distance

Determina gli oggetti geospaziali in prossimità di un punto.

boolean geo_within_distance(any*, any*,double)

Il primo e il secondo parametro any* possono essere oggetti geometrici.

La funzione determina se la prima geometria si trova a una distanza di N metri dalla seconda geometria.

Se uno qualsiasi dei due parametri non restituisce un singolo oggetto geometria valido e se può essere rilevato in fase di compilazione, la funzione genera un errore.

Il funzionamento runtime è il seguente:

Infine, se entrambi i parametri restituiscono un singolo oggetto geometrico ciascuno, restituisce true se la prima geometria si trova a una distanza di N metri dalla seconda geometria, dove N è il numero restituito dal terzo parametro; altrimenti false. La distanza tra 2 geometrie è definita come il minimo tra le distanze di qualsiasi coppia di punti in cui il primo punto appartiene alla prima geometria e il secondo punto alla seconda geometria. Se N è un numero negativo, viene impostato su 0.

Esempio:c'è un municipio nei prossimi 5 km? Quanto dista?

SELECT t.poi.address.street AS city_hall_address,
geo_distance(
    t.poi.location,
    {
        "type" : "point",
        "coordinates" : [-120.653828125,38.85682013474361]
    }

) AS distance_in_meters
FROM PointsOfInterest t
WHERE t.poi.kind = "city hall" AND
geo_within_distance(
    t.poi.location,
    {
        "type" : "point",
        "coordinates" : [-120.653828125,38.85682013474361]
    },
    5000
);

Spiegazione:

Risultato:

{"city_hall_address":"70 North 1st street","distance_in_meters":1736.0144040331768}

Il municipio si trova a 1736 m (1,73 km) dalla posizione attuale.

geo_vicino

Determina gli oggetti geospaziali in prossimità di un punto.

boolean geo_near(any*, any*, double)

Il primo e il secondo parametro any* possono essere oggetti geometrici.

La funzione determina se la prima geometria si trova a una distanza di N metri dalla seconda geometria.

Se uno qualsiasi dei due parametri non restituisce un singolo oggetto geometria valido e se può essere rilevato in fase di compilazione, la funzione genera un errore.

Il funzionamento runtime è il seguente:

Infine, se entrambi i primi due parametri restituiscono un singolo oggetto geometrico ciascuno, restituisce vero se la prima geometria si trova a una distanza di N metri dalla seconda geometria, dove N è il numero restituito dal terzo parametro; altrimenti falso.

Nota: geo_near viene convertito internamente in geo_within_distance più un ordine (implicito) in base alla distanza tra le due geometrie. Tuttavia, se la query ha già un ordine (esplicito), non viene eseguito alcun ordine per distanza. La funzione geo_near può essere visualizzata solo nella clausola WHERE, dove deve essere un predicato di livello superiore, ovvero non nidificato con un operatore OR o NOT.

Esempio 1:è presente un ospedale entro 3 km dalla località indicata?

SELECT
t.poi.name AS hospital_name,
t.poi.address.street AS hospital_address
FROM PointsOfInterest t
WHERE t.poi.kind = "hospital"
AND
geo_near(
    t.poi.location,
    {"type" : "point",
     "coordinates" : [-122.03493933105469,37.32949164059004]
    },
    3000
);

Spiegazione:

Risultato:

{"hospital_name":"St. Marthas hospital","hospital_address":"18000 West Blvd"}
{"hospital_name":"Memorial hospital","hospital_address":"10500 South St"}

Esempio 2: a che distanza si trova una stazione di servizio nel miglio successivo dalla posizione specificata?

SELECT
t.poi.address.street AS gas_station_address,
geo_distance(
    t.poi.location,
    {
        "type" : "point",
        "coordinates" : [-121.90768646240233,37.292081740702365]
    }
) AS distance_in_meters
FROM PointsOfInterest t
WHERE t.poi.kind = "gas station" AND
geo_near(
    t.poi.location,
    {
        "type" : "point",
        "coordinates" : [-121.90768646240233,37.292081740702365]
    },
    1600
);

Spiegazione:

Risultato:

{"gas_station_address":"33 North Avenue","distance_in_meters":886.7004173859665}

La distanza effettiva dalla stazione di servizio più vicina entro il miglio successivo è di 886m.

geo_is_geometria

Convalida un oggetto geospaziale.

boolean geo_is_geometry(any*)

Il parametro any* può essere qualsiasi oggetto geometrico.

La funzione determina se l'input specificato è un oggetto geometria valido.

Esempio: determinare se la posizione che punta alla city hall è un oggetto geometrico valido.

SELECT geo_is_geometry(t.poi.location) AS city_hall
FROM PointsOfInterest t
WHERE t.poi.kind = "city hall"

Spiegazione: la funzione geo_is_geometry consente di determinare se una determinata posizione è un oggetto geometrico valido o meno.

Risultato:

{ "city_hall" : true}

Argomenti correlati