【问题标题】:Dissolve holes in polygon in R在R中溶解多边形中的孔
【发布时间】:2012-09-21 17:04:09
【问题描述】:

我正在 R 中运行一些地理处理任务,其中我试图创建一些多边形来裁剪环境信息的栅格。我正在缓冲一些复杂的多边形,这留下了我想摆脱的小子几何。在 ArcGIS 中,我认为这将涉及将我的多边形从多部分转换为单部分(或类似的东西)然后溶解,但我不知道如何在 R 中执行此操作。

这是一个说明问题的例子:

require(maptools)
require(rgeos)

data(wrld_simpl)
wrld_simpl[which(wrld_simpl@data$NAME=='Greece'),]->greece
proj4string(greece)<-CRS('+proj=lonlat +datum=WGS84')
gBuffer(greece,width=0.5)->buf
plot(buf)

我真正想要的是多边形的外边界,里面没有别的东西。有什么想法吗?

【问题讨论】:

  • 我从你的代码中得到这个错误:A new CRS was assigned to an object with an existing CRS: +proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs +towgs84=0,0,0 without reprojecting. For reprojection, use function spTransform in package rgdal
  • 这只是一个警告,因为我重新定义了对象上的投影,以便它可以很好地与 gBuffer 函数配合使用。你可以忽略它。
  • 如果我错了,请纠正我,但你的问题会归结为计算多边形顶点的最小凸包吗?
  • 凸包方法已经越过我的脑海,但这确实概括了多边形很多。在这种情况下,它工作得很好,但是在某些多边形形状中,MCP 会真正改变最终结果。所以,你是对的!但我希望有另一种方法。

标签: r gis polygons


【解决方案1】:

如果您想要适合希腊的凸包,您可以使用rgeos 包中的gConvexHull 函数。请注意,如果您要处理带有孔的多边形,这不一定是采用的方法,正如我认为问题标题中的情况一样。但是,从您的示例来看,以下方法似乎可以将您带到您想要的地方。

myCH <- gConvexHull(greece)

plot(myCH)

这会产生类似的东西

并检查一切是否合适,

plot(myCH)
plot(greece,add=TRUE)

【讨论】:

    【解决方案2】:

    如果你只想得到一个构成缓冲区边界的环,那么这个:

    plot(SpatialPolygons(list(Polygons(list(buf@polygons[[1]]@Polygons[[1]]),ID=1))),lwd=2)
    

    对于您的案例来说,这是一种非常特别的方式(并绘制它)。

    你真正想要的是用ringDir=1 得到所有的戒指,因为剩下的都是洞。您需要所有的环,因为您的缓冲区可能仍然是两个不相连的岛屿。

    outerRings = Filter(function(f){f@ringDir==1},buf@polygons[[1]]@Polygons)
    outerBounds = SpatialPolygons(list(Polygons(outerRings,ID=1)))
    plot(outerBounds)
    

    可能会成功...尝试使用width=0.1,您会发现它适用于多个岛屿,但仍会移除一个洞。

    【讨论】:

    • 这似乎正是我所希望的。谢谢!我真的需要更多地了解这些多边形对象的结构......
    • 应该有一些函数可以更轻松地处理 sp 对象的内部内容,但我永远找不到它们...... str(buf) 是你的朋友。
    • 我在ringDir 上找不到任何文档,有任何指针吗?
    • 第二件事有效!惊人的。没有标准的方法可以做到这一点吗?使用一些 rgdal 函数?
    猜你喜欢
    • 1970-01-01
    • 2015-06-07
    • 1970-01-01
    • 2015-01-20
    • 2021-03-05
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    相关资源
    最近更新 更多