我想在一个带有wgs84坐标的line-shapefile周围创建一个缓冲区。
我准备了一个包含单个线段和Datum的shapefile:D_WGS_1984。 之后,我使用'readOGR'命令将.shp加载到R中。
之后我尝试使用rgeos-package中的gBuffer方法来计算缓冲区:
gBuffer(l2, width=1.0, quadsegs=5, capStyle="ROUND", joinStyle="ROUND", mitreLimit=0.01))
Warning:
In gBuffer(l2, width = 1, quadsegs = 5, capStyle = "ROUND", joinStyle = "ROUND", :
Spatial object is not projected; GEOS expects planar coordinates
显然命令的坐标有问题。我尝试了一些方法,但没有找到解决方案。
我发现了一个关于点的缓冲区的另一个例子如下,但我不知道如何在我的情况下使用它: http://r-sig-geo.2731867.n2.nabble.com/compute-buffer-from-point-shapefile-to-have-shapefile-td4574666.html
有什么想法吗?
祝你好运, 斯蒂芬
//更新:
简化为相关部分,这里是代码:
require("rgeos")
require("rgdal")
l2=readOGR(dsn="C:/Maps", layer="osm_ms")
proj4string(l2) <- CRS("+proj=longlat")
l2.trans <- spTransform(l2, CRS("+proj=longlat"))
summary(l2.trans)
> Object of class SpatialLinesDataFrame
> Coordinates:
> min max
> x 7.478942 7.772171
> y 51.840318 52.058856
> Is projected: FALSE
> proj4string : [+proj=longlat +ellps=WGS84]
> Data attributes:
plot(l2.trans)
plot(gBuffer(l2.trans, width=1.0, quadsegs=5, capStyle="ROUND", joinStyle="ROUND", mitreLimit=0.01))
可能就行:
预计:FALSE 是问题的原因,但我不知道如何使用spTranform以及如何找到正确的投影。
答案 0 :(得分:7)
考虑一下1.0单位的缓冲区大小。那将是一个长度为1.0度的长度。这没有多大意义,因为1度N-S与1度E-W不同。 GEOS试图阻止你做一些它认为有点奇怪的事情。
因此,您可以通过为其分配几乎任何投影坐标CRS字符串,执行缓冲区,然后将其分配回来来欺骗它。潜在的数字不会改变。例如,如果你这样做:
proj4string(l2) = CRS("+init=epsg:27700")
你在系统中说这些数字是Uk Grid米。然后你做缓冲区,你给你知道的单位是真度。 GEOS使用数字进行计算,假设点在网格上(而不是球体)。然后你只需设置CRS。数字不会改变。
实际上,似乎有一个适当的ESPG代码用于预测lat-long,所以忽略前一行,并执行:
proj4string(l2) = CRS("+init=epsg:3395")
EPSG代码数据库:http://www.epsg-registry.org/ - 请注意epsg:3395详细信息中的“范围”是“非常小规模的映射”。
如果你真的想要以米为单位的缓冲区,那么你必须使用spTransform转换为公制投影(对于英国的工作,我总是使用epsg:27700) 更改基础数字。
答案 1 :(得分:1)
你的问题的答案就在你得到的错误中。您的数据需要预测,而不是在latlon系统中。从rgdal包中查看spTransform以执行投影。