Notationen du visar är inte den bästa för att representera enstaka 2D- eller 3D-punkter. Det vanligaste och mest effektiva sättet att koda dessa punkter är detta:
SDO_GEOMETRY(2001,4326,SDO_POINT_TYPE(51.702814,32.624736,NULL),NULL,NULL)
Alla GIS-verktyg jag har sett använder denna notation. Den du visar är också giltig - den använder bara mer lagringsutrymme. Men de två beteckningarna är helt funktionellt likvärdiga.
Med den kompakta notationen är det trivialt att få fram de individuella koordinaterna. Till exempel, med tanke på att US_CITIES innehåller punkt i den kompakta notationen ovan:
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.
Att få samma resultat från den mer komplexa array-baserade notationen du använder är mer invecklat. Du kan använda metoden SDO_UTIL.GETVERTICES. Om du till exempel antar att US_CITIES_A innehåller samma punkter men i den arraybaserade notationen:
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.
En annan metod som jag faktiskt tycker är enklare är att bara definiera ett par enkla funktioner för att extrahera värdena från arrayen:
create or replace function get_x (g sdo_geometry) return number is
begin
return g.sdo_ordinates(1);
end;
/
och
create or replace function get_y (g sdo_geometry) return number is
begin
return g.sdo_ordinates(2);
end;
/
Att sedan använda funktionerna ger en enklare syntax:
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.