R:Lat-Lon到UTM的动物园时间序列

时间:2014-09-17 00:33:49

标签: r coordinates zoo utm proj4

给定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]

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.1utm.2分别为xy(或eastingnorthing)。请注意,关于正/负的假设如

中所示

http://home.hiwaay.net/~taylorc/toolbox/geography/geoutm.html

并且上面的R代码输出双重检查到该页面。如果查看该页面上的标准UTM输出,它还会对注释中链接的输出进行双重检查。

更新:更正和修改示例。

答案 1 :(得分:-1)

这篇文章基本上是对另一个答案的重述,并已移至问题的最后部分。