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.