我有下面的墨西哥地图。它显示了所有市政当局和大约400个气象站。
我想在每个车站周围创建10公里的缓冲区,并最终将每个城市与位于每个半径范围内的车站相关联。
地图和测站存储在单独的sf对象上。我累了以下几点:
buffers <- st_buffer(stations, dist = 1)
我认为dist
参数设置为公里,所以我尝试了dist = 10
。不幸的是,这为每个工作站返回了 HUGE 缓冲区。这就是为什么我使用dist = 1
,但是即使这些缓冲区也和状态一样大! This question,建议我将电台转换为dist
参数设置为什么单位。
根据上述问题,我认为将其设置为度。如何在每个车站周围设置10公里的缓冲区?
其他信息:
在两个对象(墨西哥地图和站点)上,我的CRS都设置为4326。
这是我的stations
数据:
> dput(head(stations))
structure(list(station_number = c(1004L, 1005L, 1008L, 1012L,
1017L, 1018L), station_alt = c(1925, 1844, 2323, 1589, 2172,
2053), month = c(9L, 9L, 9L, 9L, 9L, 9L), Mean_min = c(11.6,
12.75, 12.25, 13.9666666666667, 12.9, 12.6833333333333), Mean_max = c(26.9333333333333,
26.85, 24.0833333333333, 29.0333333333333, 24.8666666666667,
26.1333333333333), months_observed = c(5L, 5L, 5L, 5L, 5L, 5L
), geometry = structure(list(structure(c(-102.199, 22.001), class = c("XY",
"POINT", "sfg")), structure(c(-102.372, 21.781), class = c("XY",
"POINT", "sfg")), structure(c(-102.135, 22.203), class = c("XY",
"POINT", "sfg")), structure(c(-102.802, 21.794), class = c("XY",
"POINT", "sfg")), structure(c(-102.444, 22.233), class = c("XY",
"POINT", "sfg")), structure(c(-102.415, 22.141), class = c("XY",
"POINT", "sfg"))), class = c("sfc_POINT", "sfc"), precision = 0, bbox = structure(c(xmin = -102.802,
ymin = 21.781, xmax = -102.135, ymax = 22.233), class = "bbox"), crs = structure(list(
epsg = NA_integer_, proj4string = NA_character_), class = "crs"), n_empty = 0L)), sf_column = "geometry", agr = structure(c(station_number = NA_integer_,
station_alt = NA_integer_, month = NA_integer_, Mean_min = NA_integer_,
Mean_max = NA_integer_, months_observed = NA_integer_), .Label = c("constant",
"aggregate", "identity"), class = "factor"), row.names = c(NA,
6L), class = c("sf", "data.frame"))
答案 0 :(得分:5)
您的坐标是长/纬度,因此距离将以度为单位。您应该首先以米为单位投影到空间参考,然后占用一万米。
PUT
的手册中关于dist参数的内容是这样的:
如果dist是单位对象,则应将其转换为 如果x具有地理坐标,则为arc_degree,并为st_crs(x)$ units 否则
如果您将坐标留在4326,则应该可以像0.1一样取东西,对于墨西哥来说应该是11公里,但是您会看到一条警告消息:
在st_buffer.sfc(st_geometry(x),dist,nQuadSegs,endCapStyle = endCapStyle ,: st_buffer无法正确缓冲 经度/纬度数据
因此,首先转换为另一个投影(以米为单位),然后输入以米为单位的距离。这应该可以使用EPSG 7801:
st_buffer
使用传单和测量工具进行控制:
library(sf)
pois <- st_as_sf(stations)
st_crs(pois) <- 4326
pois <- st_transform(pois, crs = 7801)
plot(st_geometry(pois))
buff <- st_buffer(pois, dist = 10000)
plot(st_geometry(buff), add = TRUE)