wake-up-neo.net

wie bekomme ich lat und long von sdo_geometry in oracle

wie kann ich von Punkt zu Punkt im Orakel lat und long werden?

So was:

MDSYS.SDO_GEOMETRY(2001,4326,NULL,
  MDSYS.SDO_ELEM_INFO_ARRAY(1,1,1),
  MDSYS.SDO_ORDINATE_ARRAY(51.702814,32.624736))
5

Die von Ihnen angezeigte Notation ist nicht die beste für die Darstellung einzelner 2D- oder 3D-Punkte. Die gebräuchlichste und effizienteste Art, diese Punkte zu kodieren, ist folgende:

SDO_GEOMETRY(2001,4326,SDO_POINT_TYPE(51.702814,32.624736,NULL),NULL,NULL)

Alle GIS-Tools, die ich gesehen habe, verwenden diese Notation. Das, was Sie anzeigen, ist auch gültig - es verbraucht nur mehr Speicherplatz. Die beiden Bezeichnungen sind jedoch funktional völlig gleichwertig.

Mit der kompakten Notation ist es trivial, die einzelnen Koordinaten herauszufinden. Angenommen, US_CITIES enthält einen Punkt in der obigen kompakten Notation:

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 mit der komplexeren Array-basierten Notation zu erzielen, ist komplizierter. Sie können den Ansatz SDO_UTIL.GETVERTICES 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;
/

Die Verwendung der Funktionen vereinfacht dann die 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.
14
Albert Godfrind

Sie können sdo_util.getvertices verwenden. Beispiel aus der Dokumentation

SELECT c.mkt_id, c.name, t.X, t.Y, t.id
   FROM cola_markets c,
   TABLE(SDO_UTIL.GETVERTICES(c.shape)) t
   ORDER BY c.mkt_id, t.id;
5
Rene

Dies funktioniert nicht, wenn Sie keine Aliase verwenden.

0
carlosaar22

wählen Sie a.id, t.x, t.y aus Geometrietabelle a, Tabelle (sdo_util.getvertices (a.geometry_column)) t wobei a.id = 1;

0
Parmanand