【发布时间】:2021-10-31 03:07:45
【问题描述】:
我正在尝试研究如何从 sf 对象中每一行的 sf 点几何数据创建边界框。我正在尝试使用 tmaptools 包中的“bb”函数以及 dplyr 和 rowwise()。但是,我得到的输出只是复制到每一行的相同边界框值,而不是根据每行上的点数据计算出的特定边界框。
这是数据框 sf 对象的片段:
df1<-structure(list(Altitude = c(65.658, 65.606, 65.562, 65.51, 65.479,
65.408, 65.342, 65.31, 65.242, 65.17, 65.122), Bearing = c(201.3042,
201.3042, 201.3042, 201.3042, 201.3042, 201.3042, 201.3042, 201.3042,
201.3042, 201.3042, 201.3042), TAI = c(0.7535967, 0.7225685,
0.7142722, 0.7686105, 0.760403, 0.7515627, 0.7905218, 0.6231222,
0.7246232, 0.6290409, 0.635797), lat_corrd = c(51.28648265, 51.28647067,
51.28646118, 51.28645183, 51.28644244, 51.28643067, 51.28642109,
51.28641164, 51.28639984, 51.2863905, 51.28638087), lon_corrd = c(0.866623929,
0.866616631, 0.866610968, 0.86660517, 0.866598889, 0.866591258,
0.866585183, 0.866579259, 0.866571906, 0.86656599, 0.866560288
), geometry = structure(list(structure(c(0.866623929, 51.28648265
), class = c("XY", "POINT", "sfg")), structure(c(0.866616631,
51.28647067), class = c("XY", "POINT", "sfg")), structure(c(0.866610968,
51.28646118), class = c("XY", "POINT", "sfg")), structure(c(0.86660517,
51.28645183), class = c("XY", "POINT", "sfg")), structure(c(0.866598889,
51.28644244), class = c("XY", "POINT", "sfg")), structure(c(0.866591258,
51.28643067), class = c("XY", "POINT", "sfg")), structure(c(0.866585183,
51.28642109), class = c("XY", "POINT", "sfg")), structure(c(0.866579259,
51.28641164), class = c("XY", "POINT", "sfg")), structure(c(0.866571906,
51.28639984), class = c("XY", "POINT", "sfg")), structure(c(0.86656599,
51.2863905), class = c("XY", "POINT", "sfg")), structure(c(0.866560288,
51.28638087), class = c("XY", "POINT", "sfg"))), class = c("sfc_POINT",
"sfc"), precision = 0, bbox = structure(c(xmin = 0.866560288,
ymin = 51.28638087, xmax = 0.866623929, ymax = 51.28648265), class = "bbox"), crs = structure(list(
input = "EPSG:4326", wkt = "GEOGCRS[\"WGS 84\",\n DATUM[\"World Geodetic System 1984\",\n ELLIPSOID[\"WGS 84\",6378137,298.257223563,\n LENGTHUNIT[\"metre\",1]]],\n PRIMEM[\"Greenwich\",0,\n ANGLEUNIT[\"degree\",0.0174532925199433]],\n CS[ellipsoidal,2],\n AXIS[\"geodetic latitude (Lat)\",north,\n ORDER[1],\n ANGLEUNIT[\"degree\",0.0174532925199433]],\n AXIS[\"geodetic longitude (Lon)\",east,\n ORDER[2],\n ANGLEUNIT[\"degree\",0.0174532925199433]],\n USAGE[\n SCOPE[\"Horizontal component of 3D system.\"],\n AREA[\"World.\"],\n BBOX[-90,-180,90,180]],\n ID[\"EPSG\",4326]]"), class = "crs"), n_empty = 0L)), row.names = 5000:5010, class = c("sf",
"data.frame"), sf_column = "geometry", agr = structure(c(Altitude = NA_integer_,
Bearing = NA_integer_, TAI = NA_integer_, lat_corrd = NA_integer_,
lon_corrd = NA_integer_), .Label = c("constant", "aggregate",
"identity"), class = "factor"))
str(df1)
#Classes ‘sf’ and 'data.frame': 11 obs. of 6 variables:
我要做的是从“几何”列中的 sfc_point 值创建一个新的边界框,例如:
require(tmaptools)
bb(df1, cx = st_coordinates(df1)[,1], cy = st_coordinates(df1)[,2], width = 0.000012, height = 0.000012, relative = FALSE)
# xmin ymin xmax ymax
# 0.8666179 51.2864767 0.8666299 51.2864887
或者更具体地说,是这样的:
bb(df1[i,], cx = st_coordinates(df1)[i,1], cy = st_coordinates(df1)[i,2], width = 0.000012, height = 0.000012, relative = FALSE)
我希望为每一行计算得到的 xmin、ymin、xmax、ymax 值作为新几何图形,称为边界框,添加到现有数据框。
我尝试使用 'apply' 来完成它,但它根本不起作用,并且似乎 'apply' 传递 'geometry' sf 列表类型值的方式对于 'bb' 不正确。 然后我尝试使用“dplyr”,效果更好,但仍然不太正确:
df1 %>% rowwise() %>% mutate(boundary_boxes = list(bb(cx = st_coordinates(.)[,1], cy = st_coordinates(.)[,2], width = 0.000012, height = 0.000012, relative = FALSE)))
这几乎可行,但只是为新的“boundary_box”列中的每一行重复相同的值,而不是给出特定的边界框。
我如何让它工作,或者有更好的方法吗? 非常感谢
一旦每行数据都有一个 bbox,我就需要将边界框转换为空间对象。我使用 'bb_poly' 来做到这一点:
bb_poly('some boundary box data', steps = 1)
【问题讨论】:
-
圆形会更容易,但您想要每个点的正方形多边形?
-
实际上一个圆圈可能会起作用,但椭圆形会更好。我需要能够设置椭圆的宽度和高度。如果我还可以从轴承柱设置圆(或矩形)的方向,那就更好了。