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")