【python由站点数据插值到网格数据方法对比】

文章目录

  • 1、前言
  • 2、结果对比
    • 2.1 原始散点站位图
    • 2.2 griddata插值
    • 2.3 krige插值
    • 2.4 RBF插值
    • 2.5 IDW插值
  • 3、总结

1、前言

  • 气象海洋中空间数据类型有站点数据、格点数据。
  • 站点数据空间分布不连续,不利于进行时空分析;有时需要将站点数据插值到网格中。
  • 本文基于一个散点数据对比了griddata、IDW、krige、rbf的插值结果。

2、结果对比

2.1 原始散点站位图

  • 原始散点站位如下:
    在这里插入图片描述

2.2 griddata插值

from scipy.interpolate import griddata
lat = df_filter['Lat']
lon = df_filter['Lon']
VIS_Min = df_filter['VIS_Min']
olon = np.linspace(lon.min(), lon.max(), 40)
olat = np.linspace(lat.min(), lat.max(), 40)
olon, olat = np.meshgrid(olon, olat)
VIS_Min_grd=griddata((lon,lat),VIS_Min,(olon, olat),method='linear')
plt.figure(figsize=(8,6))
plt.pcolormesh(olon, olat, VIS_Min_grd)
plt.scatter(lon, lat, s=50, c=VIS_Min, cmap='viridis',edgecolors='k')
  • 可视化代码
import os
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.colors as mcolors
import matplotlib as mplimport cartopy.crs as ccrs
import cartopy.io.shapereader as shpreader
from mpl_toolkits.axes_grid1.inset_locator import inset_axes
from matplotlib.colors import LinearSegmentedColormapimport regionmask
import geopandas as gpd
import warningswarnings.filterwarnings("ignore")
import matplotlib.ticker as ticker
extents = [115.6, 117.2, 39.7, 40.8]
crs = ccrs.PlateCarree()
fig = plt.figure(figsize=(12, 6))
ax = fig.add_subplot(111, projection=crs)
ax.set_extent(extents, crs)prov_reader = shpreader.Reader(r'.\bou2_4p.shp')
nineline_reader = shpreader.Reader(r'.\九段线.shp')ax.add_geometries(prov_reader.geometries(), crs, edgecolor='gray', facecolor='none', lw=1)
ax.add_geometries(nineline_reader.geometries(), crs, edgecolor='gray', facecolor='none', lw=1)ax.set_xticks(np.arange(extents[0], extents[1] + 0.3, 0.3))
ax.set_yticks(np.arange(extents[2], extents[3] + 0.2, 0.2))
plt.tick_params(axis='both', which='major', labelsize=18)norm = mcolors.Normalize(vmin=0, vmax=np.round(VIS_Min.max()))
cmap_jet = plt.cm.jet
cmap_gray = plt.cm.gray
gray = cmap_gray(np.linspace(0, 1, 9))
colors = np.vstack((gray[8], cmap_jet(np.linspace(0, 1, 9))))
cmaps = LinearSegmentedColormap.from_list('Combined', colors, N=64)map = plt.pcolormesh(olon, olat, VIS_Min_grd, cmap=cmaps)
plt.scatter(lon, lat, s=50, c=VIS_Min, cmap=cmaps,edgecolors='k',norm=norm)
cb_ax = inset_axes(ax, width="3%", height="100%", loc='lower left', bbox_to_anchor=(1.01, 0., 1, 1),bbox_transform=ax.transAxes, borderpad=0)
cbar = plt.colorbar(mpl.cm.ScalarMappable(norm=norm, cmap=cmaps), cax=cb_ax, ax=map)
cbar.ax.set_title('能见度', size=18, fontname='SimHei', pad=10)
cbar.ax.tick_params(labelsize=15)
ax.set_xlabel('Lon(°E)', fontsize=18)
ax.set_ylabel('Lat(°N)', fontsize=18)
ax.set_title('原始散点站位', size=18, fontname='SimHei', pad=10)
  • 可视化结果
    在这里插入图片描述

2.3 krige插值

  • 插值核心代码
from pykrige.ok import OrdinaryKriging
lat = df_filter['Lat']
lon = df_filter['Lon']
VIS_Min = df_filter['VIS_Min']
olon = np.linspace(lon.min(), lon.max(), 40)
olat = np.linspace(lat.min(), lat.max(), 40)Krin=OrdinaryKriging(lon,lat,VIS_Min,variogram_model='gaussian',coordinates_type="geographic",nlags=1,)
data2,ssl=Krin.execute('grid',olon,olat)olon, olat = np.meshgrid(olon, olat)
plt.figure(figsize=(8,6))
plt.pcolormesh(olon, olat, data2)
plt.scatter(lon, lat, s=50, c=VIS_Min, cmap='viridis',edgecolors='k')
  • 插值结果
    在这里插入图片描述

2.4 RBF插值

  • 插值核心代码
from scipy.interpolate import Rbf
lat = df_filter['Lat']
lon = df_filter['Lon']
VIS_Min = df_filter['VIS_Min']
olon = np.linspace(lon.min(), lon.max(), 40)
olat = np.linspace(lat.min(), lat.max(), 40)
olon, olat = np.meshgrid(olon, olat)
func1=Rbf(lon,lat,VIS_Min,function='linear')
VIS_Min_rbf=func1(olon,olat)plt.figure(figsize=(8,6))
plt.pcolormesh(olon, olat, VIS_Min_rbf)
plt.scatter(lon, lat, s=50, c=VIS_Min, cmap='viridis',edgecolors='k')
  • 插值结果
    在这里插入图片描述

2.5 IDW插值

  • 插值核心代码
from math import radians, sin, cos, sqrt, asin
import numpy as np# degree to km (Haversine method)
def haversine(lon1, lat1, lon2, lat2):R = 6372.8  # Earth radius in kilometersdLon = radians(lon2 - lon1)dLat = radians(lat2 - lat1)lat1 = radians(lat1)lat2 = radians(lat2)a = sin(dLat/2)**2 + cos(lat1)*cos(lat2)*sin(dLon/2)**2c = 2*asin(sqrt(a))d = R * creturn ddef IDW(x, y, z, xi, yi):lstxyzi = []for p in range(len(xi)):lstdist = []for s in range(len(x)):d = (haversine(x[s], y[s], xi[p], yi[p]))lstdist.append(d)sumsup = list((1 / np.power(lstdist, 2)))suminf = np.sum(sumsup)sumsup = np.sum(np.array(sumsup) * np.array(z))u = sumsup / suminfxyzi = [xi[p], yi[p], u]lstxyzi.append(xyzi)return(lstxyzi)lat = df_filter['Lat']
lon = df_filter['Lon']
VIS_Min = df_filter['VIS_Min']
olon = np.linspace(lon.min(), lon.max(), 40)
olat = np.linspace(lat.min(), lat.max(), 40)
olon, olat = np.meshgrid(olon, olat)
VIS_Min_idw=IDW(lon,lat,VIS_Min,olon.flatten(), olat.flatten())VIS_Min_idw= np.array(VIS_Min_idw)[:,2].reshape(olon.shape)
plt.figure(figsize=(8,6))
plt.pcolormesh(olon, olat, VIS_Min_idw)
plt.scatter(lon, lat, s=50, c=VIS_Min, cmap='viridis',edgecolors='k')
  • 插值结果
    在这里插入图片描述

3、总结

  • 插值范围上,除了griddata以外的其它插值方法,都可以插值到站点以外的区域;
  • 插值效果上,从本案例的结果上看,我认为反距离权重IDW结果最好,之后为RBF,其次是克里金。
    在这里插入图片描述

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

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

相关文章

GEC6818开机自动加载驱动与更改开发板的RTC时钟

GEC6818开机自动加载驱动与更改开发板的RTC时钟 本文主要涉及: 1.GEC6818开机自动加载驱动 2.更改开发板的RTC时钟 文章目录 GEC6818开机自动加载驱动与更改开发板的RTC时钟一、开机自动加载驱动或运行程序**STEP1:** 使用vi打开文件profile.命令如下**S…

Day35 贪心 part04

Day35 贪心 part04 860.柠檬水找零 我的思路: 只要逐个考虑bills数组可能的数字 5/10/20,分别考虑 解答: class Solution {public boolean lemonadeChange(int[] bills) {int fivecount 0;int tencount 0;for(int bill : bills) {if(bill 5) {fiv…

116道网络安全面试题目总结

1、Burpsuite常用的功能是什么? 2、reverse_tcp和bind_tcp的区别? 3、拿到一个待检测的站或给你一个网站,你觉得应该先做什么? 4、你在渗透测试过程中是如何敏感信息收集的? 5、你平时去哪些网站进行学习、挖漏洞提…

“智慧食堂”设计与实现|Springboot+ Mysql+Vue+Java+ B/S结构(可运行源码+数据库+设计文档)

本项目包含可运行源码数据库LW,文末可获取本项目的所有资料。 推荐阅读100套最新项目持续更新中..... 2024年计算机毕业论文(设计)学生选题参考合集推荐收藏(包含Springboot、jsp、ssmvue等技术项目合集) 目录 1. 功…

智能电表怎么偷电?

大家好,今天我们要聊的是一个关于智能电表的小疑惑——智能电表是否能被“偷电”。可能你听过这样的说法,有人声称通过某些方法可以让电表不准确计费,甚至可以“偷电”。但事实真的是这样吗?让我们一起来科普一下。 首先,智能电表…

面经总结1

锁 数据库中事务的隔离性就是通过锁和mvcc(多版本并发控制)来实现的。锁分为悲观锁和乐观锁两种,悲观锁是指在数据并发访问中会发生冲突,因此在操作数据的时候会进行加锁,防止其他事务对其修改,通过SELECT …

全球首位AI程序员诞生,技术革新还是职业威胁?

目录 导语: 一、2024年的第一丝凉意 二、AI在编程领域的应用现状 三、关于Devin的现状 四.未来展望 五.面对未来挑战,我们应该 结语: 导语: 时间回调到两周前的3月13号,世界上第一位AI程序员Devin诞生&#xff…

人工智能的决策树介绍

决策树模型 决策树基于“树”结构进行决策 每个“内部结点”对应于某个属性上的“测试”每个分支节点对应于该测试的一种可能结果(即属性的某个取值)每个“叶结点”对应于一个“预测结果” 学习过程:通过对训练样本的分析来确定“划分属性”…

记录echarts各种地图json文件下载地址

今日绘图需要用到echarts的地图json文件,但是github上已经找不到了,后发现伟大的网友提供了地址如下:Index of /examples/data/asset/geohttps://echarts.apache.org/examples/data/asset/geo/ 免费下载实时更新的geoJson数据、行政区划边界…

如何解决Modbus转Profinet网关通信不稳定或数据丢失问题

接到现场反映,在配置Modbus转Profinet网关时,出现Modbus转Profinet网关(XD-MDPN100)通信不稳定或数据丢失的问题,就这个问题特做出答疑。 解决Modbus转Profinet网关(XD-MDPN100)通信不稳定或数据…

【Linux进阶之路】理解UDP,成为TCP。

前言 学了TCP 和UDP之后,感觉UDP就像是初入职场的年轻人,两耳不闻 “窗外事”,只管尽力地把自己的事情做好,但收获的却是不可靠,而TCP更像是涉世极深的"职场老油条",给人的感觉就是 “城府极深&a…

Arduino中引脚的数字与真实引脚的对应关系

我们使用arduino开发时,最长遇到的是对端口管脚的拉高拉低,代码如下 void setup() {pinMode(13,OUTPUT); }void loop() {digitalWrite(13,HIGH); }上面还最简单io控制代码,其中引脚我们使用了数字13,但是这个13对应着哪个引脚呢&a…

老壁灯带你入门动态规划

1. 什么是动态规划 动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。 从字面意义上来理解,就是走一步看一步,边解决问题,边对问题进行整体规划。 其实,动态规…

【Python】定时更换clashx工具

An empty street An empty house A hole inside my heart I’m all alone The rooms are getting smaller I wonder how I wonder why I wonder where they are The days we had The songs we sang together Oh yeah And oh, my love I’m holding on forever Reaching for a l…

RoCE v2中UDP的源端口和目的端口

0 前言 RoCE v2协议中RDMA的数据都是通过UDP来传输的,按照RoCE v2协议规范,UDP的目的端口是固定的(des port = 4791),但是UDP源端口的确定是由RDMA驱动使用hash来算出来的。不同的QP建链方式以及QP的类型采用具体的计算方法不同。其中源端口的范围是49152-65535 (十六进…

SqlServer(3)SqlServer经典总结大全-数据库同步-基础知识整理-能力提升

三、SQLServer同步复制技术实现步骤,配上详细步骤和代码语句和输出 SQL Server的同步复制是一种确保数据在发布服务器和订阅服务器之间实时同步的技术。以下是同步复制的详细步骤,包括代码语句和可能的输出。 1. 准备工作 确保两台服务器(…

【C语言】 操作符的详细知识点

文章目录 12 操作符🍒算术操作符🍒关系操作符🍒逻辑操作符🍒位操作符🍒赋值操作符🍒强制类型转换符🍒成员访问操作符:fire:操作符优先级计算大小符sizeof条件操作符 ? :const char *按位取反sn…

Mac上的Gatekeeper系统跟运行时保护

文章目录 问题:无法打开“xxx.xxx”,因为无法验证开发者。macOS无法验证此App是否包含恶意软件。如何解决? 参考资料门禁运行时保护 问题:无法打开“xxx.xxx”,因为无法验证开发者。macOS无法验证此App是否包含恶意软件…

Leetcode - 2580. 统计将重叠区间合并成组的方案数

文章目录 思路AC CODE总结 题目链接:2580. 统计将重叠区间合并成组的方案数 思路 一个区间合并的板子,计算出区间数目之后,每个区间都有放左和放右两种选法,所以最后的答案就是 2 k 2^k 2k。但是需要用c进行二维数组的排序&…

深入浅出(四)VTK库—3D可视化

VAT库 1. VTK简介1.1 下载 2. 编译和安装:3. C示例3.1 显示立方体3.2 VTK显示3D点云 1. VTK简介 VTK(Visualization Toolkit)是一个开源的跨平台的软件系统,用于3D计算机图形学、图像处理和可视化。它提供了丰富的功能和工具&…