Oracle
 sql >> база данни >  >> RDS >> Oracle

Как да получите lat и long от sdo_geometry в oracle

Нотацията, която показвате, не е най-добрата за представяне на единични 2D или 3D точки. Често срещаният и най-ефективен начин за кодиране на тези точки е следният:

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

Всички ГИС инструменти, които съм виждал, използват тази нотация. Този, който показвате, също е валиден - просто използва повече място за съхранение. Но двете обозначения са напълно функционално еквивалентни.

Използвайки компактната нотация, извличането на отделните координати е тривиално. Например, като се има предвид, че US_CITIES съдържа точка в компактната нотация по-горе:

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.

Получаването на същия резултат от по-сложната нотация, базирана на масиви, която използвате, е по-заплетена. Можете да използвате подхода SDO_UTIL.GETVERTICES. Например, ако приемем, че US_CITIES_A съдържа същите точки, но в нотация, базирана на масив:

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.

Друг подход, който всъщност намирам за по-прост, е просто да дефинирам няколко прости функции за извличане на стойностите от масива:

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

и

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

След това използването на функциите прави по-опростен синтаксис:

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. Текстът на Oracle се екранира с къдрави скоби и заместващи знаци

  2. Как да създадете PL/SQL съхранени процедури с параметри в базата данни на Oracle

  3. Какво и кога трябва да посоча setFetchSize()?

  4. 4 начина за намиране на редове, които съдържат главни букви в Oracle

  5. Oracle вмъкнете в table2, след което изтрийте от table1, изключение, ако не успеете