2015-09-16 2 views
6

Я только начинаю изучать R, но хотел бы, чтобы проект был выполнен раньше, чем позже. Это довольно просто: у меня есть столбец X и столбец Y, состоящий из координат X и Y координат. (Работа в системе координат NAD27). Исходя из первой координаты, я хотел бы найти ближайшую точку в наборе данных, а затем перейти к следующей координате и найти ее ближайшую точку в том же наборе данных. В идеале, он будет проходить через каждую точку и определять ближайшую точку.Найти ближайшую координату X, Y, используя R

point x   y 
1  1601774 14544454 
2  1616574 14579422 
3  1608698 14572922 
4  1602948 14572990 
5  1607355 14573871 
6  1615336 14578178 
7  1603398 14574495 
8  1605153 14570727 
9  1606758 14573845 
10 1606655 14570953 
+3

Добро пожаловать в переполнение стека! Пожалуйста, включите небольшой образец данных (я не знаком с системой координат NAD27, и я бы предположил, что другие могут быть тоже). Кроме того, пожалуйста, укажите любой код, который вы пытались выполнить. – josliber

+0

Почему отрицательные моменты? Это хороший вопрос. Попросите его отредактировать вопрос. – Soheil

+4

'sp :: spDists' или' rgeos :: gDistance' должны помочь, но сначала вам нужно попробовать что-то (люди не просто собираются писать код) – hrbrmstr

ответ

7

Вот один из способов, используя пакет RANN. Этот подход аналогичен описанному в this post, но адаптирован для одного набора точек (связанная запись заключалась в нахождении ближайшей точки в множестве A каждой точке в множестве B).

xy <- read.table(text='point x   y 
1  1601774 14544454 
2  1616574 14579422 
3  1608698 14572922 
4  1602948 14572990 
5  1607355 14573871 
6  1615336 14578178 
7  1603398 14574495 
8  1605153 14570727 
9  1606758 14573845 
10 1606655 14570953', header=TRUE, row.names=1) 

library(RANN) 
closest <- nn2(data=xy, k=2)[[1]] 

Выше мы поставляем ваш единственный набор точек, xy, к data аргумента, и указать, что мы хотим nn2 найти два ближайших точек для каждой точки (потому что ближайшая точка является координационным центром сам). Функция nn2 возвращает список с двумя элементами: вектор (матрица, в данном случае) индексов каждого из k ближайших точек (для каждой запрашиваемой точки); и вектор (матрица) расстояний. Я предполагаю, что нас не интересуют расстояния, поэтому выше мы подмножаем результат на первый элемент.

Для нашей задачи результатом является матрица с двумя столбцами, которая дает индекс запрашиваемой точки в первом столбце и индекс ближайшей точки во втором.

closest 

##  [,1] [,2] 
## [1,] 1 8 
## [2,] 2 6 
## [3,] 3 5 
## [4,] 4 7 
## [5,] 5 9 
## [6,] 6 2 
## [7,] 7 4 
## [8,] 8 10 
## [9,] 9 5 
## [10,] 10 8 

Чтобы получить матрицу координат ближайших точек, вы можете использовать:

xy[closest[, 2], ] 

По умолчанию nn2 использует кД дерево - вы можете экспериментировать с treetype='bd'.

+0

Это выглядит потрясающе.Просто чтобы убедиться, что я правильно понимаю, ближайшая точка к координате 1, является координатой 8? А с координатой 2 это координата 6 и т. Д.? – jhenson

+0

@jhenson - это правильно (ну, ближайшая точка к координате 1 - координата 1, а вторая ближайшая - 8, но да, вы получаете изображение) – jbaums

+0

Право! Большое спасибо, он работает потрясающе с моими данными до сих пор. – jhenson

Смежные вопросы