Союз кругов и многоугольника в листовке
Я добавляю два круга и многоугольник на карту листовки. Вот мой код, который отображает эти три фигуры. Есть ли способ, которым я могу получить объединение этих трех форм?
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)
rgeos
имеет gUnion()
функция, но я не уверен, как преобразовать круги, которые были добавлены с помощью кода выше, в SpatialPolygons.
2 ответа
Я бы порекомендовал отойти от пространственных объектов от sp
пакет и вместо этого посмотрите на простые объекты объектов из sf
пакет
Простые функции являются "новым" пространственным классом для 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....
Что касается печати, листовка может обрабатывать sf
объекты (кроме MULTIPOINT), так что вы можете построить его напрямую
library(leaflet)
sp <- as(sf_combined, 'Spatial')
sf_combined %>%
leaflet() %>%
addTiles() %>%
addPolygons()
Насколько я знаю, ты не можешь. Всякий раз, когда вы добавляете что-то на карту листовки, это рассматривается как отдельный слой с отдельными свойствами и данными:
- Идея состоит в том, чтобы иметь возможность скрывать / показывать эти слои, используя интерактивные легенды (поэтому вы хотите, чтобы ваши слои были разделены)
- Я не вижу простого способа получить доступ к координатам точек каждого круга
Если вы хотите отобразить что-то, состоящее из нескольких фигур, вам придется самостоятельно создать сложный 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
Если он не может отобразить желаемый результат (например, потому что вы хотите, чтобы круги были другого цвета, чем ваши прямоугольники), вам придется использовать несколько слоев и сгруппировать их.