在sp中添加CRS似乎不一致

时间:2015-09-03 15:15:50

标签: r geospatial spatial sp

我想使用over()sp包中的R函数。

我指定CRS

#say that polygon is EPSG3857 (Web Mercator PROJECTION)
proj4string(finalPolygon) <- CRS("+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 +wktext  +no_defs")

一切似乎都很好。

str(finalPolygon)
> ..@ proj4string:Formal class 'CRS' [package "sp"] with 1 slot
> .. .. ..@ projargs: chr "+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"

让我们检查CRS的{​​{1}}。

allPoints

所以,当我现在运行str(allPoints) >..@ proj4string:Formal class 'CRS' [package "sp"] with 1 slot > .. .. ..@ projargs: chr "+init=epsg:3857 +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_def" 函数

over()

我收到错误:

  

相同的CRS(x,y)不是真的

我想我知道这里的问题是什么,但我不知道如何解决它。

如果你仔细观察,pointsInPolygon <- over(allPoints, finalPolygon)) 会有更多的话 - 即allPoints。我看到here +init=epsg:3857只是比较sp package广告位中的字符串是否相同。好吧,它们与您所看到的CRS相同(空间参考的肌酐完全相同),但由于我创建它们的过程,字符串略有不同。

当我使用

CRS
<{1>}上的{p>将它抛回给我:

  

#say that points is EPSG3857 (Web Mercator PROJECTION) proj4string(spatialEPSG3857) <- CRS("+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 +wktext +no_defs") 中的警告(allPoints,值=):为具有现有CRS的对象分配了新的CRS:   + init = epsg:3857 + 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 without重新投影。对于重投影,请使用函数spTransform in   包rgdal

然后proj4string<-函数起作用,但我得到的东西没有意义。

如何解决这个问题?!

1 个答案:

答案 0 :(得分:3)

您应该通过

创建finalPolygon
finalPolygon <- SpatialPolygons(list(myPolygon), proj4string = CRS(proj4string(cornersEPSG3857)))

正如其文档所述,默认情况下CRS设置为NA。相反,您在下一个语句中将CRS设置为CRS("+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 +wktext +no_defs"),这与

不同
> CRS("+init=epsg:3857")
CRS arguments:
 +init=epsg:3857 +ellps=WGS84 +proj=merc +a=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 

这是您用于cornersEPSG3857的内容。虽然这两个字符串可能代表相同的CRS(即具有相同的语义),但它们在语法上不同,既不是sp也不是基础PROJ.4库(GDAL的一部分,通过包rgdal接口)具有比较两个语法不同的proj4strings的语义的功能。

此问题的解决方案是定义新的CRS一次,例如由

crs3857 =  CRS("+init=epsg:3857")

并在整个脚本中使用它。

(最后的警告是BTW,以确保用户在他们仅仅覆盖CRS时不认为他们重新投影;你做了覆盖它,而做了解决你的问题,但不是那么干净)