百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

Python绘制南海海底地形图并叠加观测数据

toyiye 2024-07-05 01:32 19 浏览 0 评论

今天来画南海海底地形图,之前用arcgis画过,但是感觉不太好看,而且arcgis的图例好丑啊...,所以还是转战python了。

主要是参考了这位大佬的文章,他文章里面的配色好好看呀!

Python绘图:使用Basemap绘制全球地形图_python 显示 全球卫星地图-CSDN博客

import pandas as pd
import matplotlib as mpl
mpl.use('TkAgg')
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import numpy as np
import matplotlib.patches as mpatches
import xarray as xr
plt.rcParams['axes.unicode_minus']=False  #显示负号
mpl.rcParams["font.sans-serif"] = ["SimHei"]
mpl.rcParams["font.family"] = 'Arial'  #默认字体类型
mpl.rcParams["mathtext.fontset"] = 'cm' #数学文字字体
savepath = r'F:\wangxj\data\海山地形图\fig'
file=r'F:\wangxj\data\GEBCO_19_Sep_2023_e07f4a5eca45\gebco_2023_n25.0_s5.0_w105.0_e125.0.nc'
ds = xr.open_dataset(file)

输出ds看一下,因为我当时下载GEBCO文件时候就只截取了南海部分的数据,要是画别的地方的可能要改一下后面的经纬度范围。

#准备用于绘制地形图的数据
lon = np.linspace(min(ds['lon'].data), max(ds['lon'].data), len(ds['lon'].data))  # 经度
lat = np.linspace(min(ds['lat'].data), max(ds['lat'].data), len(ds['lat'].data))  # 纬度
#构建经纬网
lon, lat = np.meshgrid(lon, lat)
dem = ds['elevation'].data  # DEM数据
 
#站点观测数据读取
data = pd.read_excel(r'F:\wangxj\data\观测站点坐标.xlsx')
lon_points = data['lon'] 
lat_points = data['lat']
points = data['sites'] #站点编号
 
#plot---------------------------------------
 
plt.rcParams['font.sans-serif'] = ['Times New Roman']
fig=plt.figure(figsize=(8,8))
 
#创建底图,设置地图投影为World Plate Carrée,分辨率为高分辨率,地图范围为全球
m = Basemap(projection='cyl', resolution='l', llcrnrlon=105, llcrnrlat=5, urcrnrlon=122, urcrnrlat=25)
 
#设置地图经纬线,并只在左端和底端显示
m.drawmeridians(np.arange(105, 130, 5), labels=[0, 0, 0, 1], fontsize=10, linewidth=0.8, color='silver')  # 经线
m.drawparallels(np.arange(5, 30, 5), labels=[1, 0, 0, 0], fontsize=10, linewidth=0.8, color='silver')  # 纬线
#标注 珠江、黑潮等
plt.text(113,23,'PearlRiver',fontsize=10,weight="bold",verticalalignment='center',horizontalalignment='center',rotation=-25) 
plt.text(106,12.5,'MekongRiver',fontsize=10,weight="bold",verticalalignment='center',horizontalalignment='center',rotation=-65) 
plt.text(121,20,'KurishinoCurrent',fontsize=10,weight="bold",verticalalignment='center',horizontalalignment='center',rotation=90) 
#将站点数据的编号标注到地图上,为了彼此之间的标注不重合,最好错落标注。
for n in range(0,9):
    plt.text(lon_points[n], lat_points[n], str(points[n]), size=8,zorder=5,color='k')
for n in range(9,11):
    plt.text(lon_points[n], lat_points[n], str(points[n]), size=8,zorder=5,color='k',rotation=45)
#给SEATS站点绘制*号标志
m.scatter(lon_points[17], lat_points[17], marker='*', s=50, facecolor='r',edgecolor='k', linewidth=0.5,zorder=5)
plt.text(lon_points[17], lat_points[17]-0.5, 'SEATS',fontsize=10,weight="bold",verticalalignment='center',horizontalalignment='center')
 
#绘制地图
#创建分级
levels = [ -4000, -2000, -1000, -200, -50, 0, 50, 200, 1000, 1500, 2000, 3000, 4000]
# 设置色带
color = [ '#4292c6', '#6baed6', '#9ecae1', '#c6dbef', '#deebf7', '#006837', 
         '#31a354', '#78c679', '#addd8e', '#d9f0a3', '#f7fcb9', '#c9bc87', '#a69165'] 
#绘制地形图
pcmesh=m.contourf(lon, lat, dem, levels=levels, extend='both', colors=color)
#绘制站点
m.scatter(lon_points, lat_points, marker='.', s=50, facecolor='r',
            edgecolor='r', linewidth=0.5)
# 设置图例
cbar3=fig.colorbar(pcmesh,pad=0.03,shrink=0.8,ticks=levels)
ax2=cbar3.ax
ax2.set_title('Depth(m)',fontsize=10)
ax2.tick_params(labelsize=10)
#绘制指北针
labelsize=10
loc_x=1
loc_y=1
width=1
height=1
pad=1
minx, maxx = (105,106)
miny, maxy = (23,24)
ylen = maxy - miny
xlen = maxx - minx
left = [minx + xlen*(loc_x - width*.5), miny + ylen*(loc_y - pad)]
right = [minx + xlen*(loc_x + width*.5), miny + ylen*(loc_y - pad)]
top = [minx + xlen*loc_x, miny + ylen*(loc_y - pad + height)]
center = [minx + xlen*loc_x, left[1] + (top[1] - left[1])*.4]
triangle = mpatches.Polygon([left, top, right, center], color='k')
plt.text(s='N',
        x=minx + xlen*loc_x,
        y=miny + ylen*(loc_y - pad + height),
        fontsize=labelsize,
        horizontalalignment='center',
        verticalalignment='bottom')
plt.gca().add_patch(triangle)
 
plt.savefig(r'F:\wangxj\data\The south China Sea elevation_1.png', dpi=300, bbox_inches='tight', pad_inches=0.1)  # 输出地图,并设置边框空白紧密
plt.show()  # 显示地图 

绘制完的图长这样子

为了好看一些,可以加一点观测数据的航行轨迹,还有珠江羽流的影响或者黑潮流的示意图或者南海季风系统等,大家可以根据实际需要,用PPT美化哈哈哈

相关推荐

如何用 coco 数据集训练 Detectron2 模型?

随着最新的Pythorc1.3版本的发布,下一代完全重写了它以前的目标检测框架,新的目标检测框架被称为Detectron2。本教程将通过使用自定义coco数据集训练实例分割模型,帮助你开始使...

CICD联动阿里云容器服务Kubernetes实践之Bamboo篇

本文档以构建一个Java软件项目并部署到阿里云容器服务的Kubernetes集群为例说明如何使用Bamboo在阿里云Kubernetes服务上运行RemoteAgents并在agents上...

Open3D-ML点云语义分割实验【RandLA-Net】

作为点云Open3D-ML实验的一部分,我撰写了文章解释如何使用Tensorflow和PyTorch支持安装此库。为了测试安装,我解释了如何运行一个简单的Python脚本来可视化名为...

清理系统不用第三方工具(系统自带清理软件效果好不?)

清理优化系统一定要借助于优化工具吗?其实,手动优化系统也没有那么神秘,掌握了方法和技巧,系统清理也是一件简单和随心的事。一方面要为每一个可能产生累赘的文件找到清理的方法,另一方面要寻找能够提高工作效率...

【信创】联想开先终端开机不显示grub界面的修改方法

原文链接:【信创】联想开先终端开机不显示grub界面的修改方法...

如意玲珑成熟度再提升,三大发行版支持教程来啦!

前期,我们已分别发布如意玲珑在deepinV23与UOSV20、openEuler24.03发行版的操作指南,本文,我们将为大家详细介绍Ubuntu24.04、Debian12、op...

118种常见的多媒体文件格式(英文简写)

MP4[?mpi?f??]-MPEG-4Part14(MPEG-4第14部分)AVI[e?vi??a?]-AudioVideoInterleave(音视频交错)MOV[m...

密码丢了急上火?码住7种console密码紧急恢复方式!

身为攻城狮的你,...

CSGO丨CS2的cfg指令代码分享(csgo自己的cfg在哪里?config文件位置在哪?)

?...

使用open SSL生成局域网IP地址证书

某些特殊情况下,用户内网访问多可文档管理系统时需要启用SSL传输加密功能,但只有IP,没有域名和证书。这种情况下多可提供了一种免费可行的方式,通过openSSL生成免费证书。此方法生成证书浏览器会提示...

Python中加载配置文件(python怎么加载程序包)

我们在做开发的时候经常要使用配置文件,那么配置文件的加载就需要我们提前考虑,再不使用任何框架的情况下,我们通常会有两种解决办法:完整加载将所有配置信息一次性写入单一配置文件.部分加载将常用配置信息写...

python开发项目,不得不了解的.cfg配置文件

安装软件时,经常会见到后缀为.cfg、.ini的文件,一般我们不用管,只要不删就行。因为这些是程序安装、运行时需要用到的配置文件。但对开发者来说,这种文件是怎么回事就必须搞清了。本文从.cfg文件的创...

瑞芯微RK3568鸿蒙开发板OpenHarmony系统修改cfg文件权限方法

本文适用OpenHarmony开源鸿蒙系统,本次使用的是开源鸿蒙主板,搭载瑞芯微RK3568芯片。深圳触觉智能专注研发生产OpenHarmony开源鸿蒙硬件,包括核心板、开发板、嵌入式主板,工控整机等...

Python9:图像风格迁移-使用阿里的接口

先不多说,直接上结果图。#!/usr/bin/envpython#coding=utf-8importosfromaliyunsdkcore.clientimportAcsClient...

Python带你打造个性化的图片文字识别

我们的目标:从CSV文件读取用户的文件信息,并将文件名称修改为姓名格式的中文名称,进行规范资料整理,从而实现快速对多个文件进行重命名。最终效果:将原来无规律的文件名重命名为以姓名为名称的文件。技术点:...

取消回复欢迎 发表评论:

请填写验证码