新手在这里 - 请原谅任何轻罪
我已经完成了一个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;
答案 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.x
和result.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