2

我有一个表,其中包含一个名为 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

我应用了@spacedman 和@cuttlefish44 建议的 ahull 解决方案,得到的结果与预期的多边形大不相同:

将 ahull 应用于数据

您可以从以下链接下载包含所有纬度和经度的 .csv 文件:Blackpool Lat,Lon

Google 建议的区域边界如下所示:

在此处输入图像描述

4

3 回答 3

1

如果您不想要一个简单的凸包(并且您绘制的多边形远离凸包),请查看 alphahull 包中的 alpha-shapes。

我写了一个示例,说明如何使用该包和一些构成复杂挪威边界的点从 alpha 形状中获取多边形:

http://rpubs.com/geospacedman/alphasimple

在此处输入图像描述

您应该能够按照它为您的数据获取一个多边形,而且现在它甚至可能更简单,因为那是几年前的事了。

于 2016-10-21T18:03:20.783 回答
0

我想queryResult是 x 和 y 数据集。据我所知,你的边界不是凸包,所以我使用了alphahullpackage.

  ## 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)
于 2016-10-21T18:44:01.577 回答
0

这是一个可重现的示例,说明如何使用它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]),])

在此处输入图像描述

于 2016-10-21T17:56:37.817 回答