百度地图+Echarts+克里金插值算法实现等值图

本文介绍了如何利用百度地图、Echarts和克里金插值算法,将气象数据如气温、降雨量转化为等值图进行展示。作者通过将克里金插值算法生成的数据转换为Echarts可识别的矩形格子数据结构,并结合Echarts地图分箱功能,成功实现在百度地图上的等值图展示。过程中遇到坐标匹配问题,但最终解决了并给出了实现步骤。
摘要由CSDN通过智能技术生成

百度地图+Echarts+克里金插值算法实现等值图

效果图:

公司最近要我弄一套基于百度地图的发电站、气温、风场等一系列地图展示,这些Echarts上很多可以直接拿来使用。Echarts的点状图,路径迁移图,风场矢量图我都已经实现,但是到了气温和降雨的等值图时,进展不是很顺利。

我是一个半路做前端的,之前是做java后端的,对气象数据完全不是很懂,百度了不少资料,但是发现克里金(kriging)插值算法很符合我的需要,但是奈何本人完全搞不懂是怎么算的,不过可以直接拿来用也是好的,但是,目前网上很多都是用openlayer、arcgis或者leaflet来实现的,之前我的很多图表暂时都基于百度地图和Echarts,所以,就想着把网上现有的功能和百度地图结合,好在经过试验,已经成功,如果你也有类似需求,希望可以帮到你。

参考资料:https://codepen.io/jianxunrao/pen/oadBPq     openlayer+kriging实现

                 https://echarts.apache.org/examples/zh/editor.html?c=map-bin     echarts的在百度地图上分箱

我的实现就是基于两者的一个结合

  1. 先创建一个div用来展示地图,给他一个初始宽高。百度地图的ak请替换成自己的
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Bmap+echarts热力图</title>
        <script src="https://ajax.aspnetcdn.com/ajax/jquery/jquery-3.5.1.min.js"></script>
        <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/echarts@5/dist/echarts.min.js"></script>
        <script src='./js/kriging-original.js'></script>
        <script type="text/javascript" src="./js/bmap.js"></script>
        <script src="http://api.map.baidu.com/api?v=3.0&ak=qxtHlX3iHors0dHRMZE0N4OLE8Vu7wbH"></script>
        <style>
            html, body, #container {
                width: 100%;
                height: 100%;
                margin: 0;
                padding: 0;
                overflow: hidden;
                cursor: default;
            }
        </style>
    </head>
    <body>
        <div id="container"></div>
 </body>
</html>

2.krigin

克里金插值(Universal Kriging)是一种基于克里金插值的高级插值方法,可以同时考虑空间变异性和其他因素(如时间、高程等)对插值结果的影响。下面是 Python 中使用 `scipy` 库实现克里金插值的一个简单示例: ```python import numpy as np from scipy.spatial.distance import pdist, squareform from scipy.linalg import solve # 定义泛克里金插值函数 def universal_kriging(x, y, z, xi, yi, model='linear', sigma=1.0, alpha=1e-5): # 计算距离矩阵 d = squareform(pdist(np.vstack((x, y)).T)) # 计算协方差矩阵 if model == 'linear': K = np.hstack((np.ones((len(x), 1)), x, y, d)) m, n = K.shape C = np.zeros((n, n)) C[0, 0] = sigma ** 2 C[1:n, 1:n] = np.dot(K.T, K) + alpha * np.eye(n - 1) # 解线性方程组 m = np.hstack((np.ones((len(xi), 1)), xi, yi, pdist(np.vstack((xi, yi)).T, np.vstack((x, y)).T))) c = np.dot(K.T, z) lamb = solve(C, c) # 计算插值结果 z_interp = np.dot(m, lamb) return z_interp # 生成示例数据 x = np.random.rand(10) * 10 y = np.random.rand(10) * 10 z = np.sin(x) + np.cos(y) xi, yi = np.meshgrid(np.linspace(0, 10, 100), np.linspace(0, 10, 100)) # 进行泛克里金插值 zi = universal_kriging(x, y, z, xi.flatten(), yi.flatten()) # 绘制插值结果 import matplotlib.pyplot as plt fig = plt.figure(figsize=(8, 6)) ax = fig.add_subplot(111) ax.pcolormesh(xi, yi, zi.reshape(xi.shape), cmap=plt.get_cmap('jet')) ax.scatter(x, y, c='k', s=50) ax.set_xlim(0, 10) ax.set_ylim(0, 10) plt.show() ``` 在这个示例中,我们首先生成了一组随机的数据点并计算了其函数值,然后使用 `universal_kriging` 函数进行插值。该函数可以接受三个参数:已知点的 x 坐标、y 坐标和函数值,以及未知点的 x 坐标和 y 坐标。在函数内部,我们先计算了距离矩阵和协方差矩阵,然后使用线性代数方法求解插值系数,并计算插值结果。最后,我们使用 `matplotlib` 库绘制了插值结果的热力和已知点的散点
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值