给定zoo
时间序列,其中包含“lat”,“lon”和“value”列:
z <- zoo(...)
# anyone knows how to create a simple example series here?
我需要将lat和lon度转换为UTM,以执行距离计算等进一步操作。经过一番研究后,我想出了一个工作片段,将所有内容转换为data.frame:
d <- as.data.frame(z)
coordinates(d) <- ~ lon+lat
proj4string(d) <- CRS("+proj=longlat +datum=WGS84")
d.final <- spTransform(d, CRS(paste("+proj=utm +zone=",zone," ellps=WGS84",sep="")))
这将删除初始的lat和lon列,并添加两个新的类似UTM的lat和lon列。有没有简单的方法直接使用zoo
对象?
此外,此代码段明显缺少变量zone
中的信息。从Determining UTM zone (to convert) from longitude/latitude我们学习如何从经度中获取区号:
zone.number <- (floor((z$lon + 180)/6) %% 60) + 1
但我现在还没有如何计算区域字母,例如。 “N”。如何获得?一般来说,我可以期待所有时间序列的区域保持不变。
从答案修改的这个解决方案是使用的:
# coming from a zoo time series z with columns z$lat and z$lon
library(rgdal)
# assume that z stays within a zone
zone <- (floor((z$lon[1] + 180)/6) %% 60) + 1
# convert
utm <- project(merge(z$lon, z$lat), paste0("+proj=utm +zone=", zone))
# assign UTM values to new columns in z
z$utmx <- utm[,1]
z$utmy <- utm[,2]
答案 0 :(得分:1)
试试这个:
library(zoo)
library(rgdal)
z <- zoo(cbind(lat = 12:14, lon = 10:12, value = 1:3)) # test data
zone <- (floor((z$lon[1] + 180)/6) %% 60) + 1
cbind(utm = project(z[, 2:1], paste0("+proj=utm +zone=", zone)), value = z[, 3])
,并提供:
utm.1 utm.2 value
1 608864.2 1326751 1
2 716922.6 1437988 2
3 824104.0 1549780 3
其中utm.1
和utm.2
分别为x
和y
(或easting
和northing
)。请注意,关于正/负的假设如
http://home.hiwaay.net/~taylorc/toolbox/geography/geoutm.html
并且上面的R代码输出双重检查到该页面。如果查看该页面上的标准UTM输出,它还会对注释中链接的输出进行双重检查。
更新:更正和修改示例。
答案 1 :(得分:-1)
这篇文章基本上是对另一个答案的重述,并已移至问题的最后部分。