下载NCEP的气象场grib2数据,风场是二维的向量,包含u和v两个分量。这个用经纬度投影到像素坐标会产生误差,直接绘制效果不太对:(
 

通过插值计算得到风场粒子的预测数据wind = interpolate(longitude, latitude),然而,由于地理坐标系在投影的过程中发生了失真(distortion),因此直接用wind绘制风场图是错误的!
我们需要对失真程度进行估算以减小误差,得到近似正确的风场粒子向量。
这里大致记录下用微积分学上的有限差分来估算投影失真程度的代码实现。
/**
* 解决平面像素坐标(x,y)投影地理坐标系失真造成的风场向量的畸变
* crsUtils是自定义投影坐标系工具类,可实现地理坐标和平面像素坐标互转
*/
function distort(crsUtils, λ, φ, x, y, scale, wind, options) {
let u = wind[0] * scale; //放大U分量
let v = wind[1] * scale; //放大v分量
let d = __distortion(crsUtils, λ, φ, x, y, options); //根据估算的结果重新构造U/V
wind[0] = d[0] * u + d[2] * v;
wind[1] = d[1] * u + d[3] * v;
return wind;
} /**
* 返回在给定点应用某个特定投影产生的失真
*
* 该方法使用了有限差分估计思想,通过在经度和纬度上增加非常小的量h来创建两条线段以计算扭曲程度。这些线段随后被投影到像素空间,
* 在那里它们变成三角形的对角线以表示在那个位置投影扭曲经度和纬度的程度。
*
* <pre>
* (λ, φ+h) (xλ, yλ)
* . .
* | ==> \
* | \ __. (xφ, yφ)
* (λ, φ) .____. (λ+h, φ) (x, y) .--
* </pre>
*
* See:
* Map Projections: A Working Manual, Snyder, John P: pubs.er.usgs.gov/publication/pp1395
* gis.stackexchange.com/questions/5068/how-to-create-an-accurate-tissot-indicatrix
* www.jasondavies.com/maps/tissot
*
* @returns {Array} array of scaled derivatives [dx/dλ, dy/dλ, dx/dφ, dy/dφ]
*/
function __distortion(crsUtils, λ, φ, x, y) {//λ表示经度, φ表示纬度
var hλ = λ < 0 ? H : -H;
var hφ = φ < 0 ? H : -H;
var pλ = __project([λ + hλ, φ], crsUtils);
var pφ = __project([λ, φ + hφ], crsUtils);
// Meridian scale factor (see Snyder, equation 4-3), where R = 1. This handles issue where length of 1° λ
// changes depending on φ. Without this, there is a pinching effect at the poles.
var k = Math.cos(φ / 360 * 2*Math.PI); return [
(pλ.x - x) / hλ / k,
(pλ.y - y) / hλ / k,
(pφ.x - x) / hφ,
(pφ.y - y) / hφ
];
} function __project(lngLatArr, crsUtils) {
var p = crsUtils.project(Array.from(lngLatArr).reverse());
return {
x: p.x - crsUtils.pixelOrigin.x,
y: p.y - crsUtils.pixelOrigin.y
};
}

改善后的渲染效果:

用有限差分估计(Finite Difference Estimate)解决地理坐标与平面像素坐标转换过程的误差造成风场粒子向量失真问题的更多相关文章

  1. Finite Difference Method with Mathematica

    Euler's method

  2. 有限差分法(Finite Difference Method)解方程:边界和内部结点的控制方程

    FDM解常微分方程 问题描述 \[\frac{d^2\phi}{dx^2}=S_{\phi} \tag{1} \] 这是二阶常微分方程(second-order Ordinary Differenti ...

  3. Dynamo分布式系统——「RWN」协议解决多备份数据如何读写来保证数据一致性,而「向量时钟」来保证当读取到多个备份数据的时候,如何判断哪些数据是最新的这种情况

    转自:http://blog.jqian.net/post/dynamo.html Dynamo是Amazon开发的一款高可用的分布式KV系统,已经在Amazon商店的后端存储有很成熟的应用.它的特点 ...

  4. Android使用OpenGL ES2.0显示YUV,您的手机上的数据要解决两个方面的坐标

    如果说 ,我不知道,如果你不明白这个话题.连接到:http://blog.csdn.net/wangchenggggdn/article/details/8896453(下称链接①), 里面评论有非常 ...

  5. stylus解决移动端1像素边框的问题

    首先 我是借用了yo框架的border和他的媒体查询组合 这两个分别是在yo>lib>core>classes>_border.scss(用来获取yo框架封装的border) ...

  6. stylus解决移动端1像素线等问题

    引用了yo框架中的_border.scss(用来获取yo框架封装的border)   以及   variables.scss(用来获取媒体查询的规则) border($border-width = 1 ...

  7. 移动端1px像素解决方式,从1px像素问题剖析像素及viewport

    在移动端web开发过程中,如果你对边框设置border:1px,会发现,边框在某些手机机型上面显示的1px比实际感觉会变粗,这也就是1像素问题.如下图是对桌面浏览器和移动端border设置1px的比较 ...

  8. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第八章:光照

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第八章:光照 代码工程地址: https://github.com/j ...

  9. [OpenCV] Image Processing - Spatial Filtering

    "利用给定像素周围的像素的值决定此像素的最终的输出值“ 教学效果: 策略: 1. 拉普拉斯,突出小细节: . 梯度,突出边缘: . 平滑过的梯度图像用于掩蔽: . 灰度变换,增加灰度动态范围 ...

  10. 图像分类:CVPR2020论文解读

    图像分类:CVPR2020论文解读 Towards Robust Image Classification Using Sequential Attention Models 论文链接:https:// ...

随机推荐

  1. JZOJ 2020.02.16【NOIP提高组】模拟A 组

    2020.02.16[NOIP提高组]模拟A 组 呼呼呼呼呼呼呼呼 今天暴力分可真多啊 第一次 \(A\) 组进前 \(5\) ! 呼呼呼呼呼呼呼呼 总有人虐场,总有人在场中被虐······ 总结 3 ...

  2. js根据某个字段进行分组

    分组前数据: [ {"f1":"q","f2":"w","f3":"e",&qu ...

  3. Node.js安装、webpack 安装步骤Windows

    注意:CMD要以管理员身份打开,否则在安装webpack那一步一直报错 默认 : C:\Windows\System32 --cmd.exe 什么是Node.js? 简单的说 Node.js 就是运行 ...

  4. 初学 Socket.io

    概念 Socket.io 是一个支持客户端和服务器之间的低延迟.双向和基于事件的通信的库,除了支持 JavaScript 以外,还支持 Java.Python.Golang. Socket.io 构建 ...

  5. python编写程序练习-车牌摇号程序

    import random import string count = 0      #设定计数器 car_numbers = []   # 创建一个列表,用来接收生产的车牌号池 while coun ...

  6. 如何在 JavaScript 中使用媒体查询

    前言 说起媒体查询想必大家最先想到的都是CSS中@media,没错,这是我们最常用的媒体查询方法,主要用来为我们的网站做适配处理. 比如: h1 { font-size: 2rem; color: g ...

  7. zookeeper要点总结

    简述:zookeeper分布式协调服务,节点数据存储在内存,高吞吐,低延时,zkserver cluster组建zookeeper service保证自身高可用 zookeeper数据模型为类文件目录 ...

  8. DevExpress gridControl 字体居住

    设置列的标题居中显示: Designer - Views -右侧输入框中输入Appearance-HeaderPanel-TextOptions-设置HAlignment为Center 设置单元格内容 ...

  9. sql语句顺序/包含执行顺序和书写顺序

    分页查询 如果一页记录为10条,希望查看第3页记录应该怎么查呢?  第一页记录起始行为0,一共查询10行:  第二页记录起始行为10,一共查询10行:  第三页记录起始行为20,一共查询10行: ...

  10. C++程序设计实验五 模板类与多态

    三.实验内容 2. 实验任务2 Person.hpp: #ifndef PERSON_TASK_HPP #define PERSON_TASK_HPP #include<iostream> ...