sql >> Database teknologi >  >> RDS >> Oracle

Sådan får du lat og long fra sdo_geometry i oracle

Den notation, du viser, er ikke den bedste til at repræsentere enkelte 2D- eller 3D-punkter. Den almindelige og mest effektive måde at kode disse punkter på er denne:

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

Alle de GIS-værktøjer, jeg har set, bruger denne notation. Den du viser er også gyldig - den bruger bare mere lagerplads. Men de to notationer er fuldt funktionelt ækvivalente.

Ved at bruge den kompakte notation er det trivielt at få de enkelte koordinater frem. For eksempel i betragtning af, at US_CITIES indeholder punkt i den kompakte notation ovenfor:

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.

At få det samme resultat fra den mere komplekse array-baserede notation, du bruger, er mere indviklet. Du kan bruge metoden SDO_UTIL.GETVERTICES. For eksempel, hvis vi antager, at US_CITIES_A indeholder de samme punkter, men i den array-baserede notation:

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.

En anden fremgangsmåde, som jeg faktisk finder enklere, er at definere et par simple funktioner for at udtrække værdierne fra arrayet:

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

og

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

Brug af funktionerne giver en enklere syntaks:

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. Installer MySQL på Ubuntu uden en adgangskodeprompt

  2. java.lang.NoSuchFieldError:NONE i dvale med Spring 3, maven, JPA, c3p0

  3. PHP, MySQL fejl:Kolonneantal stemmer ikke overens med værdiantallet i række 1

  4. Sådan installeres MySQL Workbench på Ubuntu