Przedstawiony zapis nie jest najlepszy do przedstawiania pojedynczych punktów 2D lub 3D. Najczęstszym i najskuteczniejszym sposobem kodowania tych punktów jest:
SDO_GEOMETRY(2001,4326,SDO_POINT_TYPE(51.702814,32.624736,NULL),NULL,NULL)
Wszystkie narzędzia GIS, które widziałem, używają tego zapisu. Ten, który pokazujesz, jest również ważny — po prostu zajmuje więcej miejsca. Ale te dwie notacje są w pełni funkcjonalnie równoważne.
Używając notacji kompaktowej, uzyskanie poszczególnych współrzędnych jest trywialne. Na przykład, biorąc pod uwagę, że US_CITIES zawiera punkt w zwartej notacji powyżej:
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.
Uzyskanie tego samego wyniku z bardziej złożonej notacji opartej na tablicach, której używasz, jest bardziej zawiłe. Możesz użyć podejścia SDO_UTIL.GETVERTICES. Na przykład zakładając, że US_CITIES_A zawiera te same punkty, ale w notacji tablicowej:
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.
Innym podejściem, które wydaje mi się prostsze, jest po prostu zdefiniowanie kilku prostych funkcji w celu wyodrębnienia wartości z tablicy:
create or replace function get_x (g sdo_geometry) return number is
begin
return g.sdo_ordinates(1);
end;
/
i
create or replace function get_y (g sdo_geometry) return number is
begin
return g.sdo_ordinates(2);
end;
/
Następnie użycie funkcji upraszcza składnię:
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.