2016-01-25 2 views
1

Мне нужно создать выпуклый корпус для 4-х многоугольников с файлом шейп-файла. Я не создаю с помощью объекта SpatialPolygonsDataFrame, но я хочу использовать объект шейп-файла, это возможно?Создайте выпуклый корпус для шейп-файла

Мой код:

#Packages 

require(rgdal) 
require(maptools) 

#------------------------------------------------------------------------------- 
#Create 4 polygons 

sr <- SpatialPolygons(list(
Polygons(list(Polygon(cbind(c(180114, 180553, 181127, 181477, 181294, 181007, 180409, 
    180162, 180114), c(332349, 332057, 332342, 333250, 333558, 333676, 
    332618, 332413, 332349)))),'1'), 
Polygons(list(Polygon(cbind(c(180042, 180545, 180553, 180314, 179955, 179142, 179437, 
    179524, 179979, 180042), c(332373, 332026, 331426, 330889, 330683, 
    331133, 331623, 332152, 332357, 332373)))),'2'), 
Polygons(list(Polygon(cbind(c(179110, 179907, 180433, 180712, 180752, 180329, 179875, 
    179668, 179572, 179269, 178879, 178600, 178544, 179046, 179110), 
    c(331086, 330620, 330494, 330265, 330075, 330233, 330336, 330004, 
    329783, 329665, 329720, 329933, 330478, 331062, 331086)))),'3'), 
Polygons(list(Polygon(cbind(c(180304, 180403,179632,179420,180304), 
    c(332791, 333204, 333635, 333058, 332791)))),'4'))) 
plot(sr) 

#Convert in polygon spatial 

srdf=SpatialPolygonsDataFrame(sr, data.frame(row.names=c('1','2','3','4'), PIDS=1:4)) 
[email protected] 

#Create shapefile 

writeOGR(srdf, getwd(), 'POLY', 'ESRI Shapefile') 

#Read shapefile 

contorno_line_X <- readShapeLines ("POLY.shp") 


#Plot 

plot(contorno_line_X) 

#Try to create a convex hull 

df.data = as.data.frame(contorno_line_X) 
ch <- chull(df.data) 
lines(ch, col="red") ## Doesn't work 

ответ

0

chull возвращает индексы (номера строк) точек, образующих выпуклую оболочку, поэтому черчения значение вашей переменной ch ваша проблема. Попробуйте построить lines(df.data[ch,], col="red").

1

Здесь подход:

library(dismo) 
library(rgdal) 

sr <- SpatialPolygons(list(
Polygons(list(Polygon(cbind(c(180114, 180553, 181127, 181477, 181294, 181007, 180409, 180162, 180114), c(332349, 332057, 332342, 333250, 333558, 333676, 332618, 332413, 332349)))),'1'), Polygons(list(Polygon(cbind(c(180042, 180545, 180553, 180314, 179955, 179142, 179437, 179524, 179979, 180042), c(332373, 332026, 331426, 330889, 330683, 331133, 331623, 332152, 332357, 332373)))),'2'), Polygons(list(Polygon(cbind(c(179110, 179907, 180433, 180712, 180752, 180329, 179875, 179668, 179572, 179269, 178879, 178600, 178544, 179046, 179110), c(331086, 330620, 330494, 330265, 330075, 330233, 330336, 330004, 329783, 329665, 329720, 329933, 330478, 331062, 331086)))),'3'), Polygons(list(Polygon(cbind(c(180304, 180403,179632,179420,180304), c(332791, 333204, 333635, 333058, 332791)))),'4'))) 
srdf=SpatialPolygonsDataFrame(sr, data.frame(row.names=c('1','2','3','4'), PIDS=1:4)) 

shapefile(srdf, 'POLY.shp') 
contorno <- shapefile("POLY.shp") 

g <- geom(contorno) 
ids <- unique(g[,1]) 

hulls <- list() 
for (i in ids) { 
    d <- g[g[,1] == i, ] 
    hulls[[i]] <- polygons(convHull(d[, c('x', 'y')])) 
} 

h <- do.call(bind, hulls) 
plot(h, col='red') 
plot(contorno, add=TRUE, border='blue', lwd=3) 
+0

Большое спасибо Roberth – Leprechault

Смежные вопросы