【Cartopy基础入门】如何更好的确定边界显示

news2024/9/24 10:28:23

原文作者:我辈理想
版权声明:文章原创,转载时请务必加上原文超链接、作者信息和本声明。

Cartopy基础入门

【Cartopy基础入门】Cartopy的安装
【Cartopy基础入门】Geojson数据的加载
【Cartopy基础入门】如何更好的确定边界显示


文章目录

  • Cartopy基础入门
  • 前言
  • 一、常见用法
  • 二、实时计算边界
    • 1.计算plt画图边界
    • 2.计算空间geom图形边界
    • 3.2种方式结合的边界
    • 4.限制图形形状
    • 5.内存泄漏问题


前言

Cartopy的官方文档还是太难读了,来来回回找了很多资料,还是有很多东西无法使用,网络上教程大多比较官方。作为程序员,很多时候还是根据源码来使用各种库来的实在
如果看了本站的其他Cartopy文章,就可以看出来,Cartopy是将matplotlib库中的axes重写为GeoAxes,实现了空间类型的数据写入mpl图形,可以参看下面2个图。Geoaxes是特殊的axes对象,能按指定的坐标系统加载绘制不同形式的空间坐标数据。

在这里插入图片描述

在这里插入图片描述


一、常见用法

set_xlim、set_ylim、set_boundary、set_extent、set_global等方法是常用的设置边界方法,如果上述方法都未设置,plt将根据plt上已画图形自适应(包括所有元素,不包括geom图形)。

set_boundary 方法需要与matplotlib.path.Path一起使用,这个我还没去深入了解。
set_extent的资源消耗其实是小于set_boundary 的。
set_extent和set_global的底层是set_xlim和set_ylim。

二、实时计算边界

1.计算plt画图边界

这里说的plt画图主要是matplotlib的通过ax.plt等方法展示的图形,可以通过get_extent方法获取边界,并且可以用于set_extent方法。

proj = ccrs.PlateCarree()
plt.figure(figsize=[8, 6], dpi=300, edgecolor='coral')
geo_axes = plt.axes(projection=proj)
# 网格线
geo_axes.gridlines(draw_labels=True, x_inline=False, y_inline=False)
for goe in map_data['pics']:
    x = [pnt[0] for pnt in goe.geom.coords[0]]
    y = [pnt[1] for pnt in goe.geom.coords[0]]
    geo_axes.plot(x, y, transform=ccrs.Geodetic(), color='k')
print('bounds',geo_axes.get_extent(crs=ccrs.PlateCarree()))
geo_axes.set_extent(geo_axes.get_extent(crs=ccrs.PlateCarree()), crs=ccrs.PlateCarree())

在这里插入图片描述
在这里插入图片描述

2.计算空间geom图形边界

import cartopy.crs as ccrs
import matplotlib.pyplot as plt
import cartopy.io.img_tiles as cimgt
from shapely.geometry import GeometryCollection, Point, asShape, shape

# 画布
proj = ccrs.PlateCarree()
plt.figure(figsize=[10, 6], dpi=300, edgecolor='coral')
geo_axes = plt.axes(projection=proj)
# 网格线
geo_axes.gridlines(draw_labels=True, x_inline=False, y_inline=False)

geom_json = json.loads(map_data['geom'].geojson)
print('geom_json ', geom_json )
geometries = shape(geom_json)
print('geometries', geometries)
geo_axes.add_geometries(geometries.geoms,
                   crs=ccrs.PlateCarree(),
                   # facecolor='k',
                   # edgecolor='k',
                   linestyle='--')
print('bounds', geometries.bounds)
gx1, gy1, gx2, gy2 = geometries.bounds
geo_axes.set_extent((gx1, gx2, gy1, gy2), crs=ccrs.PlateCarree())

在这里插入图片描述
在这里插入图片描述

3.2种方式结合的边界

import cartopy.crs as ccrs
import matplotlib.pyplot as plt
import cartopy.io.img_tiles as cimgt
from shapely.geometry import GeometryCollection, Point, asShape, shape

# 画布
proj = ccrs.PlateCarree()
plt.figure(figsize=[10, 6], dpi=300, edgecolor='coral')
geo_axes = plt.axes(projection=proj)
# 网格线
geo_axes.gridlines(draw_labels=True, x_inline=False, y_inline=False)
for goe in map_data['pics']:
    x = [pnt[0] for pnt in goe.geom.coords[0]]
    y = [pnt[1] for pnt in goe.geom.coords[0]]
    geo_axes.plot(x, y, transform=ccrs.Geodetic(), color='k')
    
geom_json = json.loads(map_data['geom'].geojson)
print('geom_json ', geom_json )
geometries = shape(geom_json)
print('geometries', geometries)
geo_axes.add_geometries(geometries.geoms,
                   crs=ccrs.PlateCarree(),
                   # facecolor='k',
                   # edgecolor='k',
                   linestyle='--')
print('g_bounds', geometries.bounds)
print('p_bounds', geo_axes.get_extent(crs=ccrs.PlateCarree()))
gx1, gy1, gx2, gy2 = geometries.bounds
px1, px2, py1, py2 = geo_axes.get_extent(crs=ccrs.PlateCarree())
bounds = (min(px1, px2, gx1, gx2), max(px1, px2, gx1, gx2), min(py1, py2, gy1, gy2), max(py1, py2, gy1, gy2))
print('gp_bounds', bounds)
geo_axes.set_extent(bounds, crs=ccrs.PlateCarree())

在这里插入图片描述
在这里插入图片描述

4.限制图形形状

有时为了更好的效果,我们会设定一个图片的形状,使用上述方法还是不能达到我们的目的,这里就需要mtaplotlib的相关功能了,就比如我想要一个正方形的图片,还想要矢量形状与图片边框存在间隔。

# 这个可以将plt标称一个正方形
plt.axis('square') 
# 变成正方形后再使用get_extent方法
print('p_bounds', geo_axes.get_extent(crs=ccrs.PlateCarree()))

在这里插入图片描述

在这里插入图片描述

5.内存泄漏问题

在使用set_extent方法时,如果plt上无任何数据,直接使用set_extent方法,程序将无法结束,最终导致电脑内存爆满,直至电脑崩溃,这是典型的内存泄漏问题。可以通过如下方法规避内存泄漏。

    gx1, gy1, gx2, gy2 = geometries.bounds
    px1, px2, py1, py2 = geo_axes.get_extent(crs=ccrs.PlateCarree())
    if px1 == -180.0 and px2 == 180.0 and py1 == -90.0 and py2 == 90.0:
        print('可能存在内存泄漏')
        geo_axes.set_extent((gx1, gx2, gy1, gy2), crs=ccrs.PlateCarree())
    else:
        bounds = (min(px1, px2, gx1, gx2), max(px1, px2, gx1, gx2),
                  min(py1, py2, gy1, gy2), max(py1, py2, gy1, gy2))
        geo_axes.set_extent(bounds, crs=ccrs.PlateCarree())

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/452436.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

苯酚吸附树脂

苯酚作为一种重要的化工原料,主要用于生产酚醛树脂,双酚A,己内酰胺,壬基酚,水杨酸等,此外还可以做溶剂,试剂盒消毒剂等,在合成纤维,合成橡胶,塑料&#xff0c…

我国采矿采石设备制造行业发展现状与部分产品市场分析

一、行业基本概述 采矿采石设备制造,指地下或露天,用于对金属、煤炭、石油、化工等各种矿石或建筑用石的开采设备制造,以及矿石筛选、分类、分离、洗选、轧碎或类似加工工艺使用的专用机械的制造。 根据观研报告网发布的《 中国采矿采石设备…

5年测试总结,自动化测试DevOps-CICD持续集成流程设计...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 测试进阶&#xf…

JS对Json数组进行抽取 获取key: “value“

这篇文章不是拿key或value 是抽取需要的 key: “value” 【必须是单一数组 若是多组数据需要for循环】 // row 是json串 !!! 一、我有一个单一的json【row】 只要 id 和 appStatus 且分开成新数组 let list [];for (var key in row) {var temp {}if (key "id") {…

MyBatis-Plus多数据源dynamic-datasource解决多线程情境下数据源切换失效问题

前言:项目中使用MyBatis-Plus多数据源dynamic-datasource,完成多数据源的切换;但是在并发场景下,我们会发现线程会一直访问默认数据源(配置的Master数据),并没有访问我们在上一步切换后的数据源…

如何把电脑文件备份?本指南很详细

概述:当文件发生丢失的时候,如果我们有备份,直接进行还原就可以了。可见备份的重要性。如何把电脑文件备份?本文将为大家详细介绍。 一、为什么要备份文件 我们在电脑上面会保存很多文件,有的文件是很重要的&#xf…

基于vfw的局域网语音聊天室系统源码论文

语音视频聊天 UDP套接字的运用 在实现语音视频聊天时,采用的是基于UDP套接字的点对点模式,而UDP面向的是无连接的数据服务,其套接字的使用如图10所示。 图10 UDP套接字的使用 视频的捕获 利用VFW接口,视频捕获可以分为以下几个步骤: 建立视频采集窗口…

如何把数据库中的数据显示到页面

主要内容:使用JDBC访问数据库中数据(Java Web数据可视化案例) 文章目录 前期准备:案例:第一步:创建数据库及数据第二步:编写实体类第三步:编写Dao类第四步:编写Servlet代…

SpringBoot中使用redis事务

本文基于SpringBoot 2.X 事务在关系型数据库的开发中经常用到,其实非关系型数据库,比如redis也有对事务的支持,本文主要探讨在SpringBoot中如何使用redis事务。 事务的相关介绍可以参考: 0、起因 在一次线上事故中,我们…

与春相拥,在职读研邂逅中国人民大学与加拿大女王大学金融硕士项目何其有幸

工作几年后的你是否有冒出在职读研的想法?或许你为此纠结了一段时间,在职读研要考虑到的因素众多,年龄、精力分配等,工作几年,经历了职场的磨练,更能知道自己家想要的是什么,对于是否读研会有一…

红海云签约长久数科,引领汽车流通行业人力资源数字化创新

上海铂中数字科技有限公司(以下简称“长久数科”)是国内领先的数字化汽车供应链服务企业,致力于通过整合客户资源、技术资源、产业链配套资源以及地面服务资源,打造一站式服务的汽车生态大数据SaaS平台。 近日,长久数…

编译原理陈火旺第三版第六章课后题答案

下面的答案仅供参考! 1.按照表6.1所示的属性文法,构造表达式(4*71) *2的附注语法树。 答: 首先考虑最底最左边的内部结点,它对应于产生式F→digit,相应的语义规则为F. val: digit.lexval,由于这个结点的子结点digit的属性digit . lexval的…

一文彻底理解Java 17中的新特性密封类

密封类的作用 在面向对象语言中,我们可以通过继承(extend)来实现类的能力复用、扩展与增强。但有的时候,有些能力我们不希望被继承了去做一些不可预知的扩展。所以,我们需要对继承关系有一些限制的控制手段。而密封类…

android framework-ActivityManagerService(AMS)上

一、SystemServer android-10.0.0_r41\frameworks\base\services\java\com\android\server\SystemServer.java 1.1、startOtherService AMS初始化完成后,会调用systemReady方法。 mActivityManagerService.systemReady(() -> {Slog.i(TAG, "Making service…

springboot +flowable,简单实现工作流基础功能的demo例子

一.简介 对于flowable是什么以及关于此框架的具体信息可以参看此项目的官方文档:https://www.flowable.org/docs/userguide/index.html Flowable is a light-weight business process engine written in Java.这是官网文档对此框架的完美解释:Flowable…

NetApp AFF C 系列全闪存存储解决方案

NetApp AFF C 系列: “C”代表“酷炫”(Cool) 采用最新的容量闪存技术,辅以若干一流的智能技术,您将获得一个经济实惠的闪存解决方案,它重新定义了安全性、可扩展性和可持续性。 为什么选择 AFF C 系列的容量闪存解决方案? 实现…

jmeter获取图片验证码-解密图片并识别

说明: 关于图片验证码的处理方式有三种方法:一是让开发屏蔽验证码,二是让开发后端指定一个万能验证码,三是使用OCR工具进行图片验证码的解密及识别,推荐使用前两种方法最省事; OCRServer工具识别图片验证码…

Netty核心源码分析(二),Netty的Server端接收请求过程源码分析

文章目录 系列文章目录一、连接请求接受过程源码分析1、事件的值2、processSelectedKeys获取事件(1)doReadMessages方法(2)pipeline的fireChannelRead方法(3)ServerBootstrapAcceptor的channelRead方法 3、…

关于数据挖掘和数据集成?

按照数据的生命周期,我们通常将大数据技术分为数据集成、数据存储、批流处理、数据查询与分析、数据调度与编排、数据开发、BI 7 个部分。 可以看到数据集成在数据生命周期最前面的位置,它负责将多个来自不同数据源的数据聚合存放在一个数据存储中&…

分布式任务调度框架Power-Job

分布式任务调度框架的由来及对比 在大型业务业务系统中,不可避免会出现一些需要定时执行需求的场景,例如定时同步数据,定时清洗数据,定时生成报表,大量机器一同执行某个任务,甚至有些需要分布式处理的任务…