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

标签 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

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

Downtown, Detroit, MI, USA

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

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

当使用“世界” map 作为“映射”变量的正式参数时,代码返回“美国”。我几天来一直在努力解决这个问题,但没有运气。我尝试过 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 才两个月,到目前为止我很喜欢这门语言。这是我第一次找不到答案。我非常感谢就此事提供的帮助!!!

最佳答案

首先,问题不是由位于边界上的点引起的。事实上,对于边界上的点,over() 不会返回 NA,而是“如果一个点落在多个多边形中,则记录最后一个多边形。”

NA表示不落在多边形内的点。我们可以放大您的 map 来查看情况

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() 提供的多边形,该点位于加拿大毗邻的美国之外。正如你所说,当其他 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")

给我们提供了这张 map ,我们在其中看到该点位于美国边界之内:

enter image description here

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

关于r - 将纬度/经度坐标转换为 R 中的位置时,NA 返回不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39008066/

相关文章:

r - 如何取消列出空间对象并在 R 中完全绘制

javascript - 传单检测标记何时进出圆圈

algorithm - 迭代最近点库

javascript - 使用地心坐标系计算纬度、经度和高度的距离

mongodb - geoNear 回调?

r - 当您不知道列数时,使用所有列按顺序对矩阵进行排序

r - 奇怪的需求如何进行条件计算

r - 在 ggplot2 中使用颜色转换时,更改图例渐变而不是图例中断位置

php - 谷歌地图从 mysql 表慢

mongodb - 使用 $near 按存储在文档中的距离过滤文档