我有数百个纬度长点分布在世界各地,并且必须在它们周围创建半径为1000米的圆多边形。我知道必须先将点从度数(经度)投影到具有米单位的东西,但是如何在不手动搜索和定义每个点的UTM区域的情况下做到这一点呢?
这是芬兰第一个重点。
library(sp)
library(rgdal)
library(rgeos)
the.points.latlong <- data.frame(
Country=c("Finland", "Canada", "Tanzania", "Bolivia", "France"),
lat=c(63.293001, 54.239631, -2.855123, -13.795272, 48.603949),
long=c(27.472918, -90.476303, 34.679950, -65.691146, 4.533465))
the.points.sp <- SpatialPointsDataFrame(the.points.latlong[, c("long", "lat")], data.frame(ID=seq(1:nrow(the.points.latlong))), proj4string=CRS("+proj=longlat +ellps=WGS84 +datum=WGS84"))
the.points.projected <- spTransform(the.points.sp[1, ], CRS( "+init=epsg:32635" )) # Only first point (Finland)
the.circles.projected <- gBuffer(the.points.projected, width=1000, byid=TRUE)
plot(the.circles.projected)
points(the.points.projected)
the.circles.sp <- spTransform(the.circles.projected, CRS("+proj=longlat +ellps=WGS84 +datum=WGS84"))
但是第二点(加拿大)则不起作用(因为错误的UTM区域)。
the.points.projected <- spTransform(the.points.sp[2, ], CRS( "+init=epsg:32635" ))
如何在不手动获取和指定每个点UTM区域点的情况下完成此操作?每点我没有更多的信息。
更新:
使用和组合来自AndreJ和Mike T的出色答案,这是版本和图解的代码。它们在小数点后四位左右是不同的,但是两个答案都很好!
gnomic.buffer <- function(p, r) {
stopifnot(length(p) == 1)
gnom <- sprintf("+proj=gnom +lat_0=%s +lon_0=%s +x_0=0 +y_0=0",
p@coords[[2]], p@coords[[1]])
projected <- spTransform(p, CRS(gnom))
buffered <- gBuffer(projected, width=r, byid=TRUE)
spTransform(buffered, p@proj4string)
}
custom.buffer <- function(p, r) {
stopifnot(length(p) == 1)
cust <- sprintf("+proj=tmerc +lat_0=%s +lon_0=%s +k=1 +x_0=0 +y_0=0 +ellps=WGS84 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs",
p@coords[[2]], p@coords[[1]])
projected <- spTransform(p, CRS(cust))
buffered <- gBuffer(projected, width=r, byid=TRUE)
spTransform(buffered, p@proj4string)
}
test.1 <- gnomic.buffer(the.points.sp[2,], 1000)
test.2 <- custom.buffer(the.points.sp[2,], 1000)
library(ggplot2)
test.1.f <- fortify(test.1)
test.2.f <- fortify(test.2)
test.1.f$transf <- "gnomic"
test.2.f$transf <- "custom"
test.3.f <- rbind(test.1.f, test.2.f)
p <- ggplot(test.3.f, aes(x=long, y=lat, group=transf))
p <- p + geom_path()
p <- p + facet_wrap(~transf)
p
(不确定如何将图解添加到更新中)。
1
手动搜索部分的可能解决方案:如果您获得UTM区域网格并将其与点相交,从而将适当的区域添加为属性,该怎么办?该属性可以是区域名称,也可以是EPSG代码,但是可以将其作为变量输入以自动为每个点选择正确的CRS。
—
克里斯W
我对“恰好1000m”和短语“圆形多边形”有疑问。您的圆多边形需要无穷大的段精确到 1000m,而转换为UTM(或任何其他平面系统)将引入更多的误差。使用“精确”时要小心。
—
Spacedman 2014年
是的,我不应该表达不同的意思。我的意思是1100m或900m太高了,圆上大约20个路段还可以。
—
克里斯(Chris)