sql >> Databasteknik >  >> RDS >> Oracle

Hur man får lat och long från sdo_geometry i oracle

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.


  1. Jämför Amazon RDS Point-in-Time Recovery med ClusterControl

  2. SQL SERVER 2016 – Jämföra exekveringsplaner

  3. Hur man gör en Full Outer Join i MySQL

  4. De bästa sätten att använda SQL DELETE-satsen i en SQL-tabell