【问题标题】:How to compute a Line-Buffer with SpatialLinesDataFrame如何使用 SpatialLinesDataFrame 计算行缓冲区
【发布时间】:2012-04-01 21:21:24
【问题描述】:

我想在带有 wgs84 坐标的 line-shapefile 周围创建一个缓冲区。

我准备了一个带有单个线段和基准的 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 以及如何找到正确的投影。

【问题讨论】:

  • 告诉我们你尝试了什么,对我们不知道你已经做了什么,除了你做了什么。

标签: r gis spatial


【解决方案1】:

考虑一下 1.0 单位的缓冲区大小。这将是,在经纬度,1.0 度。这没有多大意义,因为 1 度 N-S 与 1 度 E-W 不同。 GEOS 试图阻止你做一些它认为有点奇怪的事情。

因此,您可以通过为其分配几乎任何投影坐标 CRS 字符串、执行缓冲区、然后将其分配回来来欺骗它。基础数字不会改变。例如,如果你这样做:

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

您在向系统撒谎,这些数字是英国网格米。然后你做缓冲,你给你知道的单位是度数。 GEOS 使用数字进行计算,假设点位于网格(而不是球体)上。然后,您只需将 CRS 设置回去。数字不变。

实际上,似乎有一个合适的 ESPG 代码用于投影经纬度,所以忽略上一行,然后:

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

这里的 EPSG 代码数据库:http://www.epsg-registry.org/ - 请注意 epsg:3395 详细信息中的“范围”是“非常小比例尺映射”。

如果您真的想要以米为单位的缓冲区,那么您必须使用 spTransform 转换为公制投影(对于在英国工作,我总是使用 epsg:27700),它确实改变了基础数字。

【讨论】:

  • 你确定这是 OP @nomeus 想要的吗?? 他没有说他想用 lat-lon 数字制作缓冲区!不太可能有人想做这种疯狂的事情。所以我认为错误信息是正确地警告他。愚弄它不是一个好主意!恐怕您反而愚弄了OP。根据他对保罗(正确,顺便说一句)回答的评论,他显然不知道自己在做什么!他只是拿走了对他有用的代码。
  • 另一方面,这是一个有用的解释,让我理解了这个问题!因此,也许可以进行一些编辑以防止可能的混淆,这是一个完美的答案。
【解决方案2】:

您的问题的答案在于您得到的错误。您的数据需要被投影,而不是在 latlon 系统中。查看 rgdal 包中的 spTransform 以执行投影。

【讨论】:

  • 我添加了代码,我认为您对投影坐标的看法是正确的,但我不确定如何处理。
  • 我认为这是一个正确的答案,而不是@Spacedman 的。当然这取决于需求,但对于 99.99% 的情况,这是正确的答案。
猜你喜欢
  • 1970-01-01
  • 2010-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多