Ký hiệu bạn hiển thị không phải là ký hiệu tốt nhất để biểu diễn các điểm 2D hoặc 3D đơn lẻ. Cách phổ biến và hiệu quả nhất để mã hóa những điểm đó là:
SDO_GEOMETRY(2001,4326,SDO_POINT_TYPE(51.702814,32.624736,NULL),NULL,NULL)
Tất cả các công cụ GIS tôi đã thấy đều sử dụng ký hiệu này. Cái bạn hiển thị cũng hợp lệ - nó chỉ sử dụng thêm dung lượng. Nhưng hai ký hiệu hoàn toàn tương đương về chức năng.
Sử dụng ký hiệu nhỏ gọn, việc lấy ra các tọa độ riêng lẻ là việc làm nhỏ. Ví dụ:xem xét US_CITIES chứa điểm trong ký hiệu nhỏ gọn ở trên:
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.
Nhận được cùng một kết quả từ ký hiệu dựa trên mảng phức tạp hơn mà bạn sử dụng phức tạp hơn. Bạn có thể sử dụng phương pháp SDO_UTIL.GETVERTICES. Ví dụ:giả sử US_CITIES_A chứa các điểm giống nhau nhưng ở ký hiệu dựa trên mảng:
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.
Một cách tiếp cận khác mà tôi thực sự thấy đơn giản hơn là chỉ cần xác định một vài hàm đơn giản để trích xuất các giá trị từ mảng:
create or replace function get_x (g sdo_geometry) return number is
begin
return g.sdo_ordinates(1);
end;
/
và
create or replace function get_y (g sdo_geometry) return number is
begin
return g.sdo_ordinates(2);
end;
/
Sau đó, sử dụng các hàm tạo ra cú pháp đơn giản hơn:
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.