将纬度/经度坐标转换为R中的位置时,NA返回不正确

时间:2016-08-18 00:08:31

标签: r maps geospatial

我正在尝试使用以下链接中找到的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

第一个坐标集返回正确答案,即“Illinois”。但是,当我将第二个坐标集(即-83.03579,42.32983)输入在线转换器时,我得到以下结果:

Downtown, Detroit, MI, USA

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

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

当使用“world”映射作为“mapping”变量的正式参数时,代码返回“USA”。我已经苦苦挣扎了好几天才想出来并没有运气。我玩过SpatialPointDataFrames,各种投影,并查看状态多边形对象本身。我在Windows 7系统上使用R版本3.3.1。我认为有问题的数据点可能落在边界线上。在这种情况下,我认为可以预期“NA”。我使用的代码如下。

使用的代码:

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并且喜欢这门语言。这是我第一次找不到答案。我非常感谢有关此事的帮助!!!

1 个答案:

答案 0 :(得分:3)

首先,问题不在于边界上的点。实际上,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")

enter image description here

根据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")

告诉我们这张地图,我们看到这一点在美国境内:

enter image description here

我建议的解决方案是使用这些更好的分辨率,更可靠的边界多边形,特别是如果您有兴趣准确地解析靠近边界的点。