【问题标题】:Union of circles and polygon in leaflet传单中的圆形和多边形的联合
【发布时间】:2017-07-24 14:31:59
【问题描述】:

我正在向传单地图添加两个圆圈和一个多边形。这是我绘制这三个形状的代码。有什么办法可以将这三种形状结合起来?

leaflet(options = leafletOptions(minZoom = 0, maxZoom = 18))
m <- leaflet()%>%
  addTiles()%>%
  setView(72.84320,20.43397,zoom=16)%>%
  #Add mouse position
  addMouseCoordinates(style = "basic", epsg = NULL,
                      proj4string = NULL, native.crs = FALSE)

#Runway Extremities
ARP <- c((72 +(50/60)+(32.67/3600)),(20+(26/60)+(1.54/3600)))
ptTop2 <- c((72 +(50/60)+(16.98/3600)),(20+(25/60)+(25.18/3600)))
ptBottom2 <- c((72 +(50/60)+(43.45/3600)),(20+(26/60)+(18.13/3600)))
ptTop1 <- c((72 +(50/60)+(8.64/3600)),(20+(26/60)+(8.08/3600)))
ptBottom1 <- c((72 +(50/60)+(44.21/3600)),(20+(26/60)+(5.63/3600)))
ap1 <- 95
ap2 <- 26

pt1 <- destPoint(ptTop1,ap1+90,4000)
pt2 <- destPoint(ptTop1,ap1-90,4000)
pt3 <- destPoint(ptBottom1,ap1-90,4000)
pt4 <- destPoint(ptBottom1,ap1+90,4000)
iRect <- data.frame(rbind(pt1,pt2,pt3,pt4))

#Inner Horizontal Surface
m%>%addCircles(ptBottom1[1],ptBottom1[2],radius = 4000,color = "red",
                    fillOpacity = 0,weight = 3)%>%
  addCircles(ptTop1[1],ptTop1[2],radius = 4000,color = "red",
             fillOpacity = 0,weight = 3)%>%
  addPolygons(iRect$lon,iRect$lat,color = "blue",
              fillOpacity = 0, weight=3)

rgeosgUnion() 功能,但我不知道如何将上面代码添加的圆圈转换为SpatialPolygons。

【问题讨论】:

    标签: r leaflet


    【解决方案1】:

    我建议不要使用 sp 包中的空间对象,而是查看 sf package 中的简单要素对象。

    简单特征是 R 的“新”空间类(由 sp 制作的同一个人制作)。

    所以,要获得你的圈子的联合,你可以使用

    library(rgeos)
    library(sf)
    
    
    ## A dataframe of your points
    df <- data.frame(lon = c(ptTop1[1], ptTop2[1], ptBottom1[1], ptBottom2[1]),
                     lat = c(ptTop1[2], ptTop2[2], ptBottom1[2], ptBottom2[2]))
    
    ## convert them into a simple features data.frame
    sf_df <- st_as_sf(df, coords = c("lon", "lat"))
    
    ## convert into circles
    sf_circles <- st_buffer(sf_df, dist = 0.04)
    
    ## find the union of all the circles
    sf_combined <- st_union(sf_circles)
    
    
    ## now sf_combined is a single polygon
    sf_combined
    # Geometry set for 1 feature 
    # geometry type:  POLYGON
    # dimension:      XY
    # bbox:           xmin: 72.79573 ymin: 20.38366 xmax: 72.88561 ymax: 20.47837
    # epsg (SRID):    NA
    # proj4string:    NA
    # POLYGON((72.8745460445306 20.4072956786729, 72....
    

    至于绘图,leaflet 可以处理sf 对象(MULTIPOINT 除外),所以你可以直接绘图

    library(leaflet)
    
    sp <- as(sf_combined, 'Spatial')
    
    sf_combined %>%
        leaflet() %>%
        addTiles() %>%
        addPolygons()
    

    【讨论】:

    • 感谢您指出sf 包。这正是我需要的!
    • @Dhiraj - 不客气。我发现习惯sf 需要一段时间,但最终还是值得的。
    • leaflet 确实支持所有主要的 sf 类,但 MULTIPOINT 因此不需要转换为 sp在这里。
    • @TimSalabim - 你完全正确!我一定已经过时了。现已更新 - 谢谢
    • @SymbolixAU 我现在被困在尝试将多边形与圆的联合相结合。我有一个多边形rect1 &lt;- st_polygon(list(cbind(lon=c(pt1[1],pt2[1],pt3[1],pt4[1],pt1[1]), lat=c(pt1[2],pt2[2],pt3[2],pt4[2],pt1[2])))) ,但是当我尝试将它与组合圆结合时,我看不到任何变化sf_combined1 &lt;- st_union(sf_combined1,rect1,by_feature = F)
    【解决方案2】:

    据我所知,你不能。每当您在传单地图上添加某些内容时,它都会被视为一个单独的图层,具有单独的属性和数据:

    • 这个想法是能够使用交互式隐藏/显示这些层 图例(因此您希望将图层分开)
    • 我没有看到任何简单的方法来访问每个圆点的坐标

    如果你想显示由几个形状组成的东西,你必须自己创建一个复杂的 SpatialPolygon 点坐标、sp 包和这种代码:

    require(sp)
    require(leaflet)
    
    #Used for sp polygon creation
    createPolygon <- function(latitude, longitude, name = "polygon"){
    
      return(Polygons(list(Polygon(cbind(longitude, latitude))), ID = name))
    
    }
    
    #Will give "res" points coordinates for a circle centered on x0 y0
    #with a radius r
    CreateCircle <- function(x0, y0, r, res = 50){
    
      theta = seq(0, 2*pi, length.out = res+1)
    
      x = r*cos(theta) + x0
      y = r*sin(theta) + y0
    
      return(data.frame(x, y))
    
    }
    
    #Computes two circles points'
    circleA <- CreateCircle (0, 0, 2, res = 200)
    circleB <- CreateCircle (10, 10, 4, res = 6)
    
    #Add them to polygons
    A = createPolygon(circleA$x, circleA$y, "A")
    B = createPolygon(circleB$x, circleB$y, "B")
    C = SpatialPolygons(list(A, B))
    
    #Create and display the leaflet map
    m = leaflet() %>% addTiles() %>%
      addPolygons(data = C, fillColor = topo.colors(10, alpha = NULL), stroke = TRUE)
    m
    

    如果它无法显示您想要的结果(例如,因为您希望圆圈具有与矩形不同的颜色),您将不得不使用多个图层并将它们分组。

    【讨论】:

    • 谢谢@Kevin Dallaporta 我一定会试一试的。您能告诉我如何将圆绘制为空间多边形吗?
    • 当然,我在最小示例中添加了一些代码行:)。如果要在传单地图上显示自定义形状,则需要设计“CreateCircle”等功能
    • @Kevin Dallaporta,感谢您的帮助,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    • 2021-02-02
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多