La notation que vous montrez n'est pas la meilleure pour représenter des points 2D ou 3D uniques. Le moyen le plus courant et le plus efficace d'encoder ces points est le suivant :
SDO_GEOMETRY(2001,4326,SDO_POINT_TYPE(51.702814,32.624736,NULL),NULL,NULL)
Tous les outils SIG que j'ai vus utilisent cette notation. Celui que vous montrez est également valide - il utilise simplement plus de stockage. Mais les deux notations sont totalement équivalentes sur le plan fonctionnel.
En utilisant la notation compacte, obtenir les coordonnées individuelles est trivial. Par exemple, si l'on considère que US_CITIES contient un point dans la notation compacte ci-dessus :
select c.city, c.location.sdo_point.x longitude, c.location.sdo_point.y latitude
from us_cities c where state_abrv='CO';
CITY LONGITUDE LATITUDE
------------------------------------------ ---------- ----------
Aurora -104.72977 39.712267
Lakewood -105.11356 39.6952
Denver -104.87266 39.768035
Colorado Springs -104.7599 38.8632
4 rows selected.
Obtenir le même résultat à partir de la notation basée sur un tableau plus complexe que vous utilisez est plus compliqué. Vous pouvez utiliser l'approche SDO_UTIL.GETVERTICES. Par exemple, en supposant que US_CITIES_A contient les mêmes points mais dans la notation basée sur un tableau :
select city, t.x longitude, t.y latitude
from us_cities_a, table (sdo_util.getvertices(location)) t
where state_abrv = 'CO';
CITY LONGITUDE LATITUDE
------------------------------------------ ---------- ----------
Aurora -104.72977 39.712267
Lakewood -105.11356 39.6952
Denver -104.87266 39.768035
Colorado Springs -104.7599 38.8632
4 rows selected.
Une autre approche que je trouve plus simple consiste à définir simplement quelques fonctions simples pour extraire les valeurs du tableau :
create or replace function get_x (g sdo_geometry) return number is
begin
return g.sdo_ordinates(1);
end;
/
et
create or replace function get_y (g sdo_geometry) return number is
begin
return g.sdo_ordinates(2);
end;
/
Ensuite, l'utilisation des fonctions simplifie la syntaxe :
select city, get_x(location) longitude, get_y(location) latitude
from us_cities_a
where state_abrv = 'CO';
CITY LONGITUDE LATITUDE
------------------------------------------ ---------- ----------
Aurora -104.72977 39.712267
Lakewood -105.11356 39.6952
Denver -104.87266 39.768035
Colorado Springs -104.7599 38.8632
4 rows selected.