我想使用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<-
函数起作用,但我得到的东西没有意义。
如何解决这个问题?!
答案 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时不认为他们重新投影;你做了覆盖它,而做了解决你的问题,但不是那么干净)