0

マルチポリゴンでは、ポリゴンに含まれるリングの数を数え、リングとその座標を個別に抽出する必要があります

4

3 に答える 3

2

完了するには:SDO_UTIL.GETNUMELEM()多角形内の要素の数を返します。要素は、すべての内側のリングを含む外側のリングとして定義されます。SDO_UTIL.GETNUMRINGS()ポリゴン内のリングの総数 (外側と内側のリング) が得られます。

たとえば、3 つの島からなる群島を表す形状を考えてみましょう。各島には 2 つの湖があります。これは3 つの要素を持つ multipolygon で、それぞれに 2 つの穴が含まれます。GETNUMELEM は 3 を返し、GETNUMRINGS は 9 (外側のリング 3 つと内側のリング 6 つ) を返します。

そのため、ニーズをより明確にする必要があります。その群島を 3 つの独立した島 (それぞれに 2 つの内部湖がある) に分割したい場合は、最初の回答で提案されているように行うことができます。このようなもの:

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
  1. SDO_UTIL.GETNUMELEMポリゴンまたはマルチポリゴンの要素数を計算するために使用します。
  2. で各要素を抽出SDO_UTIL.EXTRACTします。最初の要素は外側の境界になることに注意してください。
于 2015-08-26T20:59:00.690 に答える
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 に答える