r - 给予 R 中不一致数据的地理 CRS

标签 r maptools

很抱歉为此打扰你,但我可能已经为这个问题生气了 5 个小时,但我没能解决它。

我有一个包含大约 37,000 个条目的数据集。它们每个都有自己的 Lon 和 Lat 坐标值。 检查整体值,它们的范围分别如下:纬度(-54.4871,70.66344)和经度(-177.375,178.4419)。这是绝对合理的。

我使用 ArcGIS 创建了一个包含这 37000 个点的 shapefile:一切正常。

然后我需要使用 R 处理这些数据,我在代码中使用的命令是(maptools 包):

cells <- readShapeSpatial('RES',IDvar="id_obj", 
                          proj4string=CRS("+proj=longlat +datum=WGS84"))

但是R报错:

Error in validityMethod(as(object, superClass)) : Geographical CRS given to non-conformant data: 2.76663393422e+145

(我不知道这个数字是从哪里来的,它不是我数据集的一部分...)

阅读此博客上的其他帖子似乎原因应该是 lon 或 lat 的无效数据,但正如我上面提到的,我的数据集并非如此。

我尝试创建不同的 shapefile,第一个没有投影,使用多个投影(WGS84 墨卡托、web 墨卡托...),但错误始终相同...

感谢您的帮助。

最佳答案

底线是您的 shapefile 似乎已损坏。

点 shapefile 有两个主要部分,一个是包含点坐标的 coords 部分,另一个是包含“属性”数据(关于点的信息,如区域和国家/地区)的数据部分你的情况)。您的 shapefile 在数据部分也有经度和纬度,但它们不匹配:

library(rgdal)
setwd("<directory with shapefile...>")
map <- readOGR(dsn=".", layer="test")

range(map@data$Lat)
# [1] -54.48708  70.66344

range(map@coords[,2])
# [1]  -5.448708e+01  2.766634e+145

重新投影涉及转换 coords 部分中的信息,这就是它失败的原因。

这里有一个解决方法,但破解 SpatialPointsDataFrame 并不是一个好主意:

map@coords <- as.matrix(map@data[c("Lon","Lat")])
map@bbox   <- rbind(range(map@coords[,1]),range(map@coords[,2]))
wgs.84 <- "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0"
proj4string(map) <- CRS(wgs.84)

library(ggplot2)
gg <- data.frame(map@coords)
ggplot(gg) + 
  geom_point(aes(x=Lon,y=Lat), size=1, alpha=0.5, colour="blue") + 
  coord_fixed()

mercator <- "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs"
map.mercator <- spTransform(map,CRS=CRS(mercator))
gg <- data.frame(map.mercator@coords)
ggplot(gg) + 
  geom_point(aes(x=Lon,y=Lat), size=1, alpha=0.5, colour="green") + 
  coord_fixed()

我建议您重新创建 shapefile 并重试。

关于r - 给予 R 中不一致数据的地理 CRS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21441549/

相关文章:

r - 在 R 中使用 for 循环绘制小倍数

r - 使用maptools readShapePoly在R中打开SHP文件时出错

r - 使用来自不同来源的形状文件和数据文件在 R 中绘制专题 map

r - 如何在ggplot map 中添加比例尺

r - 在R中反复调用lmrob时如何处理错误

r - 如何根据上一行中的月份连续增加一个月?

r - 用 R 求解欠定线性系统

r - 使用 gtable 排列 ggplot 图(具有相同宽度的 grobs)以创建 2x2 布局

r - 如何在 wrld_simpl 中为选定的国家/地区着色?

r - 带有突出显示的国家和选定城市的简单世界地图