comment puis-je obtenir lat et long point de l'oracle?
Comme ça:
MDSYS.SDO_GEOMETRY(2001,4326,NULL,
MDSYS.SDO_ELEM_INFO_ARRAY(1,1,1),
MDSYS.SDO_ORDINATE_ARRAY(51.702814,32.624736))
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 de coder 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 pleinement équivalentes sur le plan fonctionnel.
En utilisant la notation compacte, obtenir les coordonnées individuelles est trivial. Par exemple, considérant 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 plus complexe basée sur des tableaux que vous utilisez est plus compliqué. Vous pouvez utiliser l'approche SDO_UTIL.GETVERTICES. Par exemple, supposons que US_CITIES_A contienne 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 réellement plus simple consiste à définir 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.
Vous pouvez utiliser sdo_util.getvertices. Exemple tiré de documentation
SELECT c.mkt_id, c.name, t.X, t.Y, t.id
FROM cola_markets c,
TABLE(SDO_UTIL.GETVERTICES(c.shape)) t
ORDER BY c.mkt_id, t.id;
Cela ne fonctionnera pas si vous n'utilisez pas d'alias.
sélectionnez a.id, t.x, t.y dans geometry_table a, table (sdo_util.getvertices (a.geometry_column)) t où a.id = 1;