Проверка, попадают ли координаты на линию - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть линии (ребра), которые имеют начальный лат / долг и конечный лат / долг. У меня также есть датафрейм многих других точек, и я хочу посмотреть, находятся ли они на линии или нет. Например, начальная координата для моей линии lon = -124.1637 и lat = 40.80207, а конец (-122.4199,37.77903). Я хочу проверить, находится ли точка (-123.4167,39.50740) на линии, созданной первыми двумя координатными точками. Я действительно не уверен, как go об этом. Это в соответствии с прогнозируемой системой координат, и они должны точно ложиться на линию.

Ответы [ 2 ]

2 голосов
/ 13 апреля 2020

Возможно, вы можете использовать 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
1 голос
/ 13 апреля 2020
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

Создано в 2020-04-13 пакетом представ (v0.3.0)

Распределение точек и линий в {sf} - Геометрические кадры данных являются обязательным условием для использования функций st_relate, но как только они у вас есть, просто проверить, точно ли они пересекаются, а они - нет (пустой набор). Кроме того, они, вероятно, никогда не будут с точкой на линии, если это не одна из точных конечных точек.

Более разумный способ - проверить, как далеко точка находится от линии, здесь 1584 метра, и отфильтровать те, которые находятся выше некоторого порога (100 м × 10 м? 1 м? 0,1 м? Зависит от вашего приложение).

Чтобы проиллюстрировать эту точку, вот карта вашей контрольной точки и линии с окружающими их округами. Визуально точка определенно находится на прямой, но математически это не так.

enter image description here

...