【问题标题】:R- Calculating the minimum distance between points and linesR-计算点和线之间的最小距离
【发布时间】:2018-05-21 01:47:21
【问题描述】:

我有大量的地块多边形 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

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

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

谢谢!

用数据编辑

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

【问题讨论】:

  • 你应该发布一些工作代码。提供一些用代码创建的简单示例数据;有很多这样的例子。
  • @RobertH 在弄清楚了一些事情后添加了一些代码/澄清了一点。我编辑的帖子的最后一部分应该解释我的关键问题

标签: r distance spatial geosphere


【解决方案1】:

我建议您查看Universal Transverse Mercator system。我不知道它是否是最好的投影坐标系,但它是我看到在我的领域中最常用的一种(只要研究区域不是太大)。

找到特定于您所在地区的 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()

【讨论】:

  • 如果距离涉及到非常不同的 UTM 区域怎么办?比如说,每个俄罗斯城市到白令海峡的距离?
猜你喜欢
  • 2014-01-28
  • 2013-10-08
  • 2018-11-06
  • 1970-01-01
  • 2018-07-14
  • 2019-10-17
  • 2014-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多