R leaflet:按组添加多边形

6
我可以帮您进行翻译。这段内容是关于Leaflet中使用group变量创建多边形的问题。
我的数据如下:
data <- data.frame(group = c("p_pladser.1", "p_pladser.1", "p_pladser.2","p_pladser.2", "p_pladser.3", "p_pladser.3", "p_pladser.4", "p_pladser.4","p_pladser.6", "p_pladser.6", "p_pladser.6"), lat = c(55.67179, 55.67171, 55.67143, 55.67135, 55.67110, 55.67099, 55.67173, 55.67158, 55.67155, 55.67154, 55.67145), long = c(12.55825, 12.55853, 12.55956, 12.55984, 12.56041, 12.56082, 12.55819, 12.55873, 12.55913, 12.55914, 12.55946))

我尝试过什么

leaflet(data) %>%
  addTiles() %>%
  addPolygons(lat = ~ lat, lng = ~ long, group = ~ group)

这将导致:

enter image description here

我需要的是停车位单独连接,在下面使用相同的数据进行ggplot2处理。
ggplot() + 
geom_line(data=data, aes(lat, long, group=group)) +
theme(legend.position="none")

enter image description here

编辑:按组创建多边形的示例数据。

df <- data.frame(group = c(9,9,9,9,3,3,4,10,4,4,6,6,9,9,6,7,8,6,6,6,4,10,10,10,10,5,5,5,5,6,2,6,8,10,4,1,1,8,2,2,8,1,1,2,3,3,1,2,3,5,5,7,7,7,7,7), lat = c(12.51324264,12.513305365,12.513460965,12.513471705,12.51323028,12.51343869,12.51002744,12.50998803,12.50981405,12.50976721,12.511631235,12.513047085,12.513872565,12.51284178,12.512897255,12.51491698,12.51098456,12.51271646,12.512567055,12.51193457,12.510672405,12.509586335,12.509513235,12.509228595,12.51019304,12.514326785,12.51430267,12.51431847,12.514476435,12.512163885,12.51235039,12.51238198,12.51063921,12.51044102,12.510237215,12.510051915,12.51031317,12.511275515,12.51133816,12.51112378,12.51150496,12.50974082,12.51063222,12.51169496,12.512893665,12.51391899,12.510612445,12.51168118,12.5127838,12.5139199,12.515012135,12.51503213,12.515610885,12.515487105,12.515415995,12.51546271), long = c(55.662148595,55.66274813,55.662200085,55.662681285,55.6618097,55.66187776,55.66261815,55.66273954,55.66191013,55.66203335,55.66224483,55.66231779,55.662361495,55.662510495,55.662309905,55.66241728,55.66220386,55.662301165,55.6622937,55.662261925,55.66218702,55.663355645,55.663463555,55.66335952,55.663351875,55.661814145,55.66214884,55.661928915,55.662022445,55.66189588,55.66176534,55.662082195,55.66289834,55.663009465,55.66231188,55.661666315,55.66180155,55.662641355,55.661861295,55.661826095,55.662688875,55.66121794,55.66126692,55.66132434,55.661389205,55.66144555,55.66141339,55.661468365,55.661532485,55.66159399,55.66165429,55.661505195,55.662096835,55.6617923,55.662226165,55.661944765))
1个回答

4

因此,您需要将您的坐标转换为一个SpatialLines对象,并使用addPolylines

下面我已经将数据转换为一个SpatialLines对象,重要的是让列出现为长和纬度。

基本上,数据被分组拆分,转换为长/纬度矩阵,然后转换为线路,并推入一个ID化的线路对象中。这一切都包含在SpatialLines中。

线路

library(leaflet)
library(sp)

# data
data <- data.frame(group = c("p_pladser.1", "p_pladser.1", "p_pladser.2","p_pladser.2", "p_pladser.3", "p_pladser.3", "p_pladser.4", "p_pladser.4","p_pladser.6", "p_pladser.6", "p_pladser.6"), lat = c(55.67179, 55.67171, 55.67143, 55.67135, 55.67110, 55.67099, 55.67173, 55.67158, 55.67155, 55.67154, 55.67145), long = c(12.55825, 12.55853, 12.55956, 12.55984, 12.56041, 12.56082, 12.55819, 12.55873, 12.55913, 12.55914, 12.55946))

# turn into SpatialLines
split_data = lapply(unique(data$group), function(x) {
  df = as.matrix(data[data$group == x, c("long", "lat")])
  lns = Lines(Line(df), ID = x)
  return(lns)
})

data_lines = SpatialLines(split_data)

leaflet(data_lines) %>%
  addTiles() %>%
  addPolylines()

enter image description here


多边形

如果你想使用多边形,那么你需要创建一个SpatialPolygons对象,这个过程和线条的创建方式类似。

由于多边形中不止四组坐标,因此您将看到一些警告信息。在构建时,它会重复使用第一对坐标,直到达到四个为止。

split_data_poly = lapply(unique(data$group), function(x) {
  df = as.matrix(data[data$group == x, c("long", "lat")])
  polys = Polygons(list(Polygon(df)), ID = x)
  return(polys)
})

data_polys = SpatialPolygons(split_data_poly)

leaflet(data_polys) %>%
  addTiles() %>%
  addPolygons()

无序多边形和颜色

这并不简单,随着点的数量增加,它变得更加复杂。真正“简单”的解决方案是从适当排序的源获取数据。一个快速的替代方案是使用凸包chull。这不能保证保持形状。

添加颜色更容易,您可以将SpatialPolygon转换为具有组及其颜色的元信息的SpatialPolygonDataFrame

下面的示例将颜色作为列包含在SpatialPolygonDataFrame中,在此示例中仅在红色和蓝色之间交替。

data <- data.frame(group = c(9,9,9,9,3,3,4,10,4,4,6,6,9,9,6,7,8,6,6,6,4,10,10,10,10,5,5,5,5,6,2,6,8,10,4,1,1,8,2,2,8,1,1,2,3,3,1,2,3,5,5,7,7,7,7,7), lat = c(12.51324264,12.513305365,12.513460965,12.513471705,12.51323028,12.51343869,12.51002744,12.50998803,12.50981405,12.50976721,12.511631235,12.513047085,12.513872565,12.51284178,12.512897255,12.51491698,12.51098456,12.51271646,12.512567055,12.51193457,12.510672405,12.509586335,12.509513235,12.509228595,12.51019304,12.514326785,12.51430267,12.51431847,12.514476435,12.512163885,12.51235039,12.51238198,12.51063921,12.51044102,12.510237215,12.510051915,12.51031317,12.511275515,12.51133816,12.51112378,12.51150496,12.50974082,12.51063222,12.51169496,12.512893665,12.51391899,12.510612445,12.51168118,12.5127838,12.5139199,12.515012135,12.51503213,12.515610885,12.515487105,12.515415995,12.51546271), long = c(55.662148595,55.66274813,55.662200085,55.662681285,55.6618097,55.66187776,55.66261815,55.66273954,55.66191013,55.66203335,55.66224483,55.66231779,55.662361495,55.662510495,55.662309905,55.66241728,55.66220386,55.662301165,55.6622937,55.662261925,55.66218702,55.663355645,55.663463555,55.66335952,55.663351875,55.661814145,55.66214884,55.661928915,55.662022445,55.66189588,55.66176534,55.662082195,55.66289834,55.663009465,55.66231188,55.661666315,55.66180155,55.662641355,55.661861295,55.661826095,55.662688875,55.66121794,55.66126692,55.66132434,55.661389205,55.66144555,55.66141339,55.661468365,55.661532485,55.66159399,55.66165429,55.661505195,55.662096835,55.6617923,55.662226165,55.661944765))

split_data_poly = lapply(unique(data$group), function(x) {
  df = as.matrix(data[data$group == x, c("long", "lat")])
  ch = chull(df) # remove me if not wanted
  df = df[ch, ] # remove me if not wanted
  polys = Polygons(list(Polygon(df)), ID = x)
  return(polys)
  return(df)
})

data_polys = SpatialPolygonsDataFrame(SpatialPolygons(split_data_poly),
                                      data.frame(group = 1:10, colour = c("red", "blue")))

leaflet(data_polys) %>%
  addTiles() %>%
  addPolygons(color = ~colour)

谢谢,如果它们都是线,这将解决问题,但当有两个以上的点时,我希望leaflet能够绘制多边形。这可行吗? - Esben Eickhardt
当然可以,你只需要创建多边形而不是线条。- 请参见上文 - zacdav
提供示例数据,我将进行翻译。 - zacdav
1
你的数据问题可能比你意识到的更严重,你应该寻找有序的数据。否则,你可能需要创建一个单独的问题,因为它不在这个问题的原始意图范围内(我已经解决了)。颜色已经添加。这就是我的回答。 - zacdav
1
感谢您的所有帮助。我已经尝试授予您奖励,但它说在17小时内我不能这样做...时间过去后,我会确保您获得50分。 - Esben Eickhardt
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接