Utilisation des fonctions de données GeoJSON
La spécification GeoJson définit la structure et le contenu des objets JSON censés représenter des formes géographiques sur terre (appelées géométries). Selon la spécification GeoJson, pour qu'un objet JSON soit un objet de géométrie, il doit comporter deux champs appelés type et coordonnées, où la valeur du champ de type spécifie le type de géométrie et la valeur des coordonnées doit être un tableau dont les éléments définissent la forme géométrique.
Toutes sortes de géométries sont spécifiées en fonction d'un ensemble de positions. Cependant, pour les cordes de ligne et les polygones, la forme géométrique réelle est formée par les lignes reliant leurs positions. La spécification GeoJson définit une ligne entre deux points comme la ligne droite qui relie les points dans le système de coordonnées cartésien (plat) dont les axes horizontal et vertical sont respectivement la longitude et la latitude.
Il existe différentes fonctions intégrées qui interprètent les objets JSON comme des géométries et permettent de rechercher les lignes contenant des géométries qui remplissent certaines conditions.
CREATE TABLE IF NOT EXISTS PointsOfInterest (
id INTEGER, poi JSON,
PRIMARY KEY(id));
Pour connaître les étapes de création d'une table avec une instruction DDL, reportez-vous à Création d'une table unique : mode d'entrée DDL avancée.
Pour charger des données dans la table créée à partir de la console OCI, cliquez sur le nom de la table. Les détails de la table sont affichés. Cliquez sur Télécharger les données vers le serveur. Cliquez sur sélectionner le fichier à télécharger et indiquez le fichier JSON à télécharger. Vous pouvez télécharger le fichier DDL et JSON pour les données GeoJSON ici.
Rubriques connexes
geo_inside
boolean geo_inside(any*, any*)
- Le premier paramètre
any*
peut être n'importe quel objet géométrique. - Le deuxième paramètre
any*
doit être un polygone.
La fonction détermine si la géométrie pointée par le premier paramètre est entièrement contenue à l'intérieur du polygone pointé par le second paramètre.
Si l'un des deux paramètres ne renvoie pas un seul objet géométrique valide, et s'il peut être détecté lors de la compilation, la fonction génère une erreur.
- Renvoie False si un paramètre renvoie 0 ou plus de 1 élément.
- Renvoie NULL si un paramètre renvoie NULL.
- Renvoie False si un paramètre (au moment de l'exécution) renvoie un élément qui n'est pas un objet géométrique valide.
- Renvoie False si le deuxième paramètre renvoie un objet de géométrie qui n'est pas un polygone.
- Si les deux paramètres renvoient chacun un objet géométrique unique et que la deuxième géométrie est un polygone.
- Elle renvoie la valeur True si la première géométrie est entièrement contenue à l'intérieur du deuxième polygone, c'est-à-dire que tous ses points appartiennent à l'intérieur du polygone.
- Sinon, elle renvoie false.
Remarques :
L'intérieur d'un polygone correspond à tous les points de la zone de polygone, à l'exception des points de l'anneau linéaire qui définissent la limite du polygone.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]
]]
});
- Vous interrogez la table
PointsOfInterest
afin de filtrer les lignes pour nature park. - Vous indiquez un polygone comme deuxième paramètre de la fonction
geo_inside
. - Les coordonnées du polygone que vous spécifiez correspondent aux coordonnées de la partie nord de l'État de Californie aux États-Unis.
- La fonction
geo_inside
ne renvoie des lignes que lorsque l'emplacement du parc naturel est entièrement contenu à l'intérieur des points d'emplacement spécifiés.
{"park_name":"portola redwoods state park",
"park_location":"15000 Skyline Blvd"}
geo_intersect
boolean geo_intersect(any*, any*)
Les premier et deuxième paramètres any*
peuvent être n'importe quel objet géométrique.
La fonction détermine si deux géométries spécifiées en tant que paramètres ont des points communs. Si l'un des deux paramètres ne renvoie pas un seul objet géométrique valide, et s'il peut être détecté lors de la compilation, la fonction génère une erreur.
- Renvoie False si un paramètre renvoie 0 ou plus de 1 élément.
- Renvoie NULL si un paramètre renvoie NULL.
- Renvoie False si un paramètre (au moment de l'exécution) renvoie un élément qui n'est pas un objet géométrique valide.
Si les deux paramètres renvoient chacun un seul objet géométrique, la fonction renvoie True si les 2 géométries ont des points communs ; sinon, False.
Exemple : Texas envisage de réglementer l'accès à l'approvisionnement en eau souterraine. Un aquifère est une couche souterraine de roche perméable porteuse d'eau, de fractures rocheuses ou de matériaux non consolidés. Le gouvernement veut imposer de nouvelles réglementations pour les endroits qui sont très proches d'un aquifère.
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]
]
]
}
);
- La requête ci-dessus extrait les emplacements qui croisent avec l'emplacement de l'aquifère. C'est-à-dire si les coordonnées de localisation ont des points communs avec l'emplacement de l'aquifère.
- Utilisez
geo_intersect
pour voir si les coordonnées de l'emplacement ont des points communs avec les coordonnées de l'aquifère indiquées.
{"County_needs_regulation":"Tarrant","Contact_phone":"469 745 5687"}
{"County_needs_regulation":"Kinga","Contact_phone":"469 384 7612"}
geo_distance
double geo_distance(any*, any*)
Les premier et deuxième paramètres any*
peuvent être n'importe quel objet géométrique.
La fonction renvoie la distance géodésique entre les deux géométries d'entrée. La distance renvoyée est la distance minimale entre les distances d'une paire de points où le premier point appartient à la première géométrie et le deuxième point à la deuxième géométrie. Entre deux de ces points, leur distance est la longueur de la ligne géodésique qui relie les points.
Présentation de la ligne géodésique
Une ligne géodésique entre 2 points est la ligne la plus courte qui peut être tracée entre les 2 points sur la surface ellipsoïdale de la terre. Pour une définition simplifiée, mais plus illustrative, supposons un instant que la surface de la terre est une sphère. Ensuite, la ligne géodésique entre deux points de la terre est l'arc mineur entre les deux points du grand cercle correspondent aux points, c'est-à-dire le cercle formé par l'intersection de la sphère et du plan défini par le centre de la terre et les deux points.
La figure suivante montre la différence entre les lignes géodésiques et droites entre Los Angeles et Londres.
Si l'un des deux paramètres ne renvoie pas un seul objet géométrique valide, et s'il peut être détecté lors de la compilation, la fonction génère une erreur.
- Renvoie -1 si un paramètre renvoie zéro ou plus de 1 élément.
- Renvoie NULL si un paramètre renvoie NULL.
- Renvoie -1 si l'un des paramètres n'est pas un objet de géométrie.
Remarques :
Les résultats sont triés par distance (affichage de la distance la plus courte en premier).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" ;
- Vous interrogez la table
PointsOfInterest
pour filtrer les lignes de restaurant. - Indiquez le point d'emplacement correct et déterminez la distance à l'aide de la fonction
geo_distance
.
{"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 distance entre l'emplacement actuel et le restaurant le plus proche est de 799 mètres.
geo_within_distance
boolean geo_within_distance(any*, any*,double)
Les premier et deuxième paramètres any*
peuvent être n'importe quel objet géométrique.
La fonction détermine si la première géométrie est à une distance de N mètres de la deuxième géométrie.
Si l'un des deux paramètres ne renvoie pas un seul objet géométrique valide, et s'il peut être détecté lors de la compilation, la fonction génère une erreur.
- Renvoie False si un paramètre renvoie 0 ou plus de 1 élément.
- Renvoie NULL si l'un des deux premiers paramètres renvoie NULL.
- Renvoie False si l'un des deux premiers paramètres renvoie un élément qui n'est pas un objet géométrique valide.
Enfin, si les deux paramètres renvoient chacun un objet géométrique unique, il renvoie true si la première géométrie est à une distance de N mètres de la deuxième géométrie, où N est le nombre renvoyé par le troisième paramètre ; sinon false. La distance entre 2 géométries est définie comme le minimum parmi les distances de toute paire de points où le premier point appartient à la première géométrie et le deuxième point à la deuxième géométrie. Si N est un nombre négatif, il est défini sur 0.
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
);
- Vous interrogez la table
PointsOfInterest
afin de filtrer les lignes pour city hall. - Vous utilisez la fonction
geo_within_distance
pour filtrer l'hôtel de ville à moins de 5 km (5000m) de l'emplacement indiqué. - Vous extrayez également la distance réelle entre votre emplacement et l'hôtel de ville à l'aide de la fonction
geo_distance
.
{"city_hall_address":"70 North 1st street","distance_in_meters":1736.0144040331768}
L'hôtel de ville est à 1736 m (1,73 km) de l'emplacement actuel.
geo_near
boolean geo_near(any*, any*, double)
Les premier et deuxième paramètres any*
peuvent être n'importe quel objet géométrique.
La fonction détermine si la première géométrie est à une distance de N mètres de la deuxième géométrie.
Si l'un des deux paramètres ne renvoie pas un seul objet géométrique valide, et s'il peut être détecté lors de la compilation, la fonction génère une erreur.
- Renvoie False si un paramètre renvoie 0 ou plus de 1 élément.
- Renvoie NULL si l'un des deux premiers paramètres renvoie NULL.
- Renvoie False si l'un des deux premiers paramètres renvoie un élément qui n'est pas un objet géométrique valide.
Remarques :
geo_near est converti en interne en geo_within_distance plus un ordre (implicite) par la distance entre les deux géométries. Toutefois, si la requête comporte déjà une commande (explicite), aucune commande par distance n'est effectuée. La fonction geo_near peut uniquement apparaître dans la clause WHERE, où elle doit être un prédicat de niveau supérieur, c'est-à-dire non imbriquée sous un opérateur OR ou NOT.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
);
- Vous interrogez la table
PointsOfInterest
afin de filtrer les lignes pour hospital. - Utilisez la fonction
geo_near
pour filtrer les hôpitaux dans 3000m de l'emplacement donné.
{"hospital_name":"St. Marthas hospital","hospital_address":"18000 West Blvd"}
{"hospital_name":"Memorial hospital","hospital_address":"10500 South St"}
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
);
- Vous interrogez la table
PointsOfInterest
afin de filtrer les lignes pour la station-service. - Vous utilisez la fonction
geo_near
pour filtrer les stations-service à un kilomètre (1600m) de l'emplacement indiqué. - Vous extrayez également la distance réelle entre votre emplacement et la station-service à l'aide de la fonction
geo_distance
.
{"gas_station_address":"33 North Avenue","distance_in_meters":886.7004173859665}
La distance réelle à la station-service la plus proche dans le mile suivant est 886m.
geo_is_geometry
boolean geo_is_geometry(any*)
Le paramètre any*
peut être n'importe quel objet géométrique.
- Renvoie False si le paramètre renvoie zéro ou plus de 1 élément.
- Renvoie NULL si le paramètre renvoie NULL.
- Renvoie True si l'entrée est un seul objet géométrique valide. Sinon, false.
SELECT geo_is_geometry(t.poi.location) AS city_hall
FROM PointsOfInterest t
WHERE t.poi.kind = "city hall"
Explication : Vous utilisez la fonction geo_is_geometry pour déterminer si un emplacement donné est ou non un objet géométrique valide.
{ "city_hall" : true}