我想用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
Run Code Online (Sandbox Code Playgroud)
显然命令的坐标有问题.我尝试了一些方法,但没有找到解决方案.
我找到的关于点周围缓冲区的另一个例子如下,但我不确定如何在我的情况下使用它:http: //r-sig-geo.2731867.n2.nabble.com/compute-buffer-from -点-shape文件到有-shape文件,td4574666.html
有任何想法吗?
最好的问候,Stefan
//更新:
减少到相关部分,这里是代码:
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))
Run Code Online (Sandbox Code Playgroud)
可能是这条线:
是预测:FALSE是问题的原因,但我不知道如何使用spTranform以及如何找到正确的投影.
想想你的缓冲区大小是1.0单位.那将是一个长度为1.0度的长度.这没有多大意义,因为1度NS与1度EW不同.GEOS试图阻止你做一些它认为有点奇怪的事情.
因此,您可以通过将其分配给几乎任何投影坐标CRS字符串,执行缓冲区,然后将其分配回来来欺骗它.潜在的数字不会改变.例如,如果你这样做:
proj4string(l2) = CRS("+init=epsg:27700")
Run Code Online (Sandbox Code Playgroud)
你在系统中说这些数字是Uk Grid米.然后你做缓冲区,你给你知道的单位是真度.GEOS使用数字进行计算,假设点在网格上(而不是球体).然后你只需设置CRS.数字不会改变.
实际上,似乎有一个适当的ESPG代码用于预测的lat-long,所以忽略前一行,并执行:
proj4string(l2) = CRS("+init=epsg:3395")
Run Code Online (Sandbox Code Playgroud)
这里的EPSG代码数据库:http://www.epsg-registry.org/ - 请注意epsg:3395详细信息中的"范围"是"非常小规模的映射".
如果你真的想要以米为单位的缓冲区,那么你必须使用spTransform转换为公制投影(对于英国的工作,我总是使用epsg:27700),这确实会改变基础数字.