1

我有一大组地块的多边形 shapefile(用于 50 多个县),我想遍历每个地块并计算从每个地块的中心到最近的铁路的距离,并在全国范围内存储在 line shapefile 中。

为此,我提出了两种不同的措施:geospheres 包中的 point2Line 和 rgeos 包中的 gDistance。每个人对我都有不同的问题。

对于 point2line,我的代码如下所示:

rail_projection <-spTransform(rail_file,CRS(proj4string(parcels)) #project to same CRS
rail_crop<-crop(rail_projection,extent(parcels)) #crop to extent of parcels
centroids<-gCentroid(parcels,byid=T) # take centroid of parcel polygons.
m<-gDistance(rail_crop,centroids,byid=T)

但这会发出以下警告:

Warning messages:
1: In RGEOSDistanceFunc(rail_crop, centroids, byid=T, "rgeos_distance") :
Spatial object 1 is not projected; GEOS expects planar coordinates
2: In RGEOSDistanceFunc(rail_crop, centroids, byid=T, "rgeos_distance") :
Spatial object 2 is not projected; GEOS expects planar coordinates

它还给了我一个 nparcels X (我认为行矩阵的数量)的数字,我不太确定这些数字的测量值。我想要以公里或英里为单位的测量值。

第二种方法,使用 dist2line 看起来像这样: dist<-dist2Line(centroids,rail_crop) 它工作正常,但唯一的问题是它需要很长时间!环游 60 个左右的县,可能需要几天时间。此外,如果最近的铁路在另一个县,我宁愿不必裁剪铁路 shapefile。使用整个 shapefile 运行代码需要更长的时间。

所以我本质上要寻找的是一种以相当有效的方式获得从点到线形状文件的最近距离的方法,该方式以公里或英里为单位吐出距离,或者类似的可解释的东西。如果这可以通过 gDistance 以没有这些错误的方式完成,那就太好了!如果有一种方法可以从 dist2Line 或其他方法加速它,那也很棒。如果您对如何使用一些缓冲区裁剪轨道 shapefile 也有任何想法,我也将不胜感激。(我不能发布代码,因为包裹数据是专有的)

我仍然是空间问题的初学者,如果我无法理解或者之前已经回答过这个问题,我很抱歉。我环顾四周,并没有找到我能够在这里工作的解决方案。

谢谢!

用数据编辑

所以我想我知道我的警告信息是从哪里来的this。我使用的是 3d 坐标系而不是平面坐标系。我已经使用从互联网上为威斯康星州的一个县下载的 shapefile 运行了一些代码,gDistance 输出了一个矩阵,其中包含地块数 x 每个地块到每条铁路线的距离(我假设)的线数。有谁知道这些距离的测量值是多少?如何将它们转换为 KM 或英里?还有一个我应该使用的“首选”平面投影。此外,任何关于如何用一些缓冲区裁剪 shapefile 的想法都将不胜感激。文件/代码可以在这里找到

4

1 回答 1

1

我建议研究通用横向墨卡托系统。我不知道它是不是最好的投影坐标系,但它是我在我的领域中看到最常用的一种(只要研究区域不是太大)。

找到特定于您所在地区的 UTM 区域后,您可以使用sp::spTransform()重新投影 shapefile,以便gDistance()以公里或米为单位返回您的距离。

这是覆盖肯尼亚的 UTM 区域的 proj4string +proj=utm +zone=37 +south +ellps=WGS84 +datum=WGS84 +units=m +no_defs:. 如您所见,这里的单位是米 ( +units=m)。

可能值得您花时间研究相对较新的sf包,它简化并标准化了空间数据的函数和类。这是一个简短的介绍,您可以查看:http ://strimas.com/r/tidy-sf/ 。该包中的类似功能是st_transform()st_distance()

于 2017-12-08T21:48:44.880 回答