web-dev-qa-db-fra.com

comment obtenir lat et long de sdo_geometry dans Oracle

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))
5
Banafshe Alipour

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.
14
Albert Godfrind

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;
5
Rene

Cela ne fonctionnera pas si vous n'utilisez pas d'alias.

0
carlosaar22

sélectionnez a.id, t.x, t.y dans geometry_table a, table (sdo_util.getvertices (a.geometry_column)) t où a.id = 1;

0
Parmanand