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);//不是连接数据库名...
使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式
一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明:假设每台服务器已…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
Web中间件--tomcat学习
Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机,它可以执行Java字节码。Java虚拟机是Java平台的一部分,Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...
Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...
pikachu靶场通关笔记19 SQL注入02-字符型注入(GET)
目录 一、SQL注入 二、字符型SQL注入 三、字符型注入与数字型注入 四、源码分析 五、渗透实战 1、渗透准备 2、SQL注入探测 (1)输入单引号 (2)万能注入语句 3、获取回显列orderby 4、获取数据库名database 5、获取表名…...
