在echarts4r中为点设置半径

编程语言 2026-07-10

我正在使用 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:

enter image description here

如你所见,我们有两个蓝色点。现在我想为每个点添加半径为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
        )
      }
   ")
  )

res

选项2 - 向geoJSON添加圆圈

你也可以在城市位置周围创建两个圆形多边形,并将它们添加到 geo_dataGeoJSON

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)

res2

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章