R语言实现
首先是将地址转换为经纬度坐标
这个可以用在线经纬度查询,直接百度在线经纬度,就可以使用
比如
批量查询
或者用百度、高德等API
参考:https://mp.weixin.qq.com/s/fEFOR-r95iDVGd4byGTKng
经纬度准备好之后,下面就可以绘图了
代码的细节不在讲解,可以自己调试,可以参考
https://blog.csdn.net/qq_42374697/article/details/110476955
library(ggplot2)
library(maps)
library(mapdata)
library(maptools)
library(plyr)
library(rgdal)
library(mapproj)
cq <- rgdal::readOGR("重庆.shp")
plot(cq)
# 有可能乱码,看一下那些字段乱码了
head(cq@data)
# 逐一修改
Encoding(cq@data$name) <- "UTF-8" ##转换格式为UTF-8
# 再检查一次
head(cq@data)
data1 <- cq@data
data2 <- data.frame(id=row.names(data1),data1)
cq_ <- fortify(cq) #转化为数据框
cq_map_data <- join(cq_, data2, type = "full")
head(cq_map_data)
library(readxl)
library(xlsx)
# 把城市名称保存为excel表,这样就不用了自己写城市名,或者如果业务数据本身有城市名,也可以跳过这步
write.xlsx(cq@data$name,'b.xls',row.names = F)
#读取数据
mydata1 <- read_excel("C:/Users/Administrator/Desktop/b.xls")
mydata1
#读取业务指标数据,并与地图数据合并
cq_data <- join(cq_map_data, mydata1, type="full") #合并两个数据框
# 绘图
windowsFonts(myFont = windowsFont("微软雅黑"))
p=ggplot(
cq_data,
aes(x = long, y = lat, group = group, fill = number)) +
geom_polygon(colour="grey40") +ggtitle("")+
scale_fill_gradient(low="#e3f9fd",high="#a4e2c6") +
theme(plot.title=element_text(family="myFont",size=19,hjust = 0.5),
)
sf = data.frame(site_name=c('涪陵北站','黔江机场','重庆邮电大学'),lan =c(29.776429,29.517508,29.537621),lon =c(107.284263,108.842114,106.614389))
p+geom_point(data=sf,aes(x=lon,y=lan),colour = '#ff2121',size=3, inherit.aes = FALSE)+
geom_text(data=sf,aes(x=lon,y=lan+0.15,label=site_name),size=3, inherit.aes = FALSE)
最终效果
Python实现
还是基于前面的数据,使用pyecharts实现
例如
addr = ‘涪陵北站’
longitude = 107.39642
latitude = 29.709278
from pyecharts.charts import Geo
from pyecharts import options
from pyecharts.globals import GeoType
addr = '涪陵北站'
longitude = 107.39642
latitude = 29.709278
g = Geo().add_schema(maptype="重庆")
g.add_coordinate(addr, longitude, latitude)
data_pair = [(addr,1)]
g.add('',data_pair, type_=GeoType.EFFECT_SCATTER, symbol_size=10)
g.set_series_opts(label_opts=options.LabelOpts(is_show=False))
g.set_global_opts(title_opts=options.TitleOpts(title=""))
g.render_notebook()