2012-03-16 81 views
4

我想围绕具有wgs84坐标的line-shapefile创建缓冲区。如何使用SpatialLinesDataFrame计算行缓冲区

我准备了一个带有单线段和基准的shapefile:D_WGS_1984。 之后,我使用'readOGR'命令将.shp加载到R中。

之后我试过gBuffer方法从rgeos封装的用于计算所述缓冲液:

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 是问题的原因,但我不知道如何使用t他spTranform和如何找到正确的投影。

+0

告诉我们你试过的是什么,对,我们不知道你已经做了什么,除了你做了什么。 – 2012-03-16 10:33:44

回答

7

想想你的1.0单位的缓冲区大小。那将会是经济增长的1.0度。由于1度N-S不同于1度E-W,所以没有多大意义。 GEOS试图阻止你做一些它认为有点奇怪的事情。

所以你可以通过给它分配几乎所有的投影坐标CRS字符串,做缓冲区,然后重新分配它。底层的数字不会改变。例如,如果你这样做:

proj4string(l2) = CRS("+init=epsg:27700") 

你说谎的系统,数字是英国电网米。然后你做缓冲区,然后你给你知道真正度数的单位。 GEOS使用数字进行计算,假设点位于网格上(而不是球体)。然后,您只需设置CRS。数字不会改变。

其实,有似乎是投影LAT-长适当ESPG代码,所以忽略前行,并做到:

proj4string(l2) = CRS("+init=epsg:3395") 

EPSG代码数据库的位置:http://www.epsg-registry.org/ - 请注意在“范围” epsg:3395的详细资料是'非常小规模的映射'。

如果你真的想要米的缓冲区,那么你必须使用spTransform转换为公制投影(在英国工作我总是使用epsg:27700),其中确实更改了底层数字。

+0

它的工作原理!非常感谢。 – nomeus 2012-03-16 12:49:59

+0

**你确定这是OP @ nomeus想要的吗?**他没有说他想要以经纬度数字制作缓冲区!有人想要做这样的疯狂是不太可能的。所以我认为错误信息正确地警告了他。愚弄它不是一个好主意!我担心你会欺骗OP。根据他对保罗的回答(正确的,顺便说一句),他显然不知道自己在做什么。他只是拿了那些为他工作的代码。 – TMS 2013-07-19 14:30:46

+0

另一方面,这是一个有用的解释,让我明白了这个问题!所以也许有一点编辑,以防止可能的混淆,这是一个完美的答案。 – TMS 2013-07-19 14:47:51

1

你的问题的答案是在你得到的错误。您的数据需要投影,而不是在Latlon系统中。看看rgdal包中的spTransform来执行投影。

+0

我添加了代码,我认为你对投影坐标是正确的,但我不知道如何处理它。 – nomeus 2012-03-16 11:06:17

+0

我认为这是一个正确的答案,而不是@ Spacedman的。当然这取决于需求,但对于99.99%的情况,这是正确的答案。 – TMS 2013-07-19 14:37:56