remove_duplicate_vertices в Oracle Пространственно преобразованные типы полигонов / мультиполигонов в коллекции. Как преобразовать их обратно в мультиполигоны? - PullRequest
0 голосов
/ 10 апреля 2020

Я запустил REMOVE_DUPLICATE_VERTICES для пространственной таблицы, которая содержала полигоны и мультиполигоны, теперь есть 6 геометрий, помеченных как Collection (2004). Как я могу безопасно изменить их обратно на мультиполигоны?

Пример одного (с укороченным массивом coodinate)

MDSYS.SDO_GEOMETRY (2004,8307, NULL, MDSYS.SDO_ELEM_INFO_ARRAY (1,2,1,5,1003,1,13,1003) , 1,21,1003,1,279,2003,1,581,2003,1,961,2003,1,1551,2003,1,2073,2003,1,2215,2003,1,2277,2003,1,2349,2003,1 , 2379,2003,1,2671,2003,1,2847,2003,1,3033,2003,1,3145,2003,1,3263,2003,1,3271,2003,1,3403,2003,1), MDSYS.SDO_ORDINATE_ARRAY (-89,60549292, -1,30359069399998, ..., - 89,6571104179999, -0,900517332999925))

1 Ответ

1 голос
/ 11 апреля 2020

Один из способов сделать это:

declare wgeom mdsys.sdo_geometry; outgeom mdsys.sdo_geometry; 
begin
for i in 1 .. nvl(sdo_util.getNumElem(ingeom)  ,0) 
loop
  wgeom := sdo_util.extract(ingeom, i, 0);  

  if wgeom.get_gtype() in (3,7) then  
  outgeom := sdo_util.append(outgeom, wgeom);          
  end if;

end loop;

Он проходит по элементам геометрии и для каждого полигона добавляет его к переменной геометрии. Вы можете поместить его в функцию, которую вы «кормите» своей геометрией (которая должна быть действительной геометрией), и она выводит фильтрованную outgeom.
. Я использую этот подход, потому что легко поместить logi c в l oop для фильтрации, например, элементов под определенной областью и т. д. c. Я использую в производстве миллионы геометрий.
Если вам нужна дополнительная помощь, дайте мне знать.

...