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

空间多边形 - 从坐标在 R 中创建一组多边形

公西博实
2023-03-14

我试图从顶点位置创建一组多边形,保存在X,Y格式。

下面是我的数据的一个例子——每行代表一个多边形的顶点。多边形是正方形

square <- rbind(c(255842.4, 4111578, 255862.4, 4111578, 255862.4, 4111558, 
                  255842.4, 4111558, 255842.4, 4111578, 255842.4, 4111578),
                c(257397.0, 4111309, 257417.0, 4111309, 257417.0, 4111289, 
                  257397.0, 4111289, 257397.0, 4111309, 257397.0, 4111309))

ID <- c("SJER1", "SJER2")'

我正在使用空间多边形,因此我的数据需要在列表中。所以我创建了一个循环来尝试从矩阵中将我的数据转换为列表格式。

我创建了一个循环,遵循我在这个网站上的其他一些问题中找到的代码。我突破了每一步,试图理解为什么我只有一个多边形作为输出,即使我有2组点。

for (i in 1:2) {  
  pts <- rbind(c(square[i,1], square[i,2]), c(square[i,3], square[i,4]), 
               c(square[i,5],square[i,6]), c(square[i,7],square[i,8]), 
               c(square[i,9],square[i,10]))
  sp1 <- list(Polygon(pts))
  sp2 <- list(Polygons(sp1,i))
  sp = SpatialPolygons(sp2)  
}
plot(sp)

你能帮我理解我如何调整代码写出两个多边形而不是一个多边形吗?此外,我如何将ID分配给每个多边形,我使用矩阵(正方形)作为起始数据集,如果我分配了字符ID,它会将所有数据转换为字符。

我的最终目标是SpatialPolygons对象中的两个多边形,第一个具有IDSJER1,第二个具有存储在SpatialPolygons中的IDSJER2

然后我会把它写到一个形状文件中。

共有1个答案

濮冠宇
2023-03-14

?'SentialPolygons-class'中有一些信息,但您或多或少想要执行以下操作:

polys <- SpatialPolygons(list(
  Polygons(list(Polygon(matrix(square[1, ], ncol=2, byrow=TRUE))), ID[1]),
  Polygons(list(Polygon(matrix(square[2, ], ncol=2, byrow=TRUE))), ID[2])
))

plot(polys)

基本要点是您需要创建多边形对象(例如,从第一列为 x 坐标,第二列为 y 坐标的 2 列矩阵创建)。它们组合在列表中以创建多边形对象(每个对象都应具有唯一的 ID)。这些多边形对象将合并到一个列表中以创建空间多边形对象。如果您愿意,可以使用 proj4string 参数向空间多边形添加 CRS(请参阅?空间多边形)。

要将其写出为ESRI形状文件,您需要通过组合我们创建的< code>polys对象和一些数据,将其转换为< code > SpatialPolygonsDataFrame 对象。由于缺少更有趣的东西,我们将只添加id作为数据。

polys.df <- SpatialPolygonsDataFrame(polys, data.frame(id=ID, row.names=ID))

然后写出来...

writeOGR(polys.df, '.', 'fancysquares', 'ESRI Shapefile')

第二个参数('.')表示将其写入当前工作目录。

编辑

若要在有多行描述多边形时快速创建SpatialPolygonsDataFrame,可以使用以下命令:

# Example data
square <- t(replicate(50, {
  o <- runif(2)
  c(o, o + c(0, 0.1), o + 0.1, o + c(0.1, 0), o)
}))
ID <- paste0('sq', seq_len(nrow(square)))

# Create SP
polys <- SpatialPolygons(mapply(function(poly, id) {
  xy <- matrix(poly, ncol=2, byrow=TRUE)
  Polygons(list(Polygon(xy)), ID=id)
}, split(square, row(square)), ID))

# Create SPDF
polys.df <- SpatialPolygonsDataFrame(polys, data.frame(id=ID, row.names=ID))

plot(polys.df, col=rainbow(50, alpha=0.5))
 类似资料:
  • 我使用以下方法从拉多边形中获取多边形: 但是,我正在尝试从多边形获取坐标,但我不能: poligon@polygons[1]类“Polygons”Slot“Polygon”的对象:[1]类“多边形”Slot”labpt“的对象:[1]-46.37327-23.91955 提前致谢

  • 我有一个“SpatialPolygons”对象,我想在@hole==FALSE处对多边形进行子集,并创建一个新对象。 使用下面的代码,一次可以预测得到1个多边形(如果@hole==TRUE,则没有),但我无法从对象中分割多个多边形。 我认为我的问题在于我不知道如何“一般”引用第二个列表,即从列表(Polygon)中获取项目,其中@孔==FALSE。将第二个[[]]留空不起作用。 附言:抱歉,没有可

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

  • 我有一些关于点为双类型的多边形的问题...我要做的是,给定点,创建多边形,然后测试1个具体点是否在多边形内。 所以我知道在Java中有一个类,叫做多边形,用得像这样:(三角形) 但我的“多边形”必须是“双”类型,而不是“int”(简单示例) 在我的项目中,我真的不需要在小程序或类似物上绘制它,我只需要计算点是否在里面。 所以我的问题是: 有没有什么方法可以用双坐标来处理多边形,可以计算这个点(双坐

  • 我有一个城市建筑物的框架。这些建筑有一个纬度和经度列,并分组到单独的管理位置。 我已经成功地创建了一个geopandas数据框,每个建筑都有一个“几何”列,其中包含形状优美的点,并在地图上用不同的颜色为每个管理位置绘制这些点。但是,是否有办法按管理位置对geodataframe进行分组,并将“几何体”列作为一个形状良好的多边形,包含每个管理位置内每个建筑对应的点? 我目前有: 但当我绘制它时: 它

  • 我有一个geopandas数据框,其中包含一个形状良好的点几何体列表。还有一列包含ID列表,用于指定每个点所属的唯一多边形。简化输入代码为: 我想按多边形ID分组,以便将几何体从点转换为多边形。该输出基本上如下所示: 我想这很简单,但我很难让它工作。我发现下面的代码允许我将其转换为开放式多段线,但无法计算出多边形。有人能建议如何适应这种情况吗? 简单地用多边形替换LineString会导致Type