python采用Basemap绘制完美中国地图(包括绘制边界框,随机点等)

  • 1. 效果图
  • 2. 原理
    • 2.1 依赖模块及安装
    • 2.2 工程目录
    • 2.3 依赖文件latlng.txt 经纬度
    • 3 源码
  • 参考

这篇博客将介绍如何使用basemap绘制简单的地图(包括绘制边界框,随机点等),Basemap基于GEOS的地图二维数据,其底图数据库与GMT相同,封装了大量常用的地图投影、坐标转换功能,利用简洁的Python语法支持绘出多种多样的地理地图。

写这篇博客源于一个博友的提问,绘制 地图及经纬度点 为这样的效果图:

1. 效果图

左图效果图如下:

右图效果图如下:

2. 原理

2.1 依赖模块及安装

  • 依赖模块如下:

geos
pyproj
basemap

  • 安装
pip install geos
pip install pyproj

basemap的wheel文件可在 https://www.lfd.uci.edu/~gohlke/pythonlibs/ 下载,注意需要和python版本以及系统版本对应;

下载完成就可以安装了:

pip install basemap-1.2.2-cp37-cp37m-win_amd64.whl

2.2 工程目录

$ tree
.
|-- images
|   `-- latlng.txt ------依赖经纬度值
|-- left.png ------------程序运行生成
|-- plot_map.py----------程序代码
`-- right.png -----------程序运行生成1 directory, 4 files

2.3 依赖文件latlng.txt 经纬度

经纬度是从提问的图片中OCR识别出来的写入了文件,OCR可参考:

另外为了效果图更加明显,随机增加了一些经纬度;

-125 -125.5 48.5 49.0 -125.23 48.79 2012 5 4 7
-125 -125.5 48.5 49.0 -125.1 48.9 2012 5 4 7
-125 -125.5 48.5 49.0 -125.4 48.6 2012 5 4 7
-125 -130.5 48.5 55.0 -128.23 54.79 2012 5 4 7
-125 -134.5 35.5 49.0 -134.23 36.79 2012 5 4 7
-125 -134.5 35.5 49.0 -130.23 40.79 2012 5 4 7
-125 -130.5 45.5 55.0 -128.23 52.79 2012 5 4 7
-125 -134.5 45.5 49.0 -134.23 46.79 2012 5 4 7
-125 -134.5 45.5 49.0 -130.23 51.79 2012 5 4 7
-65.5 -66.0 43 43.5 -65.93 43.33 2011 12 14 7
-61.5 -62.0 47 47.5 -61.96 47.39 2011 5 21 16
-64.5 -65.0 43.5 44.0 -64.87 43.7 2010 12 2 22
-55.5 -56.0 45.5 46.0 -55.75 45.7 2010 10 13 7
-66 -66.5 43.5 44.0 -66.41 43.98 2009 12 16 14
-53 -53.5 49 49.5 -53.35 49.23 2009 11 3 19
-53 -53.5 50 50.5 -53.47 50.29 2009 10 24 11
-51 -51.5 45.5 46.0 -51.02 45.6 2009 9 13 16
-64 -64.5 49 49.5 -64.37 49.0 2009 5 18 22

3 源码

# 绘制地图数据
# 注意:plt.savefig() 依赖 matplotlib.use("Agg")设置
#       plt.show时,需要注释掉 matplotlib.use("Agg")
import osimport numpy as np
from mpl_toolkits.basemap import Basemap  # 地图依赖
import matplotlib.pyplot as plt  # 绘制效果图及可视化
import matplotlib.image as mpimg  # 读取图片
import matplotlib  # 保存图片# 设置此才可保存图片到本地,但同时没法可视化plt.show()了
# matplotlib.use("Agg")def left_map():# 边界框,及起点0,0处经纬度map = Basemap(llcrnrlon=-135, llcrnrlat=45, urcrnrlon=-120, urcrnrlat=55,resolution='i', lat_0=45, lon_0=-135)map.drawmapboundary(fill_color='aqua')map.fillcontinents(color='#ddaa66', lake_color='aqua')map.drawcoastlines()  # 绘制海岸线图层# drawparalles: 绘制lon# drawmeridians:绘制lat# range(-90,100,5)等差数列,因为range到达不了本身,所以需要大一点# linewidht:线宽# dashes[4,2]: 4绘制大小,2间隔像素# labels[1,0,0,1]:文本位置 分别代表左、右、上、下# color: 字体颜色# zorder:改变线的位置,例如,能够使土地覆盖平行线,或相反. 0:线在土地下方(看不见),1:线在土地上方map.drawparallels(range(45, 57, 2), linewidth=2, dashes=[4, 2], labels=[1, 0, 0, 1], color='r', zorder=0)map.drawmeridians(range(-135, 118, 5), linewidth=2, dashes=[4, 2], labels=[1, 0, 0, 1], color='b', zorder=0)# 获取第5列得到经度lons,获取第5列得到纬度lats# my_data = np.loadtxt('images/latlng.txt')# lons = my_data[:, [4]]# lats = my_data[:, [5]]# 生成随机点lons = np.random.randint(120, 135, (25, 1)).astype(np.float32) * -1lats = np.random.randint(45, 55, (25, 1)).astype(np.float32)x, y = map(lons, lats)# 绘制点 圆点红色# 可参考https://matplotlib.org/stable/api/markers_api.html 找到绘制的样式# 可参考https://matplotlib.org/stable/api/colors_api.html 找到绘制的颜色map.scatter(x, y, marker='.', color='r')plt.show()# plt.savefig('left.png')def right_map():# 边界框,及起点0,0处经纬度map = Basemap(llcrnrlon=-75, llcrnrlat=35, urcrnrlon=-45, urcrnrlat=55,resolution='i', lat_0=35, lon_0=-75)map.drawmapboundary(fill_color='aqua')map.fillcontinents(color='#ddaa66', lake_color='aqua')map.drawcoastlines()  # 绘制海岸线图层# drawparalles: 绘制lon# drawmeridians:绘制lat# range(-90,100,5)等差数列# linewidht:线宽# dashes[4,2]: 4绘制大小,2间隔像素# labels[1,0,0,1]:文本位置 分别代表左、右、上、下# color: 字体颜色# zorder:改变线的位置,例如,能够使土地覆盖平行线,或相反. 0:线在土地下方(看不见),1:线在土地上方map.drawparallels(range(-90, 100, 5), linewidth=2, dashes=[4, 2], labels=[1, 0, 0, 1], color='r', zorder=0)map.drawmeridians(range(-75, 0, 10), linewidth=2, dashes=[4, 2], labels=[1, 0, 0, 1], color='b', zorder=0)my_data = np.loadtxt('images/latlng.txt')# print(my_data.shape)# print(my_data)# print('lon: ',my_data[:,[4]])# print('lat: ',my_data[:,[5]])# 获取第5列得到经度lons,获取第5列得到纬度latslons = my_data[:, [4]]lats = my_data[:, [5]]x, y = map(lons, lats)# 绘制点 圆点红色# 可参考https://matplotlib.org/stable/api/markers_api.html 找到绘制的样式# 可参考https://matplotlib.org/stable/api/colors_api.html 找到绘制的颜色map.scatter(x, y, marker='.', color='r')plt.show()# plt.savefig('right.png')left_map()
right_map()def mixshow():folder_path = os.getcwd().replace('\\', '/')list = [folder_path + '/left.png', folder_path + '/right.png']for i, j in enumerate(list):print(j)# matplot读出来是RGBimage = mpimg.imread(j)plt.subplot(1, 2, i + 1)plt.imshow(image)  # 通过for循环逐个显示图像plt.xticks([])  # 去掉x轴的刻度plt.yticks([])  # 去掉y轴的刻度plt.show()mixshow()

参考

  • https://www.cnblogs.com/zhuwjwh/p/12325694.html
  • 官网文档
  • github 源码

python采用Basemap绘制完美中国地图(包括绘制边界框,随机点等)相关推荐

  1. python采用Basemap绘制完美中国地图

    python采用Basemap绘制完美中国地图 摘要 Basemap的安装 下载Basemap安装文件 安装 Pyproj& Basemap Basemap的Helloword 使用Shape ...

  2. 使用Echarts完成对中国地图的绘制

    目录 前言 1.什么是Echarts插件 2.如何在vue中使用Echarts 3.中国地图的具体样式 4.如何使用Echarts来完成中国地图的绘制 5.总结 前言 我们在使用代码绘画地图的时候通常 ...

  3. jvectormap 中国地图 (包括香港、台湾、澳门)

    一个完整的中国地图(各个省,市.还有国两制),谢谢大家. 忘了网上哪位的范例,我加了些修改. 1 <html xmlns="http://www.w3.org/1999/xhtml&q ...

  4. 2021年中国地图省市县区边界shp格式arcgis数据(预览图)

    2021年中国地图省市县区边界shp格式arcgis数据(预览图) 下载地址 https://download.csdn.net/download/zhongguonanren99/16063641 ...

  5. R 绘制渐变中国地图及添加南海九段图

    采用中国国家基础地理信息系统(GIS)数据模板进行绘制并添加九段图. 调用R进行作图,所用中国地图模板可从[百度网盘](链接: https://pan.baidu.com/s/1FR2zG74d0ao ...

  6. vue中用echarts 绘制geo 中国地图

    前言 由于5.X版本的echarts没有了map包,因此我先安装了5.1.1版本,再安装了4.9版本,并将4.9版本中的map包复制到了5.1.1版本里. 绘制效果如下: 1.省份根据数据值,展示不同 ...

  7. Android开发画出中国地图,Android 绘制中国地图

    最近的版本有这样一个需求: 有 3 个要素: 中国地图 高亮省区 中心显示数字 面对这样一个需求,该如何实现呢? 高德地图 因为项目是基于高德地图来做的,所以很自然而然的想到了高德.但是当查阅高德地图 ...

  8. python程序创建词云 中国地图_Python基于wordcloud及jieba实现中国地图词云图

    热词图很酷炫,也非常适合热点事件,抓住重点,以图文结合的方式表现出来,很有冲击力.下面这段代码是制作热词图的,用到了以下技术: jieba,把文本分词 wordcloud,制作热图 chardet,辨 ...

  9. echarts 绘制世界地图 中国地图

    1.下载 世界地图和中国地图加载包 网上找了很长时间,分享 world.js china.js 下载地址: 链接:https://pan.baidu.com/s/1itbfiTMNMkcbLfUs0N ...

最新文章

  1. Java后端进行经纬度点抽稀聚合,HTML呈现及前端聚合实现点聚合~
  2. 肝完这篇垃圾回收,和面试官扯皮不怕了
  3. 循序渐进Python3(七) -- 2-- 面向对象进阶
  4. 面试:InnoDB 中一棵 B+ 树可以存放多少行数据?
  5. 六度人和张星亮:SaaS市场要回归TO B本质
  6. 【小姨子】 基本信息(拼音,读音等)
  7. CISSP避坑经验指南
  8. [转]各种配置管理工具的比较
  9. C# 将彩色PDF转为灰度
  10. 记一次基于公众号的微信H5开发项目(一)
  11. BZOJ1854: [Scoi2010]游戏(二分图匹配)
  12. html怎么设置字体的背景颜色,html怎样设置字体的背景颜色?
  13. 清理谷歌浏览器注册表_Win10系统下注册表chrome残留无法删除
  14. 异地监控组网实战案例(速度快)
  15. Android 点击图片全屏预览 -——ZoomPreviewPicture默认预览使用
  16. 浙大远程教育计算机小抄,一张A4纸能写多少个字?看完浙大考生的“小抄”,网友:稳过!...
  17. salesforce架构_使用Salesforce扩展用户研究运营基础架构
  18. Windows下安装Nexus私服及更新索引
  19. Numpy 简单教程(二)数组的形状(shape)操作
  20. (01)ORB-SLAM2源码无死角解析-(55) 闭环线程→计算Sim3:总体流程讲解ComputeSim3()

热门文章

  1. 实时实例分割的Deep Snake:CVPR2020论文点评
  2. 牛客网里刷题:JS获取输入的数组
  3. [JAVA EE]session 和 token 机制
  4. [JAVA EE] 拦截器
  5. Android RadioButton 修改选择框
  6. android 快速点击开启某功能(不如快速点击打开开发者模式)
  7. java 过滤器Filter
  8. Ubuntu中的minicom
  9. Apache JMeter2.13 实战
  10. android帧动画实现方法之一