在多多边形中,我需要计算多边形有多少个环,然后单独提取环和它的坐标
问问题
794 次
3 回答
2
完整:SDO_UTIL.GETNUMELEM()
返回多边形中元素的数量,其中元素被定义为具有所有内环的外环。SDO_UTIL.GETNUMRINGS()
将给出多边形中的环总数(外环和内环)。
例如,考虑一个代表三个岛屿的群岛的形状,每个岛屿都有两个湖泊。这将是一个包含三个元素的多面体,每个元素包含两个孔:GETNUMELEM 将返回 3,GETNUMRINGS 返回 9(3 个外环和 6 个内环)。
所以你需要更清楚你的需要。如果您想将该群岛分成三个独立的岛屿(每个岛屿都有两个内部湖泊),那么您可以按照第一个答案中的建议进行操作。像这样的东西:
create or replace procedure split_geom (geom sdo_geometry)
as
begin
for i in 1..sdo_util.getnumelem(geom) loop
insert into target_table(element_id, geom)
values (i, sdo_util.extract(geom,i));
end loop;
end;
/
另一方面,如果你想将整个形状分割成单独的环(即也分离出空隙),那么试试这个:
create or replace procedure split_geom (geom sdo_geometry)
as
element sdo_geometry;
begin
for i in 1..sdo_util.getnumelem(geom) loop
-- Extract element (with its inner rings)
element := sdo_util.extract(geom,i);
for j in 1..sdo_util.getnumelem(element) loop
-- Extract ring
insert into target_table(element_id, ring_id, geom)
values (i, j, sdo_util.extract(element,1,j));
end loop;
end loop;
end;
/
请注意,当从多边形中提取内环时,它会作为有效的单个元素(单环多边形)返回,其纵坐标重新定向为逆时针方向。
于 2015-08-27T10:53:35.450 回答
0
首先,您需要使用一个函数来获取内部多边形计数。
create or replace
Function GetNumRings( p_geometry in mdsys.sdo_geometry,
p_ring_type in integer default 0 /* 0 = ALL; 1 = OUTER; 2 = INNER */ )
Return Number
Is
v_ring_count number := 0;
v_ring_type number := p_ring_type;
v_elements number;
v_etype pls_integer;
Begin
If ( p_geometry is null ) Then
return 0;
End If;
If ( p_geometry.sdo_elem_info is null ) Then
return 0;
End If;
If ( v_ring_type not in (0,1,2) ) Then
v_ring_type := 0;
End If;
v_elements := ( ( p_geometry.sdo_elem_info.COUNT / 3 ) - 1 );
<<element_extraction>>
for v_i IN 0 .. v_elements LOOP
v_etype := p_geometry.sdo_elem_info(v_i * 3 + 2);
If ( v_etype in (1003,1005,2003,2005) and 0 = v_ring_type )
OR ( v_etype in (1003,1005) and 1 = v_ring_type )
OR ( v_etype in (2003,2005) and 2 = v_ring_type ) Then
v_ring_count := v_ring_count + 1;
end If;
end loop element_extraction;
Return v_ring_count;
End GetNumRings;
参考:Oracle-Spatial 的 GetNumRings 函数
然后,通过这个计数,您将获得内部多边形
FOR i IN 2..countFromFunction
LOOP
begin
insert into target_table(geom)
select SDO_UTIL.EXTRACT(t.geom,1,i) FROM source_table t;
exception when others then
continue;
end;
end loop;
循环从2开始,因为1会得到外环。
希望这可以帮助。
于 2015-08-26T12:36:05.690 回答
0
- 用于
SDO_UTIL.GETNUMELEM
计算多边形或多多边形中元素的数量。 - 用 提取每个元素
SDO_UTIL.EXTRACT
,记住第一个元素将是外部边界。
于 2015-08-26T20:59:00.690 回答