R 如何使用shiny中的传单将多段线从一个位置分别添加到其他位置?
我正在尝试使用R 如何使用shiny中的传单将多段线从一个位置分别添加到其他位置?,r,shiny,leaflet,R,Shiny,Leaflet,我正在尝试使用addPolylinesfrom传单将多段线从一个特定位置添加到shinnyR中的许多其他位置。但是,我不能从一个位置链接到其他位置,我只能将它们按顺序链接在一起。我想要实现的最好的例子是板球车轮图: 观察({ long.path这是一种基于mapview包的可能方法。只需创建SpatialLines将起点与每个终点(存储在位置)连接起来,将它们绑定在一起,并使用mapview显示数据 library(mapview) library(raster) ## start poin
addPolylines
from传单将多段线从一个特定位置添加到shinnyR中的许多其他位置。但是,我不能从一个位置链接到其他位置,我只能将它们按顺序链接在一起。我想要实现的最好的例子是板球车轮图:
观察({
long.path这是一种基于mapview包的可能方法。只需创建SpatialLines
将起点与每个终点(存储在位置
)连接起来,将它们绑定在一起,并使用mapview
显示数据
library(mapview)
library(raster)
## start point
root <- matrix(c(-73.993438700, 40.750545000), ncol = 2)
colnames(root) <- c("Long", "Lat")
## end points
locations <- data.frame(Long = (-78):(-70), Lat = c(40:44, 43:40))
## create and append spatial lines
lst <- lapply(1:nrow(locations), function(i) {
SpatialLines(list(Lines(list(Line(rbind(root, locations[i, ]))), ID = i)),
proj4string = CRS("+init=epsg:4326"))
})
sln <- do.call("bind", lst)
## display data
mapview(sln)
库(mapview)
图书馆(光栅)
##起点
root我知道这是一年前提出的,但我有同样的问题,并在传单中找到了解决方法
首先,您必须调整数据框,因为addPolyline只是将所有坐标连接在一个序列中。似乎您知道您的起始位置,并希望它分支到9个单独的位置。我将从您的结束位置开始。由于您没有提供它,我将创建一个具有4个单独结束位置的数据框用于本演示的位置
dest_df <- data.frame (lat = c(41.82, 46.88, 41.48, 39.14),
lon = c(-88.32, -124.10, -88.33, -114.90)
)
最后应该是这样的:
我希望这能帮助那些希望在将来做类似事情的人
我知道OP要求提供传单答案。但这个问题激发了我寻求替代解决方案的兴趣,所以这里有两个
示例-mapdeck
Mapdeck(我的软件包)在Mapbox地图上使用Deck.gl,因此您需要一个Mapbox API键来使用它。但它确实允许您绘制2.5d圆弧
它适用于data.frames
和data.tables
(以及sp
和sf
)对象
center <- c(144.983546, -37.820077)
df_hits$center_lon <- center[1]
df_hits$center_lat <- center[2]
df_hits$score <- sample(c(1:4,6), size = nrow(df_hits), replace = T)
library(mapdeck)
set_token("MAPBOX")
mapdeck(
style = mapdeck_style("satellite")
) %>%
add_arc(
data = df_hits
, origin = c("center_lon", "center_lat")
, destination = c("lon", "lat")
, stroke_from = "score"
, stroke_to = "score"
, stroke_width = "score"
, palette = "magma"
)
dplyr
等效值为
df_hits %>%
mutate(hit = row_number(), score = sample(c(1:4,6), size = n(), replace = T)) %>%
group_by(hit, score) %>%
mutate(
polyline = encodeCoordinates(c(lon, center[1]), c(lat, center[2]))
)
资料
df_点击@Wilcar。我注意到这不是你最初的问题,而是1)你在David的答案中遗漏了什么?2)问题中的代码不可复制,…你是对的,这不是一个可复制的例子,我正在传单中寻找一个简单有效的解决方案(@David answer compute x2 lines和@fdetsch answer use mapview)geosphre包可能是最好的解决方案,但不能在shiny中工作(警告:[:subscript out-bounds Error in observe click event中出错)没有收到通知,sry。好吧,再次强调,你没有以可复制的方式分享你的尝试。这样,根据我的经验,没有多少人会尝试回答。只是一个友好的指针,……祝你好运!我今天碰巧看到了这篇文章。我没有意识到你开发了更多与GIS相关的软件包。这篇文章真的很酷。
orig_df$sequence <- c(sequence = seq(1, length.out = nrow(orig_df), by=2))
dest_df$sequence <- c(sequence = seq(2, length.out = nrow(orig_df), by=2))
library("sqldf")
q <- "
SELECT * FROM orig_df
UNION ALL
SELECT * FROM dest_df
ORDER BY sequence
"
poly_df <- sqldf(q)
library("leaflet")
leaflet() %>%
addTiles() %>%
addPolylines(
data = poly_df,
lng = ~lon,
lat = ~lat,
weight = 3,
opacity = 3
)
center <- c(144.983546, -37.820077)
df_hits$center_lon <- center[1]
df_hits$center_lat <- center[2]
df_hits$score <- sample(c(1:4,6), size = nrow(df_hits), replace = T)
library(mapdeck)
set_token("MAPBOX")
mapdeck(
style = mapdeck_style("satellite")
) %>%
add_arc(
data = df_hits
, origin = c("center_lon", "center_lat")
, destination = c("lon", "lat")
, stroke_from = "score"
, stroke_to = "score"
, stroke_width = "score"
, palette = "magma"
)
library(data.table)
library(googleway)
library(googlePolylines) ## gets installed when you install googleway
center <- c(144.983546, -37.820077)
setDT(df_hits) ## data given at the end of the post
## generate a 'hit' id
df_hits[, hit := .I]
## generate a random score for each hit
df_hits[, score := sample(c(1:4,6), size = .N, replace = T)]
df_hits[
, polyline := encodeCoordinates(c(lon, center[1]), c(lat, center[2]))
, by = hit
]
set_key("GOOGLE_MAP_KEY") ## you need an API key to load the map
google_map() %>%
add_polylines(
data = df_hits
, polyline = "polyline"
, stroke_colour = "score"
, stroke_weight = "score"
, palette = viridisLite::plasma
)
df_hits %>%
mutate(hit = row_number(), score = sample(c(1:4,6), size = n(), replace = T)) %>%
group_by(hit, score) %>%
mutate(
polyline = encodeCoordinates(c(lon, center[1]), c(lat, center[2]))
)
df_hits <- structure(list(lon = c(144.982933659011, 144.983487725258,
144.982804912978, 144.982869285995, 144.982686895782, 144.983239430839,
144.983293075019, 144.983529109412, 144.98375441497, 144.984103102141,
144.984376687461, 144.984183568412, 144.984344500953, 144.984097737723,
144.984065551215, 144.984339136535, 144.984001178199, 144.984124559814,
144.984280127936, 144.983990449363, 144.984253305846, 144.983030218536,
144.982896108085, 144.984022635871, 144.983786601478, 144.983668584281,
144.983673948699, 144.983577389175, 144.983416456634, 144.983577389175,
144.983282346183, 144.983244795257, 144.98315360015, 144.982896108085,
144.982686895782, 144.982617158347, 144.982761997634, 144.982740539962,
144.982837099486, 144.984033364707, 144.984494704658, 144.984146017486,
144.984205026084), lat = c(-37.8202049841516, -37.8201201023877,
-37.8199253045246, -37.8197812267274, -37.8197727515541, -37.8195269711051,
-37.8197600387923, -37.8193828925304, -37.8196964749506, -37.8196583366193,
-37.8195820598976, -37.8198956414717, -37.8200651444706, -37.8203575362288,
-37.820196509027, -37.8201032825917, -37.8200948074554, -37.8199253045246,
-37.8197897018997, -37.8196668118057, -37.8200566693299, -37.8203829615443,
-37.8204295746001, -37.8205355132537, -37.8194761198756, -37.8194040805737,
-37.819569347103, -37.8197007125418, -37.8196752869912, -37.8195015454947,
-37.8194930702893, -37.8196286734591, -37.8197558012046, -37.8198066522414,
-37.8198151274109, -37.8199549675656, -37.8199253045246, -37.8196964749506,
-37.8195862974953, -37.8205143255351, -37.8200270063298, -37.8197430884399,
-37.8195354463066)), row.names = c(NA, -43L), class = "data.frame")