Граничный многоугольник коллекции lat lon

У меня есть таблица, содержащая все широты и долготы некоторых мест в городе под названием queryResult, и я делаю следующее:

1 - Получите растровую карту города [например, Блэкпул]

cityMapRaster = get_map(location = 'Blackpool', zoom = 12, source = 'google', maptype = 'roadmap')

dataToShow <- ggmap(cityMapRaster) + geom_point(aes(x = Longitude, y = Latitude), data = queryResult, alpha = .5, color = "darkred", size = 1)

print(dataToShow)

и это вернет следующие точки на карте

введите описание изображения здесь

Теперь я хочу нарисовать внешнюю границу [линия границы города] всех этих широт и долгот, как в следующем ожидаемом результате

Полигон города Блэкпул

Обновление 1: ввод входных данных и применение предлагаемого решения ahull:

ggmap(cityMapRaster) + geom_point(aes(x = Longitude, y = Latitude), data = queryResult, alpha = .5, color = "darkred") + ahull.gg

Я применил решение ahull, предложенное @spacedman и @ cuttlefish44, и получил следующий результат, который сильно отличается от ожидаемого многоугольника:

Применение ahull к данным

Вы можете загрузить файл .csv, содержащий все значения широты и долготы, по следующей ссылке: Широта и долгота Блэкпула

Предлагаемая в Google граница области выглядит следующим образом:

введите описание изображения здесь


person MHOOS    schedule 21.10.2016    source источник
comment
Для меня эта граница не очень похожа на выпуклую оболочку.   -  person Spacedman    schedule 21.10.2016
comment
хороший момент @Spacedman, вы правы. Эскиз больше похож на вогнутый корпус. Я в любом случае оставлю свой ответ. Это все еще может быть полезно для тех, кто хочет выпуклый корпус.   -  person dww    schedule 21.10.2016
comment
Ваш ожидаемый многоугольник выглядит так, как будто он исключает кучу выбросов к югу от Блэкпула, и в этом случае как вы ожидали, что вогнутый корпус (который по определению включает в себя все точки) будет выглядеть примерно так? Почему бы не сделать оценку плотности ядра и не вырезать ее по некоторому значению контура?   -  person Spacedman    schedule 24.10.2016
comment
@Spacedman, я только что добавил многоугольник границы Google для этого места. На ваш взгляд, какие наборы информации необходимы для создания многоугольников, таких как тот, что показан на втором рисунке, или те, которые есть в Google? Что это за категория полигонов и как они создаются?   -  person MHOOS    schedule 24.10.2016
comment
Каков ваш приемлемый уровень точности? Как вы думаете, может ли какой-либо алгоритм воспроизвести эту точную границу с учетом зашумленных данных? Есть ли у вас еще примеры точек / границ для воспроизведения и статистического анализа такого вопроса? Вы даже пытаетесь сделать именно это - т.е. вывести формальную политическую границу по набору точек? Что вы пытаетесь сделать?   -  person Spacedman    schedule 24.10.2016
comment
@Spacedman Могу я отправить вам ответ на вышеуказанные вопросы по электронной почте? Stackoverflow не любит длинные комментарии.   -  person MHOOS    schedule 24.10.2016
comment
Нет, отредактируйте свой вопрос и воспользуйтесь возможностью, чтобы избавиться от многоугольника птичьего гнезда, который явно неправильный!   -  person Spacedman    schedule 24.10.2016


Ответы (3)


Если вам не нужна простая выпуклая оболочка (а нарисованный вами многоугольник далек от выпуклости), посмотрите на альфа-формы в пакете alphahull.

Я написал пример того, как получить многоугольник из альфа-формы с помощью этого пакета и некоторых точек, которые составляют сложную границу Норвегии:

http://rpubs.com/geospacedman/alphasimple

введите описание изображения здесь

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

person Spacedman    schedule 21.10.2016
comment
Я применил ваше решение, но результат не похож на многоугольник на втором рисунке. Можете ли вы сказать мне, что это за многоугольник на втором изображении границы? Это мой целевой многоугольник (пространственный многоугольник), и я пытаюсь воспроизвести его, используя данные широты и долготы. - person MHOOS; 24.10.2016

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

Если вы предпочитаете вогнутую границу корпуса, см. ответ от @Spacedman

library(ggmap)
cityMapRaster = get_map(location = 'Blackpool', zoom = 12, source = 'google', maptype = 'roadmap')
extent = attr(cityMapRaster, "bb")
queryResult = data.frame(Longitude = rnorm(200, as.numeric(extent[2] + extent[4])/2, 0.01),
                         Latitude = rnorm(200, as.numeric(extent[1] + extent[3])/2, 0.02))

boundary = chull(as.matrix(queryResult))

ggmap(cityMapRaster) +
  geom_point(aes(x = Longitude, y = Latitude), 
             data = queryResult, alpha = .5, color = "darkred", size = 2) +
  geom_path(aes(x = Longitude, y = Latitude), data = queryResult[c(boundary, boundary[1]),])

введите описание изображения здесь

person dww    schedule 21.10.2016

Я полагаю, queryResult - это наборы данных x и y. Насколько я понимаю, ваша граница не является выпуклой оболочкой, поэтому я использовал пакет alphahull.

  ## example `queryResult`
set.seed(1)
df <- data.frame(Longitude = runif(200, -3.05, -2.97), Latitude = rnorm(200, 53.82, 0.02))

library(alphahull)

ahull.obj <- ahull(df, alpha = 0.03)
plot(ahull.obj)   # to check

  # ahull_track() returns the output as a list of geom_path objs
ahull.gg <- ahull_track(df, alpha=0.03, nps = 1000)
  ## change graphic param
for(i in 1:length(ahull.gg)) ahull.gg[[i]]$aes_params$colour <- "green3"

ggmap(cityMapRaster) + 
  geom_point(aes(x = Longitude, y = Latitude), data = df, alpha = .5, color = "darkred") +
  ahull.gg

введите описание изображения здесь

  ## if you like not curve but linear
ashape.obj <- ashape(df, alpha = 0.015)
plot(ashape.obj)  # to check
ashape.df <- as.data.frame(ashape.obj$edge[,c("x1", "x2", "y1", "y2")])

ggmap(cityMapRaster) + 
  geom_point(aes(x = Longitude, y = Latitude), data = df, alpha = .5, color = "darkred") +
  geom_segment(aes(x = x1, y = y1, xend = x2, yend = y2), data = ashape.df, colour="green3", alpha=0.8)
person cuttlefish44    schedule 21.10.2016
comment
Как вы можете создать многоугольник, похожий на граничный многоугольник на втором рисунке? Я также дал ссылку на данные по широте. - person MHOOS; 24.10.2016
comment
@MHOOS; Я не могу понять, почему Mythop соединяется с основной областью, а не с Staining. Грубо говоря, я согласен с комментарием @ Spacedman. лучше было бы рассмотреть оценку плотности ядра, например dataToShow + geom_density_2d(data = queryResult, aes(x = Longitude, y = Latitude)). - person cuttlefish44; 24.10.2016
comment
Я добавил в Google подсказки, предлагающие граничный многоугольник для этой области. Я не уверен, если они используют оценку плотности ядра для определения многоугольника области, но я попробую. - person MHOOS; 24.10.2016