web前端利用leaflet生成粒子风场,类似windy

本文介绍如何在web前端利用Leaflet库结合自定义的wind.js,实现类似windy.com的粒子风场动画效果,展示动态风向和速度信息。
摘要由CSDN通过智能技术生成

wind.js如下:

$(function() {
    var dixing = L.tileLayer.chinaProvider('Google.Satellite.Map', {
        maxZoom: 18,
        minZoom: 2
    });
    var map = L.map("map", {
        center: [33.5, 114.6],
        zoom: 10,
        maxZoom: 20,
        minZoom: 3,
        layers: dixing,
        zoomControl: false,
        attributionControl: false,
        //        crs:L.CRS.EPSG4326
    });
    map.setView([-19, 150], 5);
    //各种定义和参数
    var grid = []; //定义经纬度网格数组
    var particles = []; //存放粒子数组
    var PARTICLE_MULTIPLIER = 0.4 / 300; //粒子数量参数,默认1/300,可以根据实际调
    var max_age = 100; //定义粒子的最大运动次数
    //没有风的情况
    var NULL_WIND_VECTOR = [NaN, NaN, null];
    var min_color = 0; // 风速为0使用的颜色
    var max_color = 10; // 风速最大使用的颜色
    var linewidth = 1.5; //定义粒子粗细
    var FRAME_RATE = 35, //定义每秒执行的次数
        FRAME_TIME = 1000 / FRAME_RATE; // desired frames per second
    var galpha = 0.92; //定义透明度,透明度越大,尾巴越长
    //存放颜色的数组
    var colorScale = ["rgb(36,104, 180)", "rgb(60,157, 194)", "rgb(128,205,193 )", "rgb(151,218,168 )", "rgb(198,231,181)", "rgb(238,247,217)", "rgb(255,238,159)", "rgb(252,217,125)", "rgb(255,182,100)", "rgb(252,150,75)", "rgb(250,112,52)", "rgb(245,64,32)", "rgb(237,45,28)", "rgb(220,24,32)", "rgb(180,0,35)"];
    //粒子动画的速度,为参数乘以屏幕的像素密度开三次方
    //如果不支持像素密度,就乘以1,
    //默认0.0005
    //    var vscale = (0.01) * (Math.pow(window.devicePixelRatio, 1 / 3) || 1); // scale for wind velocity (completely arbitrary--this value looks nice)
    var vscale = 0.01;
    var animationLoop; //定义动画
    //第一步生成经纬度网格///
    $.getJSON("leaflet-velocity-master/demo/wind-global.json", function(data) {
        setTimeout(function() {
            buildGrid(data);
            map.fire("moveend");
        }, 100)
        //        bulid_grid();
        //        create_new_lizi();
        //        var then = Date.now();
        //        (function frame() {
    
        //            animationLoop = requestAnimationFrame(frame);
        //            var now = Date.now();
        //            var delta = now - then;
        //            if(delta > FRAME_TIME) {
    
        //                then = now - delta % FRAME_TIME;
        //                evolve();
        //                draw();
        //            }
        //        })();
        //      map.fire("moveend");
    })
    var lon_min, lat_min, x_kuadu, y_kuadu, ni, nj;

    function createWindBuilder(uComp, vComp) {
        var uData = uComp.data,
            vData = vComp.data;
        return {
            header: uComp.header,
            //recipe: recipeFor("wind-" + uComp.header.surface1Value),
            data: function data(i) {
                return [uData[i], vData[i]];
            }
        };
    };

    function createBuilder(data) {
        var uComp = null,
            vComp = null,
            scalar = null;
        //从这里判断出,数据中的这两个参数,必须是固定的,否则会不执行
        data.forEach(function(record) {
            switch(record.header.parameterCategory + "," + record.header.parameterNumber) {
                case "1,2":
                case "2,2":
                    uComp = record;
                    break;
                case "1,3":
                case "
leaflet地图风场利用leaflet.js这个JavaScript库来展示风场数据的一种技术。风场数据包括风速和风向,通过可视化展示在地图上的方式,提供了直观且易于理解的风场信息。 leaflet.js是一个轻量级的地图库,可以实现在网页上展示交互式地图。它具有简洁的API接口和丰富的插件支持,非常适合用于构建交互式地图应用。通过leaflet地图风场技术,我们可以将风场数据与地图相结合,实现在地图上显示风速和风向的效果。 leaflet地图风场的实现过程一般包括以下几个步骤: 1. 数据准备:首先需要获取风场数据,通常是通过气象数据源获取到的。这些数据包括了风速和风向的信息。可以将这些数据转换成leaflet可识别的格式,如GeoJSON格式。 2. 创建地图:使用leaflet.js库创建一个地图容器,并设置初始的地图中心点、缩放级别等。 3. 添加风场图层:利用leaflet的图层功能,将风场数据添加到地图上。可以使用插件或自定义的方式来实现。 4. 风场可视化:对风场数据进行可视化处理,通常是将风速和风向信息转换成箭头、色阶等形式展示在地图上。可以利用leaflet的样式设置功能来实现。 5. 交互功能:为了增强用户体验,通常还可以添加一些交互功能,如鼠标悬停显示具体数值、点击风场图层显示风场数据的详细信息等。 通过leaflet地图风场技术,我们可以直观地了解不同地区的风场情况,对风能利用等方面提供支持。因其容易上手、功能丰富和灵活性强等特点,越来越多的人开始使用leaflet地图风场来展示和分析风场数据。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值