检查坐标点是否落在一条线上

Checking if coordinate points fall on a line

我有起始 lat/lon 和终止 lat/lon 的线(边)。我还有很多其他点的数据框,我想看看它们是否在线。例如,我的线的起点坐标是 lon=-124.1637 和 lat=40.80207,终点是 (-122.4199,37.77903)。我想验证点 (-123.4167,39.50740) 是否落在由前两个坐标点创建的线上。我真的不知道该怎么做。这是根据投影坐标系,它们的点需要正好落在直线上。

library(sf)
#> Linking to GEOS 3.7.2, GDAL 2.4.2, PROJ 5.2.0
test_line <- st_linestring(
  matrix(
    c(-124.1637, 40.80207, -122.4199, 37.77903), 
    nrow = 2, byrow = T
    )
  ) %>% 
  st_sfc() %>% 
  st_set_crs(4326)

test_pt <- st_point(c(-123.4167, 39.50740)) %>% 
  st_sfc() %>% 
  st_set_crs(4326)

st_intersects(test_pt, test_line)
#> although coordinates are longitude/latitude, st_intersects assumes that they are planar
#> Sparse geometry binary predicate list of length 1, where the predicate was `intersects'
#>  1: (empty)

st_distance(test_pt, test_line)
#> Units: [m]
#>          [,1]
#> [1,] 1583.654

reprex package (v0.3.0)

于 2020-04-13 创建

将点和线排列到 {sf} 几何数据框中是使用 st_relate 函数的先决条件,但是一旦有了它们,就可以直接测试它们是否完全相交,而它们并没有't(空集)。此外,它们可能永远不会在线上有一个点,除非它是确切的端点之一。

一个更聪明的方法是测试点离线有多远,这里是 1,584 米,并过滤掉那些超过某个阈值(100 m?10 m?1 m?0.1 m?取决于您的应用程序)的点).

为了说明这一点,这是一张测试点和测试线的地图,以及它们周围的县。从视觉上看,该点肯定在直线上,但从数学上看,它不是。

也许你可以使用approx(线性插值)来检查点是否在直线上,例如

> approx(df$lon,df$lat,-123.4167)$y==39.50740
[1] FALSE

数据

df <- structure(list(lon = c(-124.1637, -122.4199), lat = c(40.80207, 
37.77903)), class = "data.frame", row.names = c(NA, -2L))

> df
        lon      lat
1 -124.1637 40.80207
2 -122.4199 37.77903