Die von Ihnen gezeigte Notation ist nicht die beste, um einzelne 2D- oder 3D-Punkte darzustellen. Der übliche und effizienteste Weg, diese Punkte zu codieren, ist folgender:
SDO_GEOMETRY(2001,4326,SDO_POINT_TYPE(51.702814,32.624736,NULL),NULL,NULL)
Alle GIS-Tools, die ich gesehen habe, verwenden diese Notation. Die von Ihnen angezeigte ist auch gültig - sie verbraucht nur mehr Speicherplatz. Aber die beiden Notationen sind funktional völlig gleichwertig.
Mit der kompakten Schreibweise ist es trivial, die einzelnen Koordinaten herauszubekommen. Wenn man zum Beispiel bedenkt, dass US_CITIES Punkt in der kompakten Notation oben enthält:
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.
Dasselbe Ergebnis aus der komplexeren Array-basierten Notation zu erhalten, die Sie verwenden, ist komplizierter. Sie können den SDO_UTIL.GETVERTICES-Ansatz verwenden. Angenommen, US_CITIES_A enthält dieselben Punkte, jedoch in der Array-basierten Notation:
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.
Ein anderer Ansatz, den ich tatsächlich einfacher finde, besteht darin, nur ein paar einfache Funktionen zu definieren, um die Werte aus dem Array zu extrahieren:
create or replace function get_x (g sdo_geometry) return number is
begin
return g.sdo_ordinates(1);
end;
/
und
create or replace function get_y (g sdo_geometry) return number is
begin
return g.sdo_ordinates(2);
end;
/
Dann sorgt die Verwendung der Funktionen für eine einfachere 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.