我正在尝试使用以下链接中找到的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并且喜欢这门语言。这是我第一次找不到答案。我非常感谢有关此事的帮助!!!
答案 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")
根据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")
告诉我们这张地图,我们看到这一点在美国境内:
我建议的解决方案是使用这些更好的分辨率,更可靠的边界多边形,特别是如果您有兴趣准确地解析靠近边界的点。