10

如何从 oracle 中获取经纬度?

像这样:

MDSYS.SDO_GEOMETRY(2001,4326,NULL,
  MDSYS.SDO_ELEM_INFO_ARRAY(1,1,1),
  MDSYS.SDO_ORDINATE_ARRAY(51.702814,32.624736))
4

4 回答 4

21

您显示的符号不是表示单个 2D 或 3D 点的最佳符号。对这些点进行编码的常见且最有效的方法是:

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

我见过的所有 GIS 工具都使用这种表示法。您显示的那个也是有效的 - 它只是使用更多的存储空间。但是这两个符号在功能上是完全等价的。

使用紧凑符号,获取单个坐标是微不足道的。例如,考虑到 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.
于 2015-06-19T08:10:26.143 回答
6

您可以使用 sdo_util.getvertices。文档中的示例

SELECT c.mkt_id, c.name, t.X, t.Y, t.id
   FROM cola_markets c,
   TABLE(SDO_UTIL.GETVERTICES(c.shape)) t
   ORDER BY c.mkt_id, t.id;
于 2015-06-18T09:16:54.517 回答
1

如果您不使用别名,这将不起作用。

于 2016-12-29T15:46:16.533 回答
0

选择 a.id, tx, ty from geometry_table a,table(sdo_util.getvertices(a.geometry_column)) t where a.id = 1;

于 2016-01-15T11:23:44.180 回答