Saltar al contenido

Cómo obtener latitud y longitud de sdo_geometry en Oracle

Luego de investigar en diversos repositorios y páginas webs de internet finalmente encontramos la resolución que te enseñaremos ahora.

Solución:

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 completamente funcionalmente equivalentes.

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 más compleja arrayLa notación basada en que usa es más complicada. Puede utilizar el enfoque SDO_UTIL.GETVERTICES. Por ejemplo, suponiendo que US_CITIES_A contiene los mismos puntos pero en el arraynotación basada en -:

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 del array:

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 hace que la sintaxis sea más simple:

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.

Puede usar sdo_util.getvertices. Ejemplo de la documentación.

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;

Comentarios y valoraciones

Si te animas, tienes la libertad de dejar una noticia acerca de qué te ha gustado de esta reseña.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *