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);//不是连接数据库名...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
Linux链表操作全解析
Linux C语言链表深度解析与实战技巧 一、链表基础概念与内核链表优势1.1 为什么使用链表?1.2 Linux 内核链表与用户态链表的区别 二、内核链表结构与宏解析常用宏/函数 三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势5.1 插入效率5.2 安全…...

23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

【深度学习新浪潮】什么是credit assignment problem?
Credit Assignment Problem(信用分配问题) 是机器学习,尤其是强化学习(RL)中的核心挑战之一,指的是如何将最终的奖励或惩罚准确地分配给导致该结果的各个中间动作或决策。在序列决策任务中,智能体执行一系列动作后获得一个最终奖励,但每个动作对最终结果的贡献程度往往…...