Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Cara mendapatkan lat dan long dari sdo_geometry di Oracle

Notasi yang Anda tampilkan bukanlah yang terbaik untuk mewakili titik 2D atau 3D tunggal. Cara umum dan paling efisien untuk mengkodekan poin-poin tersebut adalah ini:

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

Semua alat GIS yang saya lihat menggunakan notasi ini. Yang Anda tunjukkan juga valid - hanya menggunakan lebih banyak penyimpanan. Tetapi kedua notasi tersebut secara fungsional setara.

Menggunakan notasi ringkas, mengeluarkan koordinat individu adalah hal yang sepele. Misalnya, mengingat US_CITIES berisi titik dalam notasi ringkas di atas:

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.

Mendapatkan hasil yang sama dari notasi berbasis array yang lebih kompleks yang Anda gunakan lebih berbelit-belit. Anda dapat menggunakan pendekatan SDO_UTIL.GETVERTICES. Misalnya, dengan asumsi US_CITIES_A berisi poin yang sama tetapi dalam notasi berbasis 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.

Pendekatan lain yang menurut saya lebih sederhana adalah dengan mendefinisikan beberapa fungsi sederhana untuk mengekstrak nilai dari array:

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

dan

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

Kemudian menggunakan fungsi membuat sintaks yang lebih sederhana:

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. cara yang efisien untuk menguji apakah ada baris tabel

  2. Menggunakan Oracle JDeveloper 12c dengan Oracle Database, Bagian 1

  3. Utilitas ADODFCMP

  4. Jejak SQL, 10046 acara di Oracle:trcsess, utilitas tkprof

  5. ORA-12728:rentang tidak valid dalam ekspresi reguler