Закрытие отверстий в мультиполигоне

Вопросы по свободной ГИС QGIS. Сообщения об ошибках, предложения по улучшению, локализация.
gamm
Гуру
Сообщения: 4127
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1096
Ваше звание: программист
Откуда: Казань

Re: Закрытие отверстий в мультиполигоне

Сообщение gamm » 29 ноя 2024, 16:04

посмотрю.

Но по хорошему, все это надо делать на растре, либо запустив генерализацию (лучше MRF, поскольку классификатор выдает обычно вероятности классов), либо морфологией типа erosion/delution, либо отсукая мелочь на этапе векторизации. Иначе все это классическая отечественная забава - борьба с искуственно созданнми трудностями :-)

_taras_
Активный участник
Сообщения: 216
Зарегистрирован: 28 июл 2018, 08:40
Репутация: 16
Откуда: Киев

Re: Закрытие отверстий в мультиполигоне

Сообщение _taras_ » 29 ноя 2024, 16:28

gamm писал(а):
29 ноя 2024, 16:04
посмотрю.
Но по хорошему, все это надо делать на растре...
Вот только собрался об этом писать, что командой растеризация с нужным для меня разрешением, мелочевка убралась...
gamm писал(а):
29 ноя 2024, 16:04
либо запустив генерализацию (лучше MRF, поскольку классификатор выдает обычно вероятности классов), либо морфологией типа erosion/delution, либо отсукая мелочь на этапе векторизации. Иначе все это классическая отечественная забава - борьба с искуственно созданнми трудностями :-)
Какой командой в сделать генеализацию вектора? Кроме как упростить геометрию ничего не увидел.

gamm
Гуру
Сообщения: 4127
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1096
Ваше звание: программист
Откуда: Казань

Re: Закрытие отверстий в мультиполигоне

Сообщение gamm » 29 ноя 2024, 18:04

_taras_ писал(а):
29 ноя 2024, 16:28
Какой командой в сделать генеализацию вектора? Кроме как упростить геометрию ничего не увидел.
не вектора, а растра. С вектором слишком много проблем

программку сделал, но сохранять пришлось через одно место - после замены S4 слота объект рисуется, но не сохраняется, R вылетает без сообщений, что-то внутри. Но в sf преобразуется нормально, и сохраняеться. Порог площади - конcтанта в начале скрипта.

Код: Выделить всё

library(rgdal)
library(raster)
library(sf)

tmp.dir = "c:/temp"

fn = sprintf("%s/class_-1.shp",tmp.dir)
v = readOGR(fn)
v.src=v

min_area = 1000

area_list = c()
first=TRUE
for(i.obj in 1:nrow(v)) {
  v1 = v[i.obj,]
  polygons.list = v1@polygons
  for(i.poly in 1:length(polygons.list)) {
    cur.poly = polygons.list[[i.poly]]
    ring.list = cur.poly@Polygons
    new.ring.pos = c()
    for(i.ring in 1:length(ring.list)) {
      cur.ring = ring.list[[i.ring]]
      if(cur.ring@hole) area_list = c(area_list,cur.ring@area)
      if(!cur.ring@hole || cur.ring@area > min_area) {
        new.ring.pos = c(new.ring.pos,i.ring)
      } else {
        # print(c(i.obj,i.poly,i.ring))
      }
    }
    v1@polygons[[i.poly]]@Polygons = ring.list[new.ring.pos]
    v1@polygons[[i.poly]]@plotOrder = 1:length(new.ring.pos)
  }
  v2 = foo=new("SpatialPolygonsDataFrame",data=v1@data,polygons=v1@polygons,plotOrder=v1@plotOrder,bbox=v1@bbox,proj4string=v1@proj4string)
  if(first) {
    first = FALSE
    v.new = v2
  } else {
    v.new = rbind(v.new,v2)
  }
}

fn1 = sprintf("%s/class_-1_filtered.shp",tmp.dir)
foo=st_as_sf(v.new)
st_write(foo, fn1, "test",delete_dsn=TRUE)

foo.jpg
foo.jpg (156.11 КБ) 283 просмотра

gamm
Гуру
Сообщения: 4127
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1096
Ваше звание: программист
Откуда: Казань

Re: Закрытие отверстий в мультиполигоне

Сообщение gamm » 02 дек 2024, 07:57

кстати, я так понимаю, что в мелких дырках сидели контура других классов. Поэтому удалять нужно не только мелкие дырки, но и мелкие контура во всех слоях. Как я и говорил, с этим вектором сплошной геморрой, лучше на растре :mrgreen:

Ответить

Вернуться в «QGIS»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя