在echarts4r中为点设置半径
我正在使用 echarts4r 包来绘制一个带有若干点的地图。对于每个点,我想在点周围添加一个半径圆来显示该区域。例如,对于每个点来说,我想添加一个半径为50公里的圆。下面给出一段可复现实例的代码,用来创建一个带有若干点的地图:
library(tidyverse)
library(echarts4r)
library(sf)
library(httr)
url <- paste0("https://service.pdok.nl/cbs/gebiedsindelingen/2024/wfs/v1_0?request=GetFeature&service=WFS&typeName=gebiedsindelingen:gemeente_gegeneraliseerd&outputFormat=json&version=2.0.0&srsname=urn:ogc:def:crs:EPSG::4326")
geo_data <- httr::GET(url) %>%
httr::content()
locations <- data.frame(
name = c("Amsterdam", "Utrecht"),
lon = c(4.9041, 5.1214),
lat = c(52.3676, 52.0907)
)
locations |>
e_charts(lon) |>
echarts4r::e_map_register("NL", geo_data) |>
e_geo(map = "NL", nameProperty = "statnaam") |>
e_scatter(lat, name = "City", coord_system = "geo")
Output:
如你所见,我们有两个蓝色点。现在我想为每个点添加半径为50公里的圆。也许可以通过 e_polygon_g 来实现,但我不知道该怎么做。有人知道怎样在echarts4r中给点添加圆圈吗?
解决方案
你可以使用 这个 在每个点周围构建圆形坐标,然后通过 e_data() 提供这些数据;最后用 e_lines 来显示。圆圈为红色且为虚线样式——若想了解更多线条样式,请查看 这个。与荷兰的普通地图相比,echarts-map看起来宽度略大,这也导致圆圈看起来像椭圆。
library(echarts4r)
library(httr)
library(sf)
url <- "https://service.pdok.nl/cbs/gebiedsindelingen/2024/wfs/v1_0?request=GetFeature&service=WFS&typeName=gebiedsindelingen:gemeente_gegeneraliseerd&outputFormat=json&version=2.0.0&srsname=urn:ogc:def:crs:EPSG::4326"
geo_data <- httr::GET(url) |>
httr::content()
locations <- data.frame(
name = c("Amsterdam", "Utrecht"),
lon = c(4.9041, 5.1214),
lat = c(52.3676, 52.0907)
)
make_circles <- function(X, radius_km) {
pts <- st_as_sf(X, coords = c("lon", "lat"), crs = 4326)
pts_proj <- st_transform(pts, 3857)
outer <- st_buffer(pts_proj, radius_km * 1000)
rings <- st_transform(outer, 4326)
do.call(rbind, lapply(seq_len(nrow(rings)), \(i){
lon <- rings[[2]][[i]][[1]][,1]
lat <- rings[[2]][[i]][[1]][,2]
data.frame(
value = rings$name[i],
start_lon = lon[-length(lon)],
start_lat = lat[-length(lat)],
end_lon = lon[-1],
end_lat = lat[-1]
)
}))
}
locations |>
e_charts(lon) |>
e_map_register("NL", geo_data) |>
e_geo(map = "NL", nameProperty = "statnaam") |>
e_scatter(lat, name = "City", coord_system = "geo") |>
e_data(make_circles(locations, 50)) |>
e_lines(
start_lon,
start_lat,
end_lon,
end_lat,
value = value,
coord_system = "geo",
symbol = "none",
name = "50km Radius",
lineStyle = list(color = "red", type = 'dotted', width = 2)
) |>
e_tooltip(
trigger = "item",
formatter = htmlwidgets::JS("
function(params){
return(
params.seriesName +'<br />' + params.value
)
}
")
)
选项2 - 向geoJSON添加圆圈
你也可以在城市位置周围创建两个圆形多边形,并将它们添加到 geo_data 的 GeoJSON
library(sf)
library(jsonlite)
library(echarts4r)
url <- "https://service.pdok.nl/cbs/gebiedsindelingen/2024/wfs/v1_0?request=GetFeature&service=WFS&typeName=gebiedsindelingen:gemeente_gegeneraliseerd&outputFormat=json&version=2.0.0&srsname=urn:ogc:def:crs:EPSG::4326"
geo_data <- httr::GET(url) |>
httr::content()
locations <- data.frame(
name = c("Amsterdam", "Utrecht"),
lon = c(4.9041, 5.1214),
lat = c(52.3676, 52.0907)
)
tmp <- tempfile(fileext = ".geojson")
circles_geojson <- locations |>
transform(statnaam = paste0(name, " 50 km radius")) |>
st_as_sf(coords = c("lon", "lat"), crs = 4326) |>
st_transform(3857) |>
# Construct 50 km radius buffer
st_buffer(dist = 50000) |>
st_transform(4326) |>
# write as GeoJSON
st_write(dsn = tmp, driver = "GeoJSON", quiet = TRUE)
circles_geojson <- fromJSON(tmp, simplifyVector = FALSE)
# append circles to downloaded geo_data$features
geo_data$features <- c(geo_data$features, circles_geojson$features)
locations |>
e_charts(lon) |>
e_map_register("NL", geo_data) |>
e_geo(map = "NL", nameProperty = "statnaam") |>
e_scatter(lat, name = "City", coord_system = "geo")
unlink(tmp)
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。


