Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment obtenir lat et long de sdo_geometry dans oracle

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.