使用纬度和经度生成时区

时间:2016-05-24 18:04:10

标签: r xml google-maps timezone

除了EST中的时间戳外,我还有大约900万条纬度和经度记录。我想使用纬度和经度来生成适当的区域时区,然后我想从中调整相关时区的所有这些时间。

我尝试过使用地理名称

data_raw$tz <- mapply(GNtimezone, data$lat,data$lon)

但是,这会返回以下错误:

Error in getJson("timezoneJSON", list(lat = lat, lng = lng, radius = 0)) : 
error code 13 from server: ERROR: canceling statement due to statement timeout

我尝试使用this post中描述的方法。

data$tz_url <- sprintf("https://maps.googleapis.com/maps/api/timezone/%s?location=%s,%s&timestamp=%d&sensor=%s", 
              "xml", 
              data$lat, 
              data$lon, 
              as.numeric(data$time), 
              "false")

for(i in 1:100){
  data$tz[i] <- xmlParse(readLines(data$tz_url[i]), isURL=TRUE)[["string(//time_zone_name)"]]
}  

使用此方法,我可以获取XML数据的URL。但是当我尝试在for循环中提取XML数据并将时区附加到数据帧时,它并没有为所有记录执行...(事实上,间歇性地一次只有10条记录)。

是否有人知道任何替代方法或程序包能够相对快速地为大约900万条记录获取三个字符的时区(即EST)?非常感谢您的帮助。或者更好的是,如果您对我上面使用的代码无效的原因有所了解,我也会很感激。

2 个答案:

答案 0 :(得分:2)

有关将纬度和经度转换为时区的方法列表,请参阅this post。这些机制将返回IANA / Olson时区标识符,例如America/Los_Angeles

但是,您当然不希望进行900万个单独的HTTP调用。您应该尝试将记录分组到不同的位置,以最大限度地减少查找次数。如果它们是真正随机的,那么你仍然会有大量的位置,所以你应该考虑前一篇文章中描述的离线机制(即使用tz_world shapefile和某种geospatial lookup mechanism)。

获得该位置的IANA / Olson时区标识符后,您可以将R的时区功能(as.POSIXctformat等)与每个相应的时间戳一起使用以获取缩写

但是,请确认时区缩写本身can be somewhat ambiguous。它们对人类的可读性很有用,但不是很多。

答案 1 :(得分:1)

我已经编写了包googleway来访问google maps API。您需要一个有效的API密钥(并且,对于Google来说,您需要支付900万个电话,因为他们的免费电话只能支付2500个)

library(googleway)

key <- "your_api_key"

google_timezone(location = c(-37, 144),
                key = key)


$dstOffset
[1] 0

$rawOffset
[1] 36000

$status
[1] "OK"

$timeZoneId
[1] "Australia/Hobart"

$timeZoneName
[1] "Australian Eastern Standard Time"