多边形中的 Oracle Spatial-Extracting 单个环

Oracle Spatial-Extracting Individual Rings in a MultiPolygon

在多边形中,我需要计算多边形有多少个环,然后单独提取环及其坐标

首先,您需要使用一个函数来获取内部多边形计数。

    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;

参考:GetNumRings Function for Oracle-Spatial

然后,通过这个计数,您将获得内部多边形

 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会得到外环

希望对您有所帮助。

  1. 使用SDO_UTIL.GETNUMELEM计算多边形或多边形中元素的数量。
  2. 使用 SDO_UTIL.EXTRACT 提取每个元素,请记住第一个元素将是外边界。

要完整:SDO_UTIL.GETNUMELEM() returns 多边形中元素的数量,其中元素定义为具有所有内环的外环。 SDO_UTIL.GETNUMRINGS() 将给出多边形中的环总数(外环和内环)。

例如,考虑一个代表三个岛屿群岛的形状,每个岛屿都有两个湖泊。那将是一个具有 三个元素 的多面体,每个元素包含两个孔:GETNUMELEM 将 return 3,GETNUMRINGS returns 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;
/

请注意,当从多边形中提取内环时,它将return编辑为有效的单个元素、单环多边形,其纵坐标重新定向为逆时针方向。