前端实现克里金插值分析(二)

news2025/7/23 8:12:04

作者:yangjunlin

  在上一篇文章中我们已经使用了像素法实现克里金插值的方式,但是问题也就随之抛了出来。1.第一点,在反距离权重插值的时候,因为处理的数据量大会直接导致主线程卡,导致用户体验不好,2.第二点,分析过程中 zoom级别改变,坐标转像素的值的计算方式也会发生变化,这样就会导致(坐标转像素坐标,像素坐标转坐标)会出现错误结果。
  我们先分析一下第一个问题,主线程卡顿的问题其实很好解决, Web Worker 可以创建一个独立于主线程运行的子线程。可以将一些【可能会阻塞主线程的操作】,丢在 Worker 里去单独执行。因此我们可以直接将卡住进程的反距离权重插值分析方法直接抛到webworker里面即可
  再看下第二个问题,既然像素没法用,那么我们就自己搞‘像素’ 也就是自己画格子。其实坐标到像素仔细来看可以认为是一种投影,那么我们是不是也能自己搞一套投影了。从当前我的数据的坐标系来看,我用的mapboxgl3857的web墨卡托投影的坐标,全球的比例级别可直接认为是1:1,中国地区是没有被压扁的。我的思路是这样的我们也可以画一个1:1的范围是正方形的图形,然后对里面的区域再进行[m,m]的小网格划分。3857web墨卡托与该正方形的范围基本上就是成一个k比例的,也就是说,我们不用复杂的投影计算,只需要简单的算出每个单位的经纬度所占的小格子数就可以,这样就大大降低了难度。

【第二问题的解决】下面我将带着大家先搞第二个问题,用自己创建网格的方式来做前端克里金插值分析

    1. 首先我们先搞正方形的范围,我采取的方案是将分析范围矩形变为正方形,这个很简单直接用矩形的长边作为正方形的边长即可,然后拿到改边的长度
 let width=bbox[2]-bbox[0];
    let height=bbox[3]-bbox[1];
    length=width-height>0?width:height
    return length;
    1. 确定好网格的大小,我这里使用是的1000*1000
//形成1000*1000的网格。
    let cw=1000,ch=1000;

    1. 拿到网格和目前坐标系单位的比例关系
let k=cw/lenght; 
    1. 将气象点坐标,放在几何范围左下为原点的位置上,然后进行所谓的‘投影’–将坐标系单位,转为网格位置,这样我们就能将我们画好的网格和网格坐标系下的分析点的位置关联起来,也就是说后面可以进行反距离权重分析了,将网格上的每个小格子上都填上值
 //将几何范围放到左下为原点的位置上
       let x=data[i].x-xoffset;
       let y=data[i].y-yoffset;
 //进行投影,将局部 
       let posx=x*k;
       let posy=y*k;
  • 5.进行反距离权重,也就是填满小格子的操作(前文有描述,这里不在写)
    1. 然后利用d3-couter得到等值线,特别需要注意的是这里得到的只是格网单位上的值,而不是真实地理位置上的值,我们需要进行一个’反投影’并再加载几何范围的最小x和最小y即可
let x= coordinates[i][j][m][0]*1/k+box[0]
let y=coordinates[i][j][m][1]*1/k+box[1]
coordinates[i][j][m] = [x, y]
    1. 剩下的就只是相交和渲染了与上文所描述的一致我们现在看下效果,结果发现有偏移,这是为啥呢
      在这里插入图片描述
      其实很简单,就是格子画的不够小,导致分析结果有误差,现在只要我们在细化下网格搞一个5000*5000的,得到的结果非常的完美
      在这里插入图片描述
      在这里插入图片描述
      与像素化的分析结果基本是一致的。但是现在这个我们已经可以控制你划分的格网大小了

【第一个问题解决】这个问题就比较简单了,直接搞个子线程将反距离权重交给他来做即可直接上代码

    1. 首先创建worker.js,并进行监听,监听主线程传过来进行反距离分析的数据data,然后再将结果数据返回给主线程
//Worker.js
self.onmessage = function ({data}) {
 const resdata=IDW(data['data'],data['cw'],data['ch'])
 self.postMessage({ resdata })
}
self.onerror = function (err) {
 throw new Error(err)
}
//主进程:
//webworker
const worker = new Worker('./worker.js', {
   name: 'my-worker'
})
//主线程向子线程发数据
worker.postMessage({
   data: pxdata.data,
   cw: cw,
   ch: ch,
   contours
})
// 监听到子线程返回的数据
worker.onmessage = ({
   data
}) => {
   const idwdata = data['resdata'];}

然后将拿到结果在进行d3分析,解析渲染即可,这样就解决因为反距离权重分析的时间长导致主进程卡在而导致无法正常使用地图的问题。

后言

当然这个只是我的一个demo,代码肯定还有很多不完善的地方,这两篇文章只是提供给大家做前端插值分析的一个小方向,如果大家有更多的更优的解决方案,欢迎大家在评论里讨论

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

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

相关文章

Apache开启SSL(https)访问网站配置

前言:问题稍微有点绕,整个配置过程,测试成功 服务器的80端口分配了Apache使用了(用phpstudy运行php网站),服务器上还有(IIS网站,站点使用81端口),需要用80转81(中转代理一下到IIS访问网站,iis无需重复配置ssl设置) 就实现了:一台服务器使用2种语言(php/asp.ne…

闭环控制(自动控制理论)

目录 闭环控制 开环控制和闭环控制优缺点 闭环控制 即有被控制量反馈的控制。从系统中信号流向看,系统的输出信号沿反馈通道又回到系统的输入端,构成闭合通道,故称作为闭环控制系统,又或者称为反馈控制系统 这种控制方式&#xf…

微服务环境搭建SpringCloud入门

目录 案例准备 技术选型 模块设计 微服务调用 创建父工程 创建基础模块 创建用户微服务 创建商品微服务 创建订单微服务 我们本次是使用的电商项目中的商品、订单、用户为案例进行讲解。 案例准备 技术选型 maven:3.5.4 数据库:MySQL 5.7 持…

【矩阵论】4. 矩阵运算——广义逆——广义逆的计算

4.3.2 AA^A 计算 a. 秩1公式 若A(aij)mn,r(A)1,则A1∑∣aij∣2AH1tr(AHA)AH\begin{matrix} 若A(a_{ij})_{m\times n},r(A)1,则A^\frac{1}{\sum \vert a_{ij}\vert^2}A^H\frac{1}{tr(A^HA)}A^H \end{matrix} 若A(aij​)mn​,r(A)1,则A∑∣aij​∣21​AHtr(AHA)1​AH​ AHAA^HAA…

Qt Quick 用cmake怎么玩子项目

以往在公司开发众多的项目中,都会出现要求本项目里部分功能模块代码需要具备保密性。如果需要对外输出demo工程,那么需要做到不会泄密。 举一下爪子,以前做雷达开发的时候,客户从公司那儿买了这些雷达模块,也会需要从…

信号量的使用

信号量 英文名字:semaphore 这里的进程信号量会为下列的信号量打基础 Ucos系统的信号量c线程的信号量java进程和线程的信号量 信号量作用 当多个进程/线程进行共享操作时,用于资源保护,以防止出现相互干扰的情况 信号量用于“资源的保护“ …

图论算法大合集【包括图的dfs和bfs遍历】【欧拉回路】【判断连通图】【Dijkstra算法】【floyd算法】【最小生成树prim算法】【拓扑排序】

图论算法大合集一. dfs和bfs 过程中要有visited数组标记已遍历过的节点6-1.1 邻接矩阵存储图的深度优先遍历6-1.2 邻接表存储图的广度优先遍历二、欧拉回路(度为偶数,且为连通图)6-1.3 哥尼斯堡的“七桥问题”三、判断连通图6-1.4 地下迷宫探…

进程调度的基本关系

文章目录1.什么是进程(process)2.进程的特性1.进程是非常重要的"软件资源"2.PCB(进程控制块)描述了哪些进程特征3.并行和并发4.进程的虚拟地址空间和进程间通信1.什么是进程(process) 简单来说就是:一个程序跑起来就是一个进程 一个应用没跑起来叫做程序,跑起来了就…

堆排序算法

一、大顶堆和小顶堆概念 堆排序是利用堆数据结构而设计的一种排序算法,堆排序是一种选择排序,其最坏,最好,平均时间复杂度均为O(nlogn),同时也是不稳定排序。 堆是具有以下性质的完全二叉树:每个结点的值都…

Hive数据定义语言-DDL-建表高阶语法(内外部、分区、分桶、事务、视图、物化视图)

文章目录1. 内部表、外部表1.1 内部表1.2 外部表1.3 内、外部表差异1.4 Location关键字的作用2. 分区表-Partitioned Tables2.1 概念2.2 创建2.3 分区表数据加载2.3.1 静态分区2.3.2 动态分区2.4 注意事项3. 分桶表-Bucketed Tables3.1 概念3.2 规则3.3 语法3. 事务表-Transact…

编译openMVG出现的错误的解决

作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> submodule(s) are missing, please update your repository 在使用CMake生成openMVG解决方案时,出现错误: CMake Error at CMakeL…

另眼看数据中台

目录 前言: 一、故事的开始 二、成也中台,败也中台 1、中台是什么 2、数据中台与企业数字化转型 3、中台的赋能 4、数据中台、业务中台、技术中台 5、中台不一定适合你 ​编辑​编辑小结: 三、 自检数据应用的成熟度 前言&#xff1…

Python学习基础笔记十二——文件

1、目的:是要将数据永久地保存下来,就需要将数据永久保存在硬盘中。 2、概念:文件就是操作系统提供给应用程序来操作硬盘虚拟接口,用户或应用程序通过操作文件,可以将自己的数据永久地保存下来。 3、步骤; …

MACU-Net-用于精细分辨率遥感图像语义分割网络

摘要: 在本文中我们结合了由不同层次的U-Net生成的多尺度特征,设计了一个多尺度跳跃连接和基于非对称卷积的网络--MACU-Net。 网络具有以下几个优点1)多尺度跳跃连接将低层和高层特征图中包含的语义特征结合并重新进行排列2)非对…

一文搞懂傅里叶级数与变换

描述 这篇文章的目标:以最简单易懂的方式,让大家学会傅里叶变换! 为什么要写一篇关于傅里叶变换相关知识的文章呢。有两个原因: 一、这个知识很有趣,可以理解它是一件炫酷的事情。在工作中,一次分享会同事…

BufferPool缓存机制

BufferPool缓存机制 1、更新数据流程 流程图 sql更新数据刷到磁盘前会经过serve层 连接器-管理连接和权限校验优化器-语法词法分析优化器-执行计划生成索引选择执行器-连接bufferPool 1.1 流程步骤 从磁盘加载数据到buffer pool,会先去判断要更新的数据所在数据…

Hantek6022BE 虚拟示波器

​ 0. Hantek 厂家提供的介绍 安装方法按照说明来。 很多人都说原厂的软件不好用,于是折腾就开始了: 1. VIRTINS Multi-Instrument 这个别人已经写的很详细了 大概需要准备 Multi-Ins 这软件,目前找到 3.7 的合用 菜单里 添加设备到库&a…

HTML+CSS详细知识点复习(上)

文章目录一、初识HTML1、标签概述二、初识CSS1、CSS核心基础2、设置文本样式3、高级特性4、CSS的优先级三、CSS选择器1、关系选择器四、盒子模型1、边框属性2、边距属性3、背景属性4、盒子的宽与高5、CSS3新增盒子模型属性一、初识HTML HTML(超文本标记语言&#x…

用Python采集世界杯球队热搜数据 并发送邮箱通知

前言 嗨嗨,最近世界杯的热度可是一直在增长啊 待会就是 卡塔尔和塞内加尔打了 怎么说 还是有点期待结果的 趁现在有点无聊 就想着用Python采集世界杯球队热搜数据 顺便 发送邮箱通知 话不多说,马上开始 知识点 动态数据抓包requests发送请求json数据…

【Proteus仿真】【51单片机】智能雨刷器设计

文章目录一、主要功能二、硬件资源三、软件设计四、实验现象联系作者一、主要功能 本项目使用Proteus8仿真51单片机控制器,使用LCD1602液晶模块、按键模块、雨滴传感器、ADC、LED模块等。 主要功能: 系统运行后,LCD1602显示雨刷器当前模式、…