Нотацията, която показвате, не е най-добрата за представяне на единични 2D или 3D точки. Често срещаният и най-ефективен начин за кодиране на тези точки е следният:
SDO_GEOMETRY(2001,4326,SDO_POINT_TYPE(51.702814,32.624736,NULL),NULL,NULL)
Всички ГИС инструменти, които съм виждал, използват тази нотация. Този, който показвате, също е валиден - просто използва повече място за съхранение. Но двете обозначения са напълно функционално еквивалентни.
Използвайки компактната нотация, извличането на отделните координати е тривиално. Например, като се има предвид, че US_CITIES съдържа точка в компактната нотация по-горе:
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.
Получаването на същия резултат от по-сложната нотация, базирана на масиви, която използвате, е по-заплетена. Можете да използвате подхода SDO_UTIL.GETVERTICES. Например, ако приемем, че US_CITIES_A съдържа същите точки, но в нотация, базирана на масив:
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.
Друг подход, който всъщност намирам за по-прост, е просто да дефинирам няколко прости функции за извличане на стойностите от масива:
create or replace function get_x (g sdo_geometry) return number is
begin
return g.sdo_ordinates(1);
end;
/
и
create or replace function get_y (g sdo_geometry) return number is
begin
return g.sdo_ordinates(2);
end;
/
След това използването на функциите прави по-опростен синтаксис:
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.