Растворить перекрывающиеся полигоны, используя разность и объединение в R - PullRequest
0 голосов
/ 03 апреля 2019

Имеет файл формы, который имеет несколько полигонов с логическим разделением зон и графиков.Участки перекрывают зоны.Задача состоит в том, чтобы растворить / объединить участки с зонами без наложения.

enter image description here Вот spplot файла формы.Здесь участки находятся над полевыми зонами.Также здесь есть шейп-файл с перекрывающимися полигонами (зоны и участки): Шейп-файл

В QGIS то же самое было достигнуто с помощью Извлечения зон и участков, Нахождения разницы и последующего растворения с помощью объединения. Теперь нужно запрограммировать то же самое в R.

Пробовал описанные ниже шаги в R, но не смог бы получить правильные результаты, ища способы, как растворить этот тип перекрывающихся плейгонов в R:

library(sp);
library(raster);
library(rgeos)

#Importing the shape files

field_boundary_fp <- "Database/gadenstedt2_outer_field 3 -26_0_zoned-plotm.shp"
poly_map_proj_str <- "+proj=longlat +datum=WGS84 +no_defs";
utm_target_proj   <- "+init=epsg:32632";

field_boundary_sdf <- maptools::readShapePoly(fn = field_boundary_fp,
                                          proj4string =  CRS(poly_map_proj_str),
                                          repair = T,
                                          delete_null_obj = T,
                                          verbose = T);
spplot(
field_boundary_sdf,"Rx"
)

# Extracting the Zones and Plots#

Zone_sdf <- field_boundary_sdf[field_boundary_sdf@data$Type == "Zone", ]
Plot_sdf <- field_boundary_sdf[field_boundary_sdf@data$Type == "Plot", ]
plot(Plot_sdf)
plot(Zone_sdf)

#Finding the Intersection Part between the both
test <- gIntersection(Zone_sdf, Plot_sdf,id="ZoneIdx")
plot(test)
plot(test, add = T, col = 'blue')

# Finding the difference

test2 <- gDifference(Zone_sdf,Plot_sdf,id="ZoneIdx")
plot(test2)
plot(test2, add = T, col = 'red')

#Trying for Union then
polygon3 <- gUnion(test2, Plot_sdf,id="ZoneIdx")
plot(polygon3)
plot(polygon3, add = T, col = 'yellow')

Ответы [ 2 ]

1 голос
/ 03 апреля 2019

Считать шейп-файл

library(raster)
fields <- shapefile("gadenstedt2_outer_field 3 -26_0_zoned-plotm.shp")

Сначала разделите зоны и поля.

zone <- fields[fields$Type == "Zone", ]
plot <- fields[fields$Type == "Plot", ]

Стереть участок из зоны

d <- erase(zone, plot)  

Затем добавьте plot к d

r <- bind(plot, d)

А теперь совокупность

rd <- aggregate(r, "Rx")
spplot(rd, "Rx")

---- Теперь с воспроизводимым примером, так что другие также могут извлечь выгоду; Вы не должны задавать вопросы, которые зависят от файла, который нужно загрузить ----

Пример данных (два объекта SpatialPolygonDataFrame)

library(raster)
p <- shapefile(system.file("external/lux.shp", package="raster"))
p <- aggregate(p, "NAME_1")
p$zone <- 10 + (1:length(p))
r <- raster(ncol=2, nrow=2, vals=1:4, ext=extent(6, 6.4, 49.75, 50), crs=crs(p))
names(r) <- "zone"
b <- as(r, 'SpatialPolygonsDataFrame')

стереть и добавить

e <- erase(p, b)
pb <- bind(e, b)

data.frame(pb)
#        NAME_1 zone
#1     Diekirch   11
#2 Grevenmacher   12
#3   Luxembourg   13
#4         <NA>    1
#5         <NA>    2
#6         <NA>    3
#7         <NA>    4
0 голосов
/ 20 мая 2019

Чтобы решение работало на всех полях, к вышеуказанному решению добавлена ​​дополнительная строка кода для добавления геометрии буфера.

fields <- gBuffer(fields, byid=TRUE, width=0) # Expands the given geometry to include 
the area within the specified width 

zone <- fields[fields$Type == "Zone", ]
plot <- fields[fields$Type == "Plot", ]

d <- erase(zone, plot)
spplot(d, "Rx")

r <- bind(plot, d)

rd <- aggregate(r, "Rx")

spplot(rd, "Rx")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...