如何使用SpatialLinesDataFrame计算行缓冲区

时间:2012-03-16 10:20:26

标签: r gis spatial

我想在一个带有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以及如何找到正确的投影。

2 个答案:

答案 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以执行投影。