Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak uzyskać szerokość i długość z sdo_geometry w Oracle?

Przedstawiony zapis nie jest najlepszy do przedstawiania pojedynczych punktów 2D lub 3D. Najczęstszym i najskuteczniejszym sposobem kodowania tych punktów jest:

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

Wszystkie narzędzia GIS, które widziałem, używają tego zapisu. Ten, który pokazujesz, jest również ważny — po prostu zajmuje więcej miejsca. Ale te dwie notacje są w pełni funkcjonalnie równoważne.

Używając notacji kompaktowej, uzyskanie poszczególnych współrzędnych jest trywialne. Na przykład, biorąc pod uwagę, że US_CITIES zawiera punkt w zwartej notacji powyżej:

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.

Uzyskanie tego samego wyniku z bardziej złożonej notacji opartej na tablicach, której używasz, jest bardziej zawiłe. Możesz użyć podejścia SDO_UTIL.GETVERTICES. Na przykład zakładając, że US_CITIES_A zawiera te same punkty, ale w notacji tablicowej:

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.

Innym podejściem, które wydaje mi się prostsze, jest po prostu zdefiniowanie kilku prostych funkcji w celu wyodrębnienia wartości z tablicy:

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

i

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

Następnie użycie funkcji upraszcza składnię:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak wywołać procedurę składowaną Oracle, która zawiera typ zdefiniowany przez użytkownika w java?

  2. WSJDBCConnection nie zawija obiektów typu Oracle jdbc Connection

  3. Jak formatować liczby za pomocą znaku minus/plus w Oracle

  4. Zamówienie niestandardowe w Oracle SQL

  5. ORA-01950:brak uprawnień w obszarze tabel „USERS”