R中画中国地图并根据经纬度添加标记点

一、使用hchinamap包进行做图

总结:该包不能按照经纬度添加标记点,但是可以通过更改数据来自定义,做图简单。

该包做图使用包中的内置的文件,首先通过链接下载文件到本地然后读取再进行做图。

可以对Rdata中Value列的值进行更改换成自己想表达的值,同时可以根据region选择感兴趣的省份进行做图。

#安装包
install.packages("hchinamap")
library(hchinamap)

#首先加载包中自带的数据
load(file.path("chinadf.rda"), verbose = T)

#将其保存为表格后重新读取
write.csv(chinadf,"chinadf.csv")
Rdata <- read.csv("chinadf.csv")

#作图
hchinamap(
  name = Rdata$name, # 要绘制的省份或城市
  value = Rdata$value, # 要可视化的数据,可以将Rdata中各个省份的value列换成自己想代表的值
  width = "100%", # 地图的宽度
  height = "400px", # 地图的高度
  title = "hchinamap包绘制中国地图", # 地图标题
  minColor = "#FAEBD7", # 最小值的颜色
  maxColor = "#8B8378", # 最大值的颜色
  region = "China" # 要绘制的区域,同时可以选择绘制省份例如“Anhui”
)

 二、使用leaflet作图

1、安装R包

install.packages("leaflet")
install.packages("geojsonio")
install.packages("htmlwidgets")
library(leaflet)
library(geojsonio)
library(htmlwidgets)

2、下载地图数据

推荐使用阿里 DataV 数据可视化平台开放出来的地图数据,它来自高德开放平台。可以直接下载json文件保存到本地。如果想下载省份地图可以点击省份然后再下载json文件。

3、作图

1、在leaflet提供的网页中选择感兴趣的地图作为底图

#1、随便选择一个作为底图
leaflet() %>% 
  addProviderTiles("OpenStreetMap.France")


#2、构建经纬度数据
store <-  data.frame(
    ID = c("A","B","C"),
    lng = c("120.78612","118.83085","104.22043"),
    lat = c("41.78964","32.02825","36.61643")
)

store$lng <- as.numeric(store$lng)
store$lat <- as.numeric(store$lat)

#设置标记点类型
icons <- awesomeIcons(
  icon = 'ios-close',
  iconColor = 'black',
  library = 'ion',
  markerColor = 'lightgreen'
)

#根据经纬度作图
leaflet(store) %>% 
  addProviderTiles("OpenStreetMap.France") %>% 
  addAwesomeMarkers(~lng, ~lat , icon = icons)


#3、添加阿里数据源中的高德地图数据高亮中国(其他国家、省份)
china_map <- geojsonio::geojson_read("中华人民共和国.json", what = "sp") #读取中国地图数据
pal <- colorNumeric("Blues", domain = NULL) #设置地图颜色

leaflet(store) %>% 
  addProviderTiles("OpenStreetMap.France") %>% 
  addPolygons(data = china_map, stroke = T, weight = 1, smoothFactor = 1,
              fillOpacity = 0.85, fillColor = ~ pal(childrenNum))
  addAwesomeMarkers(~lng, ~lat , icon = icons, label = ~ position)

#4、不添加底图,只使用阿里数据源中的高德地图数据(其他国家、省份)
map_plot <- leaflet(store) %>% 
  addPolygons(data = china_map, stroke = T, weight = 1, smoothFactor = 1,
              fillOpacity = 0.85, fillColor = ~ pal(childrenNum))
  addAwesomeMarkers(~lng, ~lat , icon = icons, label = ~ position)
map_plot

#导出,目前只查到了导出为html
htmlwidgets::saveWidget(map_plot, file = "map_plot.html", selfcontained = T)

2、在国内的一些瓦片地图中选择感兴趣的地图作为底图(推荐高德,更精确)

#1、使用高德地图瓦片作为底图
leaflet() %>%
  addTiles(
    urlTemplate = 'https://webrd04.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}',
    layerId = tileOptions(minZoom = 3, maxZoom = 17),
    attribution = NULL)

#2、构建经纬度数据
store <-  data.frame(
    ID = c("A","B","C"),
    lng = c("120.78612","118.83085","104.22043"),
    lat = c("41.78964","32.02825","36.61643")
)

store$lng <- as.numeric(store$lng)
store$lat <- as.numeric(store$lat)

#设置标记点类型
icons <- awesomeIcons(
  icon = 'ios-close',
  iconColor = 'black',
  library = 'ion',
  markerColor = 'lightgreen'
)

#作图
leaflet(store) %>%
  addTiles(
    urlTemplate = 'https://webrd04.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}',
    layerId = tileOptions(minZoom = 3, maxZoom = 17),
    attribution = NULL) %>% 
  addAwesomeMarkers(~lng, ~lat , icon = icons)

#3、添加阿里数据源中的高德地图数据高亮中国(其他国家、省份)
china_map <- geojsonio::geojson_read("中华人民共和国.json", what = "sp")
pal <- colorNumeric("Blues", domain = NULL)

leaflet(store) %>%
  addTiles(
    urlTemplate = 'https://webrd04.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}',
    layerId = tileOptions(minZoom = 3, maxZoom = 17),
    attribution = NULL) %>% 
  addPolygons(data = china_map, stroke = T, weight = 1, smoothFactor = 1,
               fillOpacity = 0.85, fillColor = ~ pal(childrenNum)) %>%
  addAwesomeMarkers(~lng, ~lat , icon = icons)

#4、不使用地图数据只使用阿里数据源中的高德地图数据(其他国家、省份)
leaflet(store) %>%
  addPolygons(data = china_map, stroke = T, weight = 1, smoothFactor = 1,
               fillOpacity = 0.85, fillColor = ~ pal(childrenNum)) %>%
  addAwesomeMarkers(~lng, ~lat , icon = icons)

#导出,目前只查到了导出为html
htmlwidgets::saveWidget(map_plot, file = "map_plot.html", selfcontained = T)

总结:

两个建图方式都各有优缺点,hchinamap包缺点在于不能通过经纬度来添加标记,但是能够通过调整数据来调整每个省份的数据,从而进行展示;leaflet包能够添加多种底图并且能够根据阿里源提供的最新版的底图来展示中国地图,同时能够根据经纬度来添加各种标记点;

参考:

国内常用地图瓦片源地址汇总 - 知乎 (zhihu.com)

R+大地图时代︱ leaflet/leafletCN 动态、交互式绘制地图(遍地代码图)-腾讯云开发者社区-腾讯云 (tencent.com)

R 语言画中国地图 - Xiangyun Huang | 黄湘云 (rbind.io)

  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在 Mapbox GL JS 中添加球面上的标记与在平面地图添加标记的方法类似,但需要使用 `turf.js` 库来实现。具体步骤如下: 1. 安装 `turf.js` 库。 ```bash npm install turf ``` 2. 在你的代码中引入 `turf.js` 和 Mapbox GL JS 库。 ```javascript import mapboxgl from 'mapbox-gl'; import turf from '@turf/turf'; ``` 3. 创建一个 `FeatureCollection` 对象,并将标记添加到这个对象中。 ```javascript const markers = [ [-122.414, 37.776], [-122.408, 37.77], [-122.404, 37.774] ]; const featureCollection = turf.featureCollection(markers.map(marker => { return turf.point(turf.toWgs84(marker)); })); ``` 在球面上添加标记需要将坐标转换为 WGS84 坐标系,可以使用 `turf.toWgs84()` 方法来实现。 4. 将 `FeatureCollection` 添加到 Mapbox GL JS 的地图上。 ```javascript map.on('load', function() { map.addSource('markers', { type: 'geojson', data: featureCollection }); map.addLayer({ id: 'markers-layer', type: 'symbol', source: 'markers', layout: { 'icon-image': 'marker-15', // 标记图标 'icon-size': 1.5 } }); }); ``` 这里我们使用了 `symbol` 图层来显示标记,你也可以使用其他类型的图层来显示标记。注意,这种方法只适用于在球面上添加标记,如果你需要在平面地图添加标记,则可以直接使用 Mapbox GL JS 的 API。 另外,你还可以通过 Mapbox GL JS 提供的 `Marker` 类来添加标记,这种方法不需要使用 `turf.js` 库,示例代码如下: ```javascript const marker = new mapboxgl.Marker() .setLngLat([-122.414, 37.776]) .addTo(map); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值