【问题标题】:Checking if coordinate points fall on a line检查坐标点是否落在一条线上
【发布时间】:2020-04-14 03:49:19
【问题描述】:

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

【问题讨论】:

  • 你需要它准确地落在线上吗?在一定的容忍度内?以及根据哪个地球模型(投影/基准)?
  • 是的,它需要完全在线,并且是根据投影坐标系。它们应该正好落在那里,因为所有的点都在一条线段上,我只需要通过特定的线段来查看哪些点在上面。
  • 如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。但是尝试用浮点数“exatly”做任何事情都不会很好。您需要考虑一些精度误差。

标签: r mapping coordinates


【解决方案1】:

也许你可以使用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

【讨论】:

    【解决方案2】:
    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}-geometry 数据帧中是使用st_relate 函数的先决条件,但是一旦有了它们,就可以直接测试它们是否完全相交,但它们不相交(空集) .此外,他们可能永远不会在一条线上有一个点,除非它是确切的端点之一。

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

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

    【讨论】:

      猜你喜欢
      • 2011-04-18
      • 2016-07-02
      • 1970-01-01
      • 2014-06-02
      • 2013-05-29
      • 1970-01-01
      • 2014-01-20
      • 1970-01-01
      相关资源
      最近更新 更多