sql >> Database >  >> RDS >> Oracle

Hoe lat en lang te krijgen van sdo_geometry in oracle

De notatie die u laat zien, is niet de beste voor het weergeven van afzonderlijke 2D- of 3D-punten. De gebruikelijke en meest efficiënte manier om die punten te coderen is deze:

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

Alle GIS-tools die ik heb gezien gebruiken deze notatie. Degene die je laat zien is ook geldig - het gebruikt alleen meer opslagruimte. Maar de twee notaties zijn functioneel volledig equivalent.

Met behulp van de compacte notatie is het triviaal om de individuele coördinaten eruit te halen. Als u bijvoorbeeld bedenkt dat US_CITIES punt bevat in de compacte notatie hierboven:

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.

Het verkrijgen van hetzelfde resultaat met de complexere op arrays gebaseerde notatie die u gebruikt, is ingewikkelder. U kunt de SDO_UTIL.GETVERTICES-aanpak gebruiken. Bijvoorbeeld, aannemende dat US_CITIES_A dezelfde punten bevat, maar in de array-gebaseerde notatie:

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.

Een andere benadering die ik eigenlijk eenvoudiger vind, is om gewoon een paar eenvoudige functies te definiëren om de waarden uit de array te extraheren:

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

en

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

Dan zorgt het gebruik van de functies voor een eenvoudigere syntaxis:

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. Geaggregeerde functie in MySQL - lijst (zoals LISTAGG in Oracle)

  2. Hoe de sortering van database, tabel, kolom wijzigen?

  3. Oracle-datum

  4. CURRENT_TIMESTAMP in milliseconden