Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie man Lat und Long von sdo_geometry in Oracle erhält

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.