Geographical CRS given to non-conformant data in R

爷,独闯天下 提交于 2019-12-07 14:20:23

问题


sorry for bothering you for this, but it is maybe 5 hours I am getting mad on this issue and I don't manage to sort it out.

I have a dataset of about 37,000 entries. Each of them has its own Lon and Lat coordinate values. Checking the overall values, they range respectively as follow: Latitude (-54.4871,70.66344) and Longitude (-177.375, 178.4419). This is absolutely reasonable.

I created a shapefile with these 37 thousands points using ArcGIS: everything works fine.

I need then to process these data using R, the command I used for my code is (maptools package):

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

but R gives an error:

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

(I have no idea on where this number comes from, it is not part of my dataset...)

Reading other posts on this blog seems that the cause should be an invalid data for lon or lat, but as I mentioned above, this is not the case for my dataset.

I tried to create different shapefiles, the first one was not projected, using several projections (WGS84 Mercator, web mercator...), but the error is always the same...

Thanks for your help.


回答1:


The bottom line is that your shapefile seems to be corrupt.

The points shapefile has two main sections, a coords section that has the coordinates of the points, and a data section that has "attribute" data (information about the points, like region and country in your case). Your shapefile has Lon and Lat in the data section as well, but they don't match:

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

Reprojection involves transforming the information in the coords section, which is why it failed.

Here is a workaround, but hacking the SpatialPointsDataFrame is not a good idea:

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()

I'd recommend you re-create the shapefile and try again.



来源:https://stackoverflow.com/questions/21441549/geographical-crs-given-to-non-conformant-data-in-r

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!