gma 空间绘图实战(1):绘制多个子图,连接并展示局部放大区域

安装 gma:
pip install gma
本文基于:gma 2.0.3,Python 3.10
本文用到的矢量数据为:CTAmap 1.12。来源于 https://www.shengshixian.com/ 。(感谢锐多宝)
绘图目标

参考代码
import matplotlib.pyplot as plt
from matplotlib.patches import ConnectionPatch
from gma.map import plot, inres
from gma import io, crs
步骤一:读取 CTAmap_1.12 矢量数据
## 读取数据
L0 = io.ReadVector('2023年_CTAmap_1.12版/国界/国家矢量.shp')
L1 = io.ReadVector('2023年_CTAmap_1.12版/2023年省级/2023年省级.shp')
L2 = io.ReadVector('2023年_CTAmap_1.12版/九段线/九段线.shp')
L3 = io.ReadVector('2023年_CTAmap_1.12版/2023年地级/2023年地级.shp')
L1 属性表如下:

L3 属性表如下:

步骤二:定义绘图投影
1.定义一个适用于全国的 阿尔伯思等积圆锥投影
# 定义一个阿尔伯思等积圆锥投影方法(中央经线:东经105°)
ProjM1 = crs.ProjMethod.AlbersConicEqualArea(CentralLongitude = 105)
ProjCS1 = crs.ProjCS(ProjMethod = ProjM1) # 创建一个投影坐标系(阿尔伯思等积圆锥投影)
2.定义一个适用于河南的 阿尔伯思等积圆锥投影
# 定义一个以 河南为中心 的阿尔伯思等积圆锥投影坐标系
##(中央经线:东经113°, 标准纬线1:北纬31.5°, 标准纬线2:北纬34.5°)
ProjM2 = crs.ProjMethod.AlbersConicEqualArea(CentralLongitude = 113, StandardParallels1 = 31.5, StandardParallels2 = 34.5)
ProjCS2 = crs.ProjCS(ProjMethod = ProjM2)
步骤三:筛选并制作河南省数据
1.筛选河南省数据
### 河南省边界(筛选 L1 “省”字段中值为“河南省”的部分)
Henan = L1.SelectWhere('"省" = "河南省"')
### 河南省地级市(筛选L3 “省级”字段中值为“河南省”的部分)
HNDJ = L3.SelectWhere('"省级" = "河南省"')
2.制作河南省外包范围
## 创建一个河南的外包框,向外扩展 20%
HenanPCS = Henan.Reproject(ProjCS1)
XMin, YMin, XMax, YMax = HenanPCS.Boundary
XPTP, YPTP = XMax - XMin, YMax - YMin
HenanBod = [[XMin - XPTP * 0.2, YMax + YPTP * 0.2], [XMin - XPTP * 0.2, YMin - YPTP * 0.2],[XMax + XPTP * 0.2, YMin - YPTP * 0.2], [XMax + XPTP * 0.2, YMax + YPTP * 0.2]]
PlotAreaF = io.CreateFeatureFromPoints(HenanBod, Projection = ProjCS1)
## 在 2.0.4 之后的版本中,请用 io.CreateFeature 替代。
步骤四:绘图
Fig = plt.figure(figsize = (12, 6), dpi = 600)
1.绘制 子图1
### 子图 1
Axes1 = plt.subplot2grid((1, 2), (0, 0), colspan = 1, rowspan = 1)
# 在子图 Axes1 上绘制,绘图坐标系为 ProjCS1,绘图范围(四至边界)为 [82°E, 0°, 126°E, 55°N](重投影到底图坐标系后范围可能发生变化)。
MapF1 = plot.MapFrame(Axes = Axes1, BaseMapProj = ProjCS1, Extent = [82, 0, 126, 55]) ## 1.0 底图(内置的国家、海洋、湖泊、河流)
MapB0 = MapF1.AddLayer(inres.WorldLayer.Country, FaceColor = 'none', LineColor = 'black', LineWidth = 0.3, Zorder = 1)
MapB1 = MapF1.AddLayer(inres.WorldLayer.Ocean, FaceColor = '#BEE8FF', LineWidth = 0, Zorder = 1)
MapB2 = MapF1.AddLayer(inres.WorldLayer.Lake, FaceColor = '#BEE8FF', LineWidth = 0, Zorder = 1)
MapB3 = MapF1.AddLayer(inres.WorldLayer.River, LineColor = '#BEE8FF', LineWidth = 0.3, Zorder = 1)## 1.4 国界。Zorder 用于调整图层顺序(避免图层遮盖);
#### Labels,FieldName 用于为图层添加标签,服务于标注(AddLabel)、图例(AddLegend)功能
MapL4 = MapF1.AddLayer(L0, FaceColor = 'none', LineColor = '#4B0082', LineWidth = 0.5, Zorder = 2, Labels = '国界(陆地)')
## 1.5 省界
MapL5 = MapF1.AddLayer(L1, FaceColor = '#F8F8FF', LineColor = 'lightgray', LineWidth = 0.3, Zorder = 0, Labels = '省级行政区界')
## 1.6 九段线
MapL6 = MapF1.AddLayer(L2, LineWidth = 0.5, LineColor = '#4B0082', Zorder = 2, Labels = '国界(海洋)/九段线')
## 1.7 河南省
MapL7 = MapF1.AddLayer(Henan, LineWidth = 0, Zorder = 2, FieldName = '省')
Label7 = MapL7.AddLabel(Font = 'SimSun', FontSize = 7)## 1.8 河南外包框
MapL8 = MapF1.AddFeature(PlotAreaF, FaceColor = 'none', LineColor = '#FFA500', LineWidth = 0.8)## 1.n 整饰要素
### 1.n.1 图例
Legend1 = MapF1.AddLegend(LegendName = '图例', # 图例名称LOC = (0.1, 0.15), # 图例位置(0.1:X轴宽度的0.1倍,0.15:Y轴高度的0.15倍),可为负数LabelFont = 'SimSun', # 标签字体(宋体)LabelFontSize = 6, # 标签字体大小(6号)TitleFont = 'SimSun', # 图例标题字体(宋体) TitleAlignment = 'left', # 图例标题对齐方式(左对齐) PlotID = [4, 5, 6]) # 对 MapF1 第 4(MapL4), 5(MapL5), 6(MapL6) 个图层绘制图例
### 1.n.2 指北针
Compass1 = MapF1.AddCompass(LOC = (0.12, 0.85), # 指北针位置,同图例参数中的 LOCWidth = 0.06, # 指北针的相对宽度,X 轴宽度的 0.06 倍Style = 'GMACompass1') # 指北针样式,目前有 GMACompass1-4 四种样式
### 1.n.3 比例尺
ScaleBar1 = MapF1.AddScaleBar(LOC = (0.04, 0.05)) # 比例尺位置,同图例参数中的 LOC
### 1.n.4 经纬网
GridLines1 = MapF1.AddGridLines()
### 1.n.5 设置地图框边框
Frame1 = MapF1.SetFrame(LabelFontSize = 8, # 边框字体大小(8号),主要为经纬度显示信息FrameWidth = 0.8) # 边框字宽度0.8
2.绘制 子图2
Axes2 = plt.subplot2grid((1, 2), (0, 1), colspan = 1, rowspan = 1)
MapF2 = plot.MapFrame(Axes = Axes2, BaseMapProj = ProjCS2, Extent = PlotAreaF.Reproject('WGS84').Boundary)## 1.1 地级行政区
MapL1 = MapF2.AddLayer(L3, FaceColor = 'none', LineColor = 'lightgray', LineWidth = 0.15)
## 1.2 中国省界
MapL2 = MapF2.AddLayer(L1, FaceColor = 'none', LineColor = 'black', LineWidth = 0.5)
## 1.3 河南市界
MapL3 = MapF2.AddLayer(HNDJ, LineColor = 'gray', LineWidth = 0.4)
Label3 = MapL3.AddLabel(FieldName = '地名', Font = 'Microsoft YaHei', FontSize = 6.5)## 其他地图整饰要素
Compass2 = MapF2.AddCompass(LOC = (0.08, 0.85), Width = 0.05, Style = 'GMACompass2')
ScaleBar2 = MapF2.AddScaleBar(LOC = (0.04, 0.05))
GridLines2 = MapF2.AddGridLines(LONRange = (100, 120, 2), LATRange = (30, 50, 2))
Frame2 = MapF2.SetFrame(LabelFontSize = 8, FrameWidth = 0.8)
3.连接两个子图
P1 = PlotAreaF.Points2D
Point11 = P1[3] # 左上
Point12 = P1[2] # 左下P2 = MapF2.FrameFeature.ToLayer().Envelope().GetFeature().Points2D
Point21 = P2[3] # 右上
Point22 = P2[0] # 右下Con1 = ConnectionPatch(xyA = Point11, xyB = Point21, coordsA = "data", coordsB = "data",axesA = Axes1, axesB = Axes2, color = "#FFA500")
Con2 = ConnectionPatch(xyA = Point12, xyB = Point22, coordsA = "data", coordsB = "data",axesA = Axes1, axesB = Axes2, color = "#FFA500")Fig.add_artist(Con1)
Fig.add_artist(Con2)plt.subplots_adjust(left = None, bottom = None, right = None, top = None, wspace = 0.06)
步骤五:调整子图间距并保存结果
plt.subplots_adjust(left = None, bottom = None, right = None, top = None, wspace = 0.06)
plt.savefig('Fig.9.jpg', bbox_inches = 'tight')

相关文章:
gma 空间绘图实战(1):绘制多个子图,连接并展示局部放大区域
安装 gma:pip install gma 本文基于:gma 2.0.3,Python 3.10 本文用到的矢量数据为:CTAmap 1.12。来源于 https://www.shengshixian.com/ 。(感谢锐多宝) 绘图目标 参考代码 import matplotlib.pyplot as p…...
Unity中C#使用协程控制Shader材质变化
文章目录 前言一、协程是什么二、在Unity中使用协程1、我们在 Start 中测试一下协程的执行顺序2、我们实现一个点击按钮实现角色受击效果 三、协程中的动画过渡1、首先,在协程内实现中毒并且消散的效果2、在 OnGUI 内,给一个新按钮使用刚刚定义的协程 四…...
WordPress禁止显示指定类别的文章
使用wordpress禁止输出指定类别的文章可以给get_posts()函数传个数组参数,如下: <div class"widget" id"diary1"> <h3>随机呈现</h3> <ul> <?php $argsarray( numberposts>16, category>-9,-12, …...
C#里面的泛型(T),泛型类,泛型方法,泛型接口等简单解释
https://blog.csdn.net/dap769815768/article/details/81946506 只是比较简单的解释,在实际使用中,如果遇到需要深入研究的场景,再翻阅相关资料深入研究下。 一、泛型T 这个T在实际使用中很常见,比如List<T>。其实我们还…...
C语言——指针(五)
📝前言: 上篇文章C语言——指针(四)更加深入的介绍了不同类型指针的特点,这篇文章主要想记录一下函数与指针的结合运用以及const和assert关于指针的用法: 1,函数与指针 2,const 3&am…...
文章解读与仿真程序复现思路——中国电机工程学报EI\CSCD\北大核心《考虑气电联合需求响应的气电综合能源配网系统协调优化运行》
这个标题涉及到一个涉及气体(天然气)和电力的综合能源配网系统,并且强调了考虑气电联合需求响应的协调优化运行。让我们逐步解读: 气电综合能源配网系统: 这指的是一个结合了气体(通常是天然气)…...
PostgreSQL 主键和唯一键的区别
主键和唯一键的区别 主键(Primary Key): 主键是用于唯一标识表中的每一条记录的键。主键必须是唯一的,不允许为空。一个表只能有一个主键。主键可以由一个或多个字段组成。主键的值在整个表中必须是唯一的,用于确保数据…...
删除表格中的所有绘图
Ctrl G 调出定位的对话框再点击定位条件 按Delete键,删除...
Linux卸载Nginx
1、停止Nginx软件 #/usr/local/nginx/sbin/nginx-sstop 或者kill进程 #ps -ef|grep nginx #kill -9 PID 2、查找根下所有名子包含nginx的文件 #sudofind/-namenginx* 3、执行命令删掉nignx安装的相关文件 # rm -rf /usr/local/sbin/nginx # rm -rf /usr/local/nginx # r…...
Qt之QGraphicsView —— 笔记1:绘制简单图元(附完整源码)
效果 相关类介绍 QGraphicsView类提供了一个小部件,用于显示QGraphicsScene的内容。QGraphicsView在可滚动视口中可视化。QGraphicsView将滚动其视口,以确保该点在视图中居中。 QGraphicsScene类 提供了一个用于管理大量二维图形项的场景。请注意,QGraphicsScene没有自己的视…...
SpringIoC原理
我是南城余!阿里云开发者平台专家博士证书获得者! 欢迎关注我的博客!一同成长! 一名从事运维开发的worker,记录分享学习。 专注于AI,运维开发,windows Linux 系统领域的分享! 本…...
如何对售后服务的全流程进行精细化的管理?
——“如何对售后服务的全流程进行精细化的管理?” ——“售后又是一个十分复杂的过程,仅靠手工或者电子表格记录这些内容,肯定是低效率、易出错的。最好的办法是借助合适的管理工具进行精细化的过程管理。” 假设你购买了一台新的家用电器…...
SAP UI5 walkthrough step2 Bootstrap
我的理解,这就是一个引导指令 1.我们右键打开命令行--执行 ui5 use OpenUI5 2.执行命令:ui5 add sap.ui.core sap.m themelib_sap_horizon 执行完之后,会更新 yaml 文件 3.修改index.html <!DOCTYPE html> <html> <head&…...
Gemini:定义下一代人工智能的里程碑
Google最近发布号称世界最强的大模型"Gemini",其强大多模态LLM,标志着AI技术的一个新时代。 Gemini作为"迄今为止最强大的AI模型"之一,其独特之处在于它融合了多种模式的处理能力,能够同时理解和生成文本、代…...
一些系统日常运维命令和语句
一、前言 记录一些日常系统运维的命令和语句 二、linux命令与语句 1、linux查看各目录使用磁盘情况 du -h /home home为目录 du -h /home 2.查看内存使用情况 free -h 3、查看进程和CPU使用情况 top top 三、数据库语句 1、统计mysql数据库表数量 SELECT COUNT(*) A…...
微信小程序uni.chooseImage()无效解决方案
Bug场景: 微信小程序在上传图片时可以通过 uni.chooseImage()方案进行上传,这里不再赘述具体参数。一直项目都可以正常使用,突然有一天发现无法使用该方法,于是查了一下,发现是用户隐私协议问题。故记录一下解决方案。…...
Rust深入浅出:编程的深邃大海中的奇妙冒险
第一章:前言 欢迎来到Rust的深邃大海,这里是一片充满挑战和奇妙冒险的领域。在这篇文章中,我们将深入浅出,探索Rust编程语言的深层次特性,并通过诙谐而深刻的方式,带你走进这个奇妙的编程世界。 第二章&a…...
go-zero开发入门-API网关开发示例
开发一个 API 网关,代理 https://blog.csdn.net/Aquester/article/details/134856271 中的 RPC 服务。 网关完整源代码 // file: main.go package mainimport ("flag""fmt""github.com/zeromicro/go-zero/core/conf""github.c…...
TCP一对一通信
package 二十一章; import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner;/*** Socket服务端**/ public class SocketServer {public static void main(String[] args) {ServerSocket ss null;Socket s null;try {// 创建监听…...
laravel DB::connection 报错 Database connection [{$name}] not configured
DB::connection(mysql2);//不是连接数据库名...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
PHP 8.5 即将发布:管道操作符、强力调试
前不久,PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5!作为 PHP 语言的又一次重要迭代,PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是,借助强大的本地开发环境 ServBay&am…...
【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
通过 Ansible 在 Windows 2022 上安装 IIS Web 服务器
拓扑结构 这是一个用于通过 Ansible 部署 IIS Web 服务器的实验室拓扑。 前提条件: 在被管理的节点上安装WinRm 准备一张自签名的证书 开放防火墙入站tcp 5985 5986端口 准备自签名证书 PS C:\Users\azureuser> $cert New-SelfSignedCertificate -DnsName &…...
