sql >> Databáze >  >> RDS >> Oracle

Jak získat zeměpisnou šířku a délku z sdo_geometry v oracle

Zápis, který ukazujete, není nejlepší pro reprezentaci jednotlivých 2D nebo 3D bodů. Běžný a nejúčinnější způsob kódování těchto bodů je tento:

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

Všechny nástroje GIS, které jsem viděl, používají tento zápis. Ten, který ukazujete, je také platný – jen zabírá více místa. Ale tyto dva zápisy jsou plně funkčně ekvivalentní.

Pomocí kompaktního zápisu je získání jednotlivých souřadnic triviální. Například, vezmeme-li v úvahu, že US_CITIES obsahuje bod v kompaktním zápisu výše:

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.

Získání stejného výsledku ze složitějšího zápisu založeného na poli, který používáte, je spletitější. Můžete použít přístup SDO_UTIL.GETVERTICES. Například za předpokladu, že US_CITIES_A obsahuje stejné body, ale v zápisu založeném na poli:

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.

Jiný přístup, který ve skutečnosti považuji za jednodušší, je pouze definovat několik jednoduchých funkcí pro extrahování hodnot z pole:

create or replace function get_x (g sdo_geometry) return number is
begin
  return g.sdo_ordinates(1);
end;
/

a

create or replace function get_y (g sdo_geometry) return number is
begin
  return g.sdo_ordinates(2);
end;
/

Potom použití funkcí zjednoduší syntaxi:

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. Jak Asind() funguje v PostgreSQL

  2. Úplné šifrování MariaDB v klidu a během přepravy pro maximální ochranu dat – část druhá

  3. Jak zobrazím aktivní připojení k serveru SQL?

  4. Neplatná výchozí hodnota pro 'dateAdded'