_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 (156.11 КБ) 1536 просмотров