Oracle Spatial。从区域质心

时间:2018-03-12 12:11:41

标签: sql oracle gis

新手在这里 - 请原谅任何轻罪

我已经完成了一个sql脚本来获取Projected坐标( M P )以及地理坐标( LONG 和来自 AETA 的(区域)质心的 LAT ,以及来自视图 VAETA <的另一个属性( CONCELHO ) /强>

基本几何图形位于表格(AETA)中。该表由2个属性[IPID,GEOMETRY]组成,包含区域类型几何。 视图(VAETA)与表AETA相关 - 它们共享IPID属性。

这是脚本:

SELECT A.ipid, (SDO_GEOM.SDO_CENTROID(SDO_GEOM.SDO_ARC_DENSIFY(A.GEOMETRY, m.diminfo, 'arc_tolerance=0.05'),1).sdo_point.x) as M, SDO_GEOM.SDO_CENTROID(SDO_GEOM.SDO_ARC_DENSIFY(A.GEOMETRY, m.diminfo, 'arc_tolerance=0.05'),1).sdo_point.y) as P, A.CONCELHO, TRANSFORM_LONG_LAT_PT((SDO_GEOM.SDO_CENTROID(SDO_GEOM.SDO_ARC_DENSIFY(A.GEOMETRY, m.diminfo, 'arc_tolerance=0.05'),1).sdo_point.x), SDO_GEOM.SDO_CENTROID(SDO_GEOM.SDO_ARC_DENSIFY(A.GEOMETRY, m.diminfo, 'arc_tolerance=0.05'),1).sdo_point.y)) AS T FROM VAETA A, user_sdo_geom_metadata m WHERE m.table_name = 'AETA' AND m.column_name = 'GEOMETRY';

这是我从我的sql脚本得到的结果:

IPID || M || P || CONCELHO || Ť

50040615 || 58243.8292298382 || -95032.5884906886 ||博尔巴|| MDSYS.SDO_GEOMETRY(2001,4326,MDSYS.SDO_POINT_TYPE(-7.46254163019826,38.8103393988376,NULL),NULL,NULL)

50041533 || 46178.4608566094 || -125300.367916971 ||雷东多|| MDSYS.SDO_GEOMETRY(2001,4326,MDSYS.SDO_POINT_TYPE(-7.6034580874097,38.5384058748327,NULL),NULL,NULL)

...... ...... ...... ......

我的问题是从几何对象(列T)获取经度和纬度,这样我就会得到一个这样的表:

IPID || M || P || CONCELHO ||长|| LAT

50040615 || 58243.8292298382 || -95032.5884906886 ||博尔巴|| -7.46254163019826 || 38.8103393988376

50041533 || 46178.4608566094 || -125300.367916971 ||雷东多|| -7.6034580874097 || 38.5384058748327

...... ...... ...... ......

任何人都知道如何在同一个sql脚本中一次性

我对它的语法细节有点迷失... 我已经尝试了好几次,并且一直遇到我无法解决的错误。

提前致谢,

祝你好运, 佩德罗

注意:我正在使用一个函数(transform_long_lat_pt)将坐标从SRID 3763 [ETRS89 / Portugal TM06]转换为4326 [WGS 84]。我已经尝试了这个功能,结果还可以。

M和P预测坐标位于SRID 3763 [ETRS89 / Portugal TM06]

LONG和LAT地理坐标应位于SRID 4326 [WGS 84]

Funtion transform_long_lat_pt

create or replace function transform_long_lat_pt(longitude in number, 
                                           latitude in number)
return SDO_GEOMETRY deterministic is
begin
     return sdo_cs.transform(sdo_geometry(2001, 3763, 
                sdo_point_type(longitude, latitude, NULL),NULL, NULL),4326);
end;

2 个答案:

答案 0 :(得分:0)

SDO_UTIL包有一个名为SDO_UTIL.GETVERTICES的函数,它返回输入几何体顶点的坐标。

如果你这样修改你的funtcion:

create or replace function transform_long_lat_pt(longitude in number, 
                                           latitude in number)
return VERTEX_SET_TYPE deterministic is
begin
     return SDO_UTIL.GETVERTICES(sdo_cs.transform(sdo_geometry(2001, 3763, 
                sdo_point_type(longitude, latitude, NULL),NULL, NULL),4326));
end;

只需执行result.xresult.y

即可获得纬度和经度

请参阅此处的文档:https://docs.oracle.com/cd/B28359_01/appdev.111/b28400/sdo_util.htm#SPATL1237

答案 1 :(得分:0)

你可以直接在sql查询中而不是在函数内部sdo_cs.transform。这是查询的简化版本。这得到一个县的质心(在球形墨卡托中)和Lang / Lat(在4326中)为同一点,并返回每个的X和Y.

select county, r.centroid.sdo_point.x, r.centroid.sdo_point.y, state, 
r.cent4326.sdo_point.x Longitude, r.cent4326.sdo_point.y Latitude from 
(select county, sdo_geom.sdo_centroid(geom, 0.05) centroid, state, 
sdo_cs.transform(sdo_geom.sdo_centroid(geom, 0.05), 4326) cent4326 
from counties_spmerc where rownum < 2) r ;

COUNTY CENTROID.SDO_POINT.X CENTROID.SDO_POINT.Y

国家长期待遇

城镇-9321593.3 4152521.68 格鲁吉亚-83.7372973 34.9163679

以上是在12.1实例上完成的,而sdo_centroid不需要昏暗的信息。

除非您的区域几何包含圆弧,否则您不需要arc_densify调用。

因此省略sdo_arc_densify(以及假设它是11g或更高的数据库的昏暗信息),您的查询可以写成

SELECT IPID, v.centriod.sdo_point.x as M, 
v.centriod.sdo_point.y as P, CONCHELO, 
v.centriod_4326.sdo_point.x as Longitude, 
v.centriod_4326.sdo_point.y as Latitude FROM
(SELECT A.ipid, 
SDO_GEOM.SDO_CENTROID(A.GEOMETRY, 0.05) as centroid, 
A.CONCELHO, 
SDO_CS.TRANSFORM(SDO_GEOM.SDO_CENTROID(A.GEOMETRY, 0.05), 4326) 
as centriod_4326, 
FROM VAETA A) V