0

给定一个zoo包含“lat”、“lon”和“value”列的时间序列:

z <- zoo(...)
# anyone knows how to create a simple example series here?

我需要将纬度和经度转换为 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。从经度/纬度确定 UTM 区域(转换)我们学习如何从经度中获取区域编号:

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]
4

2 回答 2

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 输出,它还会仔细检查评论中链接中的输出。

更新:更正和修改示例。

于 2014-09-17T01:15:01.863 回答
-1

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

于 2014-09-17T14:34:03.320 回答