Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como obter lat e long de sdo_geometry no oracle


A notação que você mostra não é a melhor para representar pontos 2D ou 3D únicos. A maneira comum e mais eficiente de codificar esses pontos é esta:
SDO_GEOMETRY(2001,4326,SDO_POINT_TYPE(51.702814,32.624736,NULL),NULL,NULL)

Todas as ferramentas GIS que eu vi usam essa notação. O que você mostra também é válido - apenas usa mais armazenamento. Mas as duas notações são totalmente equivalentes funcionalmente.

Usando a notação compacta, obter as coordenadas individuais é trivial. Por exemplo, considerando que US_CITIES contém ponto na notação compacta acima:
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.

Obter o mesmo resultado da notação baseada em array mais complexa que você usa é mais complicado. Você pode usar a abordagem SDO_UTIL.GETVERTICES. Por exemplo, supondo que US_CITIES_A contenha os mesmos pontos, mas na notação baseada em array:
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.

Outra abordagem que acho mais simples é apenas definir algumas funções simples para extrair os valores da matriz:
create or replace function get_x (g sdo_geometry) return number is
begin
  return g.sdo_ordinates(1);
end;
/

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

Em seguida, usar as funções torna a sintaxe mais simples:
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.