当前位置: 首页 > news >正文

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()函数传个数组参数&#xff0c;如下&#xff1a; <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 只是比较简单的解释&#xff0c;在实际使用中&#xff0c;如果遇到需要深入研究的场景&#xff0c;再翻阅相关资料深入研究下。 一、泛型T 这个T在实际使用中很常见&#xff0c;比如List<T>。其实我们还…...

C语言——指针(五)

&#x1f4dd;前言&#xff1a; 上篇文章C语言——指针&#xff08;四&#xff09;更加深入的介绍了不同类型指针的特点&#xff0c;这篇文章主要想记录一下函数与指针的结合运用以及const和assert关于指针的用法&#xff1a; 1&#xff0c;函数与指针 2&#xff0c;const 3&am…...

文章解读与仿真程序复现思路——中国电机工程学报EI\CSCD\北大核心《考虑气电联合需求响应的气电综合能源配网系统协调优化运行》

这个标题涉及到一个涉及气体&#xff08;天然气&#xff09;和电力的综合能源配网系统&#xff0c;并且强调了考虑气电联合需求响应的协调优化运行。让我们逐步解读&#xff1a; 气电综合能源配网系统&#xff1a; 这指的是一个结合了气体&#xff08;通常是天然气&#xff09;…...

PostgreSQL 主键和唯一键的区别

主键和唯一键的区别 主键&#xff08;Primary Key&#xff09;&#xff1a; 主键是用于唯一标识表中的每一条记录的键。主键必须是唯一的&#xff0c;不允许为空。一个表只能有一个主键。主键可以由一个或多个字段组成。主键的值在整个表中必须是唯一的&#xff0c;用于确保数据…...

删除表格中的所有绘图

Ctrl G 调出定位的对话框再点击定位条件 按Delete键&#xff0c;删除...

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原理

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 本…...

如何对售后服务的全流程进行精细化的管理?

——“如何对售后服务的全流程进行精细化的管理&#xff1f;” ——“售后又是一个十分复杂的过程&#xff0c;仅靠手工或者电子表格记录这些内容&#xff0c;肯定是低效率、易出错的。最好的办法是借助合适的管理工具进行精细化的过程管理。” 假设你购买了一台新的家用电器…...

SAP UI5 walkthrough step2 Bootstrap

我的理解&#xff0c;这就是一个引导指令 1.我们右键打开命令行--执行 ui5 use OpenUI5 2.执行命令&#xff1a;ui5 add sap.ui.core sap.m themelib_sap_horizon 执行完之后&#xff0c;会更新 yaml 文件 3.修改index.html <!DOCTYPE html> <html> <head&…...

Gemini:定义下一代人工智能的里程碑

Google最近发布号称世界最强的大模型"Gemini"&#xff0c;其强大多模态LLM&#xff0c;标志着AI技术的一个新时代。 Gemini作为"迄今为止最强大的AI模型"之一&#xff0c;其独特之处在于它融合了多种模式的处理能力&#xff0c;能够同时理解和生成文本、代…...

一些系统日常运维命令和语句

一、前言 记录一些日常系统运维的命令和语句 二、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场景&#xff1a; 微信小程序在上传图片时可以通过 uni.chooseImage()方案进行上传&#xff0c;这里不再赘述具体参数。一直项目都可以正常使用&#xff0c;突然有一天发现无法使用该方法&#xff0c;于是查了一下&#xff0c;发现是用户隐私协议问题。故记录一下解决方案。…...

Rust深入浅出:编程的深邃大海中的奇妙冒险

第一章&#xff1a;前言 欢迎来到Rust的深邃大海&#xff0c;这里是一片充满挑战和奇妙冒险的领域。在这篇文章中&#xff0c;我们将深入浅出&#xff0c;探索Rust编程语言的深层次特性&#xff0c;并通过诙谐而深刻的方式&#xff0c;带你走进这个奇妙的编程世界。 第二章&a…...

go-zero开发入门-API网关开发示例

开发一个 API 网关&#xff0c;代理 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);//不是连接数据库名...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

Java多线程实现之Thread类深度解析

Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...