当前位置: 首页 > 知识库问答 >
问题:

保留多环多边形的最大环

曾弘扬
2023-03-14

我有一个SpatialPolygons对象。该对象有一个功能,即多边形对象,它本身由多个多边形对象组成。

我想子集空间多边形对象,以便多边形对象只有一个多边形对象,即面积最大的多边形。

我已经尝试了许多不同的方法,但都不知道如何在子多边形层次上设置子集。

下面是一个例子:

#create polygon
Sr1 = Polygon(cbind(c(2,4,4,1,2),c(2,3,5,4,2)))
Sr2 = Polygon(cbind(c(5,4,2,5),c(2,3,2,2)))
Srs = Polygons(list(Sr1,Sr2), "s1/2")

SpP = SpatialPolygons(list(Srs))

在此示例中,SpP有一个多边形对象。多边形对象的第一个子多边形具有面积5.5,第二个子多边形具有区域1.5。我希望将SpatialPolygons对象子集化,使多边形对象只有一个多边形,即面积5.5的多边形。

这可能吗?

编辑

谢谢你的回答。我从未使用过sf包,但它看起来很酷。尤其是因为它与dplyr的配合非常好!

不过,我最终找到了一个不同的解决方案。我的主要问题是我没有掌握SpatialPolygons对象结构是如何工作的。空间多边形对象包含1..* Polygons对象,因此构造函数接受一个Polygons对象列表。多边形对象包含1..*多边形对象,因此构造函数接受多边形对象的列表。考虑到这一点,我使用了下面的解决方案。

plst <- SpP@polygons[[1]]@Polygons #get the list of Polygon objects
plst <- plst[which.max(sapply(plst,function(p) return(p@area)))] #filter to the max area
spoly2 <- SpatialPolygons(list(Polygons(plst,'id')))

图显示这将通过最大面积过滤环。

plot(SpP)
plot(spoly2,col=alpha('red',0.1),add=T)

共有1个答案

颜嘉福
2023-03-14

这里有一种方法使用sf包。不幸的是,我不太熟悉sp,但这可能会激励我转换!

问题是,正如所给出的,几何体是一个带有外环的多边形。要单独处理几何体,我们需要将每个环分割成自己的多边形。在sf中,POLYGON是矩阵列表,每个矩阵对应于环中的点;a<code>MULTIPOLYGON</code>是矩阵列表。因此,为了转换,我们执行以下操作:

  1. (使用st_as_sfcSpatialPolygons转换为sfc
  2. map(list)通过POLYGON将每个环包装在一个列表中,然后使用st_multip多边形转换列表列表。注意,如果有更多的几何图形,我也会映射到sfc列,尽管这里只有一个几何图形
  3. 将此列表转换回sfc对象,然后转换为sfsfc只是具有其他属性(如坐标系)的几何体列表,sf使sfcsfc在数据帧中仅为一列。这是需要的,因为我们想知道每个几何体的面积
  4. 使用奇妙的函数st_castMULTIPOLYGON拆分为单个多边形。我们添加了一个<code>rowid</code>,这样我们就知道哪些新的<code>POLYGON</code<s属于原始的<code<MULTIPOLYGON>
  5. 添加一个带有mutatest_area的区域列,group_by,然后使用top_n过滤到每个组中最大的多边形。注意sf对象与dplyr动词一起工作是多么好

该图显示了结果。原始多边形为红色,其最大的环为蓝色。

library(tidyverse)
library(sf)
#> Linking to GEOS 3.6.1, GDAL 2.2.3, proj.4 4.9.3
library(sp)
Sr1 = Polygon(cbind(c(2,4,4,1,2),c(2,3,5,4,2)))
Sr2 = Polygon(cbind(c(5,4,2,5),c(2,3,2,2)))
Srs = Polygons(list(Sr1,Sr2), "s1/2")

SpP = SpatialPolygons(list(Srs))
sfc <- st_as_sfc(SpP)
sfc
#> Geometry set for 1 feature 
#> geometry type:  POLYGON
#> dimension:      XY
#> bbox:           xmin: 1 ymin: 2 xmax: 5 ymax: 5
#> epsg (SRID):    NA
#> proj4string:    NA
#> POLYGON ((2 2, 1 4, 4 5, 4 3, 2 2), (5 2, 4 3, ...

sf_obj <- sfc %>%
  map(
    .f = function(polygon) polygon %>% map(list) %>% st_multipolygon()
  ) %>%
  st_sfc() %>%
  st_sf() %>%
  rowid_to_column() %>%
  st_cast("POLYGON") %>% 
  mutate(area = st_area(geometry)) %>%
  group_by(rowid) %>%
  top_n(1, area)
#> Warning in st_cast.sf(., "POLYGON"): repeating attributes for all sub-
#> geometries for which they may not be constant

plot(sfc, col = "red")
plot(sf_obj$geometry, col = "blue", add = TRUE)

由reprex包(v0.2.0)于2018-05-09创建。

 类似资料:
  • 我有两个地理数据帧:一个包含许多线性字符串,另一个包含许多多边形。这些线和多边形相互交叉。我试图实现的输出是一个新的地理数据帧,包含在它们相交多边形的任何位置被分割的链接。 简化测试代码如下: 通过运行以下代码,可以看到直线与多边形相交: 它生成下图(注释以红色/绿色添加,以显示所涉及的各种元素): 将两条线拆分为6段(如上图中绿色标记)。 理想情况下,我想要实现的输出如下所示,带有一个“poly

  • 返回顶点的输入数组,并且附有一些其他方法,如下面所描述 polygon.area() 返回此多边形的标定区域。如果顶点是逆时针顺序,面积为正,否则为负。 polygon.centroid() 返回一个表示此多边形的质心的两元素数组。 polygon.clip(subject) 对这个多边形剪切主题多边形。换句话说,返回一个多边形表示这个多边形和主题多边形的交集。假定剪切的多边形是逆时针方向以及凸多

  • 我看了最简单的物体,甚至那些都不一样...对于java.lang.Integer,VisualVm报告20个字节,而不是其他的16个字节(在我的解释中,这是因为从Integer类中提交的=12字节header+4字节int'value'=16,不需要填充)。 哪一个是正确的,为什么?

  • 我有一个带有lat和lon的商店位置csv文件。我还有一个geojson文件,其中包含美国人口普查区的多边形特征。我想使用Python查看每个位置存在哪些多边形。 我使用Shapely Python库的包含()来循环通过存储位置的csv文件,获取lat和lon坐标,然后检查这些坐标是否存在于Geojson文件中的一个多边形中。 如果我先遍历每个位置/坐标,然后遍历每个多边形,使用contains(

  • 我正在寻找一种方法来创建一组多边形(rechtangles),沿着一条线在多个多边形中创建一组多边形(rechtangles),并将其水平隔开,如图所示。 我尝试生成点并将其用作多边形的中点,但问题是,通过创建等间距的点光栅,除了180度之外,不可能以任何其他方向旋转。 例子 给出了一个多多边形形状的对象和由宽度和高度以及每个多边形之间的垂直和水平间距定义的多边形。多边形应仅放置在多多边形内,且不

  • 基础示例 <vuep template="#example"></vuep> <script v-pre type="text/x-template" id="example"> <template> <div class="amap-page-container"> <el-amap vid="amap" :zoom="zoom" :amap-manager="ama