посмотрю.
Но по хорошему, все это надо делать на растре, либо запустив генерализацию (лучше MRF, поскольку классификатор выдает обычно вероятности классов), либо морфологией типа erosion/delution, либо отсукая мелочь на этапе векторизации. Иначе все это классическая отечественная забава - борьба с искуственно созданнми трудностями
Закрытие отверстий в мультиполигоне
-
- Гуру
- Сообщения: 4127
- Зарегистрирован: 15 окт 2010, 08:33
- Репутация: 1096
- Ваше звание: программист
- Откуда: Казань
-
- Активный участник
- Сообщения: 216
- Зарегистрирован: 28 июл 2018, 08:40
- Репутация: 16
- Откуда: Киев
Re: Закрытие отверстий в мультиполигоне
Вот только собрался об этом писать, что командой растеризация с нужным для меня разрешением, мелочевка убралась...
Какой командой в сделать генеализацию вектора? Кроме как упростить геометрию ничего не увидел.gamm писал(а): ↑29 ноя 2024, 16:04либо запустив генерализацию (лучше MRF, поскольку классификатор выдает обычно вероятности классов), либо морфологией типа erosion/delution, либо отсукая мелочь на этапе векторизации. Иначе все это классическая отечественная забава - борьба с искуственно созданнми трудностями
-
- Гуру
- Сообщения: 4127
- Зарегистрирован: 15 окт 2010, 08:33
- Репутация: 1096
- Ваше звание: программист
- Откуда: Казань
Re: Закрытие отверстий в мультиполигоне
не вектора, а растра. С вектором слишком много проблем
программку сделал, но сохранять пришлось через одно место - после замены 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)
-
- Гуру
- Сообщения: 4127
- Зарегистрирован: 15 окт 2010, 08:33
- Репутация: 1096
- Ваше звание: программист
- Откуда: Казань
Re: Закрытие отверстий в мультиполигоне
кстати, я так понимаю, что в мелких дырках сидели контура других классов. Поэтому удалять нужно не только мелкие дырки, но и мелкие контура во всех слоях. Как я и говорил, с этим вектором сплошной геморрой, лучше на растре
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя