【问题标题】:R: Lat-Lon to UTM for zoo time seriesR:动物园时间序列的经纬度到 UTM
【发布时间】:2014-11-10 21:29:08
【问题描述】:

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

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

我需要将纬度和经度转换为 UTM,以便执行进一步的操作,例如距离计算。经过一番研究,我想出了一个可以将所有内容转换为 data.frame 的工作 sn-p:

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 对象执行此操作?

此外,这个 sn-p 显然缺少来自变量 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]

【问题讨论】:

    标签: r coordinates zoo utm proj


    【解决方案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 输出,它还会仔细检查 cmets 中链接中的输出。

    更新:更正和修改示例。

    【讨论】:

    • 如何实现独立于区字母的转换?我预计 UTM 几何的曲率形状与纬度的关系远大于经度。
    • 它会为我仔细检查。请提供一个不重复检查的示例。
    • 我刚刚发现project 首先需要“lon”,而不是“lat”,这是矛盾的,我看不清文档。所以这个简单的单行将 latlon 转换为 R 中的 UTM:project(t(c(lon,lat)), paste0("+proj=utm +zone=",zone)
    • 这就是为什么答案是z[, 2:1] 而不是z[, 1:2]
    【解决方案2】:

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

    【讨论】:

    • (1) 它从动物园时间序列创建一个 UTM 对象,可以用它做任何事情:替换列、追加、在其他地方使用,... (2) 它使用任意动物园序列,其中列号和顺序未知。
    • 人们在他们的时间序列中有大量的列,这些列经常变化,你永远不知道你的列在哪个位置。这就是存在列名的原因。 “值”列只是一个示例。在此答案中,可能有数百个具有不同值的列,您可以替换或添加 UTM 列而无需关心其他列。这对您的解决方案来说是一个明显的优势。此外,我在几个小时前就支持了你的回答,并强调应该给你学分。我绝对不明白你在这里的情绪。
    猜你喜欢
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 2013-02-14
    • 2012-02-27
    • 2016-07-30
    • 2015-03-05
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多