计算一个点与海岸之间的最小距离。

10

我正在尝试获取给定点与海岸之间的最小距离。例如,我需要计算从马德里到海岸的距离:

library(rgeos)
library(maptools)
coast <- readShapeLines("Natural_Earth_quick_start/10m_physical/ne_10m_coastline.shp")
MAD = readWKT("POINT(-3.716667 40.383333)")
gDistance(MAD,coast)
[1] 3.021808

我不太理解 gDistance() 返回的内容。文档说它是投影单位,这是否意味着它以经纬度度数为单位?我该如何将其转换为公里?


你能提供一下你的地图链接吗?首先,输入 proj4string(coast) 来查看投影方式。如果有一个 +units=' 字符串,那么这些就是单位。 - jlhoward
1
我正在使用的地图是来自http://www.naturalearthdata.com/downloads/10m-physical-vectors/的海岸线。`proj4string(coast)`返回`NA`。 - user525602
你看过从帮助页面链接的Hausdorff距离的定义吗?我理解这个答案是以“度”为单位,但我并不完全相信这是有意义的,因为在赤道附近,每个“度”代表的公里数约为100公里,而在极地附近则为零。 - IRTFM
1个回答

14
gDistance(...)返回给定点和要素集之间的最小笛卡尔(欧几里得)距离。由于您的地图是经纬度坐标,因此获得的距离为“度数”,例如:

d = sqrt { (long1 - long2)2 + (lat1 - lat2)2 }

其中long和lat以十进制度表示。正如所指出的那样,这并没有多大意义,因为将其转换为平面距离(例如,公里)取决于您所在的位置。因此,我们需要将数据转换为在感兴趣区域内近似平面的CRS。事实证明,西班牙的适当CRS是EPSG-2062。EPSG-2062的投影字符串为:
+proj=lcc +lat_1=40 +lat_0=40 +lon_0=0 +k_0=0.9988085293 +x_0=600000 +y_0=600000 +a=6378298.3 +b=6356657.142669561 +pm=madrid +units=m +no_defs 

数据中采用的单位为+units=m(米),因此我们需要将点(MAD)和边界投影到EPSG-2062。

library(rgeos)
library(maptools)

epsg.2062 <- "+proj=lcc +lat_1=40 +lat_0=40 +lon_0=0 +k_0=0.9988085293 +x_0=600000 +y_0=600000 +a=6378298.3 +b=6356657.142669561 +pm=madrid +units=m +no_defs"
wgs.84    <- "+proj=longlat +datum=WGS84 +no_defs +ellps=WGS84 +towgs84=0,0,0"

coast <- readShapeLines("ne_10m_coastline",CRS(wgs.84))
MAD   <- readWKT("POINT(-3.716667 40.383333)",p4s=CRS(wgs.84))
gDistance(MAD,coast)            # WGS-84 (long/lat) projection, units in "degrees"
# [1] 3.021808

coast.proj <- spTransform(coast,CRS(epsg.2062))
MAD.proj   <- spTransform(MAD,CRS(epsg.2062))
gDistance(MAD.proj,coast.proj)  #EPSG-2062 projection, units are in meters.
# [1] 305171.2

因此,最小距离为约305.2公里。

最后,请注意您的海岸线文件包含世界上所有海岸线,因此这是到达某些海岸线的最小距离,不一定是西班牙海岸(尽管在这种情况下,它确实位于西班牙北部海岸)。如果您的参考点非常接近与葡萄牙的边界,则最近的海岸点将位于葡萄牙西海岸。


谢谢!这正是我想要的。你怎么知道那是北海岸? - user525602
简短回答是我查看了地图,但再次查看后,马德里可能更靠近卡斯特利翁附近的地中海海岸。有一种方法可以确定最近点的坐标,但比较复杂。如果您需要知道,请发布一个单独的问题。 - jlhoward
2
这看起来很不错,但是在全球范围内计算点到最近海岸的距离时,我应该使用什么投影方式呢?我有大约250个点! - I Del Toro
这个答案不太适用于一般情况。 - Richard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接