sql >> Base de Datos >  >> RDS >> Oracle

Cómo obtener latitud y longitud de sdo_geometry en Oracle

La notación que muestra no es la mejor para representar puntos únicos en 2D o 3D. La forma común y más eficiente de codificar esos puntos es esta:

SDO_GEOMETRY(2001,4326,SDO_POINT_TYPE(51.702814,32.624736,NULL),NULL,NULL)

Todas las herramientas GIS que he visto usan esta notación. El que muestra también es válido, solo usa más almacenamiento. Pero las dos notaciones son totalmente equivalentes funcionalmente.

Usando la notación compacta, obtener las coordenadas individuales es trivial. Por ejemplo, considerando que US_CITIES contiene un punto en la notación compacta anterior:

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.

Obtener el mismo resultado de la notación más compleja basada en matrices que utiliza es más complicado. Puede utilizar el enfoque SDO_UTIL.GETVERTICES. Por ejemplo, suponiendo que US_CITIES_A contiene los mismos puntos pero en la notación basada en matrices:

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.

Otro enfoque que realmente encuentro más simple es simplemente definir un par de funciones simples para extraer los valores de la matriz:

create or replace function get_x (g sdo_geometry) return number is
begin
  return g.sdo_ordinates(1);
end;
/

y

create or replace function get_y (g sdo_geometry) return number is
begin
  return g.sdo_ordinates(2);
end;
/

Luego, usar las funciones simplifica la sintaxis:

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.