将经度/经度坐标转换为R中的位置时,NA返回不正确 [英] Incorrect NA return when converting Lat/Long Coordinates to location in R

查看:20
本文介绍了将经度/经度坐标转换为R中的位置时,NA返回不正确的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用在以下链接中找到的R代码的修改版本:

Latitude Longitude Coordinates to State Code in R

为了测试代码,我创建了以下形参:

mapping = "state"
pointsDF = data.frame(x = c(-88.04607, -83.03579), y = c(42.06907, 42.32983))
latlong2state(pointsDF, mapping)

代码返回以下内容:

[1] "Illinois" NA
第一个坐标集返回正确答案,即"伊利诺伊州"但是,当我将第二个坐标集(即-83.03579,42.32983)输入在线转换器时,我得到以下结果:

Downtown, Detroit, MI, USA

(http://www.latlong.net/Show-Latitude-Longitude.html)

再次运行代码,但将第二个坐标从42.32983更改为43.33后,该点将位于密歇根州。

使用"world"映射作为"Mapping"变量的形参时,代码返回"usa"。几天来,我一直在努力解决这个问题,但一直没有运气。我已经尝试过SpatialPointDataFrames、各种投影,并研究了状态多边形对象本身。我在Windows7系统上使用的是R版本3.3.1。我认为有问题的数据点可能落在边界线上。在这种情况下,我想应该是"不"。我使用的代码如下。

使用的代码:

library(sp)

library(maps)  
library(maptools)  
library(rgdal)

latlong2state = function(pointsDF, mapping) {

        local.map = map(database = mapping, fill = TRUE, col = "transparent", plot = FALSE) 
        IDs = sapply(strsplit(local.map$names, ":"), function(x) x[1])
        maps_sp = map2SpatialPolygons(map = local.map, ID = IDs, 
                                      proj4string = CRS("+proj=longlat +datum=WGS84"))                        
        pointsSP = SpatialPoints(pointsDF, 
                                 proj4string = CRS("+proj=longlat +datum=WGS84"))
        indices = over(x = pointsSP, y = maps_sp)
        mapNames = sapply(maps_sp@polygons, function(x) {x@ID})
        mapNames[indices]
}

我学习R只有两个月的时间,到目前为止我很喜欢这门语言。这是我第一次找不到答案。如果能在这件事上提供帮助,我将不胜感激!

推荐答案

首先,问题与边界上的点无关。事实上,over()不会为边界上的一个点返回NA,而是"如果一个点落在多个多边形中,则记录最后一个多边形。"

na表示不落在多边形中的点。我们可以放大您的地图查看情况

plot(local.map,  xlim = c(-83.2, -82.8), ylim=c(42.2,42.6), type="l")
polygon(local.map, col="grey60")
points(local.map)
points(pointsDF[2,], col="red")

根据maps::map()提供的多边形,该点位于加拿大连续的美国之外。当其他地图如你所说,在美国一侧的边界上定位这个点时,为什么会出现这种情况?我不认为这是一个投影问题,因为我们对多边形和点使用相同的WGS84地理坐标。因此,maps::map()提供的多边形本身似乎是错误的。

我们可以通过与其他来源的多边形进行比较来检查这一点。我从http://www2.census.gov/geo/tiger/GENZ2015/shp/cb_2015_us_state_500k.zip下载了美国人口普查部门最高分辨率的州边界。然后,

shp.path <- "C:/Users/xxx/Downloads/cb_2015_us_state_500k/cb_2015_us_state_500k.shp"
states <- readOGR(path.expand(shp.path), "cb_2015_us_state_500k")
plot(states,  xlim = c(-83.2, -82.8), ylim=c(42.2,42.6))
points(pointsDF[2,], col="red")

为我们提供此地图,在该地图中我们可以看到该点在美国边界内:

因此,我推荐的解决方案是使用这些分辨率更高、更可靠的边界多边形,特别是如果您有兴趣精确解析靠近边界的点。

这篇关于将经度/经度坐标转换为R中的位置时,NA返回不正确的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆