前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >前端开发人员用它就能做可视化应用!

前端开发人员用它就能做可视化应用!

原创
作者头像
要不要吃火锅
修改于 2019-12-12 10:52:47
修改于 2019-12-12 10:52:47
78901
代码可运行
举报
文章被收录于专栏:3D可视化3D可视化
运行总次数:1
代码可运行

有人说我一个前端工程师,只懂怎么写页面,如何能开发企业可视化应用?近几年可视化应用已经渗透到各行各业中,科技园、医院、学校、工厂、消防、安保、仓储无不涉猎!作为一个前端开发人员,你有必要再往前迈一步,多了解webgl技术,再沉淀一下Javascript。thingjs是一个面向物联网的3D可视化开发平台,可在线开发、对接数据、项目部署、实际应用~如果你想进步不妨一步哦!

建筑拔高(ThingLayer).js

/**

* 该示例主要展示了根据底面坐标轮廓和高度进行拔楼的功能

* 该示例中的插值功能主要用到了Tween.js

* 该示例用到的数据地址为:https://www.thingjs.com/uearth/uGeo/chaoyang_building.geojson

* 其中建筑的高度为随机值,无特殊意义

*/

var app = new THING.App();

app.background = [0, 0, 0];

var map;

THING.Utils.dynamicLoad('https://www.thingjs.com/uearth/uearth.min.js', function () {

    map = app.create({

        type: 'Map',

        attribution: 'Google'

    });

    // 创建一个瓦片图层

    var tileLayer1 = app.create({

        type: 'TileLayer',

        name: 'tileLayer1',

        url: 'https://mt{0,1,2,3}.google.cn/vt/lyrs=s&hl=zh-CN&gl=cn&x={x}&y={y}&z={z}',

        style: {

            template: CMAP.TileLayerStyle.DARKGREEN // 设置瓦片图层的样式为DARKGREEN

        }

    });

    // 将瓦片图添加到地图中

    map.addLayer(tileLayer1);

    // 创建一个建筑物图层

    var buildingLayer = app.create({

        type: 'ThingLayer',

        name: 'buildingLayer'

    });

    // 将 buildingLayer 添加到 map 中

    map.addLayer(buildingLayer);

    // 飞到地理位置和高度

    app.camera.earthFlyTo({

        lonlat: [116.4488, 39.9187],

        height: 4000,

        time: 2000,

        lerp: THING.LerpType.Linear.None,

        complete: function () {

            app.camera.curOrbit.setState();

            setTimeout(createBuilding, 1000);

        }

    });

    var createBuilding = function () {

        $.ajax({

            type: 'GET',

            url: 'https://www.thingjs.com/uearth/uGeo/chaoyang_building.geojson',

            dataType: 'json',

            success: function (data) {

                // 对数据进行排序

                sortBuildData(data);

                // 加载楼宇

                addBuildAsync(data, 0, function () {

                });

            }

        });

    };

    // 每次创建建筑数量

    var step = 70;

    function addBuildAsync(arr, start, cb) {

        var building;

        var i = start;

        var j = THING.Math.min(start + step, arr.features.length);

        // 循环创建建筑,先将其高度都设置成1米

        for (; i < j; i += 1) {

            building = app.create({

                type: 'GeoBuilding',

                name: 'build' + i,

                coordinates: arr.features[i].geometry.coordinates,

                userData: arr.features[i].properties,

                height: 1,

                renderer: {

                    type: 'image',

                    imageUrl: ['https://www.thingjs.com/uearth/uGeo/building_top.png', 'https://www.thingjs.com/uearth/uGeo/building.png'], // 楼宇顶部贴图和侧边贴图

                    blending: true, // 贴图叠加混合

                    textureWrap:CMAP.TextureWrapMode.Stretch

                }

            });

            buildingLayer.add(building);

        }

        if (j < arr.features.length) {

            // 异步递归下一次循环

            setTimeout(function () {

                addBuildAsync(arr, j, cb);

            }, 0);

        }

        else if (typeof cb === 'function') {

            cb();

        }

    }

    // 对楼宇数据按照其中心点,从西到东排序

    function sortBuildData(arr) {

        arr.features.sort(function (a, b) {

            return (a.properties.centerx - b.properties.centerx);

        });

    }

    // 不同街道的相机视角

    var camPos = {

        '建外街道': {

            position: [2179362.5621945052, 4091446.2018570947, 4382089.316474768],

            target: [2178592.77284655, 4091931.0390559826, 4380492.883422022],

            up: [0.34164472651390604, 0.6413960312283457, 0.6869425099451665]

        },

        '朝外街道': {

            position: [2177287.5596858454, 4093097.7380608646, 4381963.4315843275],

            target: [2177867.783281599, 4092609.529367086, 4380219.533160159],

            up: [0.3413043969490713, 0.6416204643836936, 0.6869020951396816]

        },

        '呼家楼街道': {

            position: [2180796.208593407, 4092585.7199409953, 4381166.2383312695],

            target: [2178653.476017196, 4092893.444632129, 4379563.480796406],

            up: [0.3415888171867664, 0.6417205149940622, 0.6866672124171224]

        },

        '三里屯街道': {

            position: [2180049.8274386693, 4094127.8027542974, 4379868.140003332],

            target: [2178462.4045711374, 4094071.222602554, 4378557.5679814685],

            up: [0.34172853816543197, 0.6417652897142498, 0.6865558383127347]

        },

        '东外街道': {

            position: [2176806.062780602, 4093945.081429624, 4381311.039653606],

            target: [2177692.216493408, 4093814.228132429, 4379180.936632392],

            up: [0.3412325931407259, 0.641760200965019, 0.6868072231971607]

        },

        '左家庄街道': {

            position: [2178343.586772876, 4095041.600086432, 4379738.026890182],

            target: [2178049.2702569016, 4095201.3772697616, 4377706.140884884],

            up: [0.3414940843927409, 0.6420823733568143, 0.6863760020202075]

        },

        '团结湖街道': {

            position: [2180423.2727790484, 4093298.1298934473, 4380347.1220772965],

            target: [2179657.996113762, 4093548.054626523, 4378451.706304496],

            up: [0.3417463148500724, 0.6418231506156354, 0.6864928984484943]

        }, '麦子店街道': {

            position: [2180809.303744469, 4097285.615845475, 4377199.009997367],

            target: [2178441.4391688984, 4094647.778341093, 4378028.833554901],

            up: [0.34155557214940396, 0.6419955751553925, 0.686426596669003]

        }

    };

    var blocks = ['全景', '建外街道', '朝外街道', '呼家楼街道', '三里屯街道', '东外街道', '左家庄街道', '团结湖街道', '麦子店街道'];

    // 创建一个tween对象

    function grow(fromBlock, toBlock, cb) {

        var indexForm = blocks.indexOf(fromBlock);

        var indexTo = blocks.indexOf(toBlock);

        var tw = buildTween(blocks[indexForm], blocks[indexTo], cb);

        return tw;

    }

    // 创建生长动画对象

    function buildTween(fromBlock, toBlock, cb) {

        var growTween = new TWEEN.Tween({ num: 0 }).to({ num: 1 }, 3000).easing(TWEEN.Easing.Linear.None)

            .onUpdate(function (obj) {

                setBuildingHeight(fromBlock, toBlock, obj.num);

            }).onStart(function () {

                app.camera.flyTo({

                    position: camPos[toBlock].position,

                    target: camPos[toBlock].target,

                    time: 1000,

                    up: camPos[toBlock].up,

                    lerp: THING.LerpType.Linear.None,

                    upLerp: THING.LerpType.Linear.None

                });

            });

        return growTween;

    }

    // 遍历buildingLayer中的楼宇对象,对其设置高度

    function setBuildingHeight(fromBlock, toBlock, num) {

        // 进度条onChange触发的情况

        if (fromBlock == toBlock) {

            var temp_blocks = blocks.slice(0, blocks.indexOf(toBlock) + 1);

            buildingLayer.children.forEach(function (v) {

                v.height = 1;

                if (temp_blocks.indexOf(v.userData['district']) >= 0) {

                    v.visible = true;

                    v.height = v.userData['height'];

                }

            });

        }

        // tween触发的情况

        else {

            buildingLayer.children.forEach(function (v) {

                if (v.userData['district'] == toBlock) {

                    var startHeight = 1;

                    var stopHeight = v.userData['height'];

                    var currentHeight = startHeight + (stopHeight - startHeight) * num;

                    v.visible = true;

                    v.height = currentHeight;

                }

            });

        }

    }

    var progressObj = { progress: 0 };

    // 创建一个进度条

    function creatProgress() {

        var bar = new THING.widget.Panel({ width: '800px' });

        bar.position = [10, 10];

        var progress = bar.addProgress(progressObj, 'progress', [

            { name: '全景', describe: '建外街道' },

            { name: '建外街道', describe: '朝外街道' },

            { name: '朝外街道', describe: '呼家楼街道' },

            { name: '呼家楼街道', describe: '三里屯街道' },

            { name: '三里屯街道', describe: '东外街道' },

            { name: '东外街道', describe: '东外街道' },

            { name: '左家庄街道', describe: '团结湖街道' },

            { name: '团结湖街道', describe: '团结湖街道' },

            { name: '麦子店街道', describe: '全景' },

        ]);

        var tween = undefined;

        // 设置每一步播放需要的时间,单位毫秒

        progress.time(3000);

        // 进度条变化

        progress.on('change', function (id) {

            setBuildingHeight(blocks[id], blocks[id], 1);

            if (tween) {

                tween.stop();

                if (id < blocks.length - 1) {

                    tween = grow(blocks[id], blocks[id + 1]);

                    tween.start();

                }

                else {

                    app.camera.earthFlyTo({

                        lonlat: [116.4488, 39.9187],

                        height: 4000,

                        time: 2000

                    });

                }

            }

        });

        progress.startCallback(function (state, id) {

            if (tween) {

                tween.stop();

                setBuildingHeight(blocks[id], blocks[id], 1);

            }

            if (state) {

                tween = grow(blocks[id], blocks[id + 1]);

                tween.start();

            }

        });

    }

    creatProgress();

});

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
将深度学习模型部署为web应用有多难?答案自己找
虽然创建一个机器学习项目很酷,但你最终往往还是希望其他人能够看到自己的成果。当然,你可以将整个项目放在 GitHub 上,但是,你的祖父母估计很难看明白。因此,我们想要做的是,将深度学习模型部署成一个任何人都可以访问的 web 应用程序。
机器之心
2018/12/25
8K0
将深度学习模型部署为web应用有多难?答案自己找
Flask入门教程:构建Web应用程序的简单指南
Flask是一个轻量级的Web框架,用于构建简单而灵活的Web应用程序。它基于Python语言,易于学习和使用,适用于从小型项目到大型应用程序的各种场景。本教程将引导你逐步学习如何使用Flask构建一个基本的Web应用程序。
Michel_Rolle
2024/02/03
2.8K0
Python Web开发:构建动态Web应用
Python已经成为一门流行的编程语言,广泛用于Web开发。它提供了众多优秀的框架和库,使得构建强大的Web应用变得更加容易。本文将深入介绍Python Web开发的基本原理,包括使用Flask框架创建一个简单的Web应用,并展示如何处理路由、模板、表单和数据库。
海拥
2023/09/19
5710
Python Web开发:构建动态Web应用
使用Python实现深度学习模型:智能教育与个性化学习
智能教育和个性化学习通过数据分析和深度学习模型,帮助学生根据个人需求和学习进度定制学习计划,提高学习效果。在这篇教程中,我们将使用Python和TensorFlow/Keras库来构建一个深度学习模型,用于智能教育和个性化学习。
Echo_Wish
2024/07/30
1890
使用Python实现深度学习模型:智能教育与个性化学习
使用Python实现深度学习模型:智能农业与精准农业技术
智能农业和精准农业技术通过数据分析和机器学习模型,帮助农民优化作物产量、减少浪费,并提高农业生产效率。在这篇教程中,我们将使用Python和TensorFlow/Keras库来构建一个深度学习模型,用于智能农业和精准农业技术。
Echo_Wish
2024/07/28
1500
使用Python实现深度学习模型:智能农业与精准农业技术
使用Python实现深度学习模型:智能金融风控与信用评估
在这篇教程中,我们将构建一个深度学习模型,用于金融风控和信用评估。我们将使用TensorFlow和Keras库来实现这一目标。通过这个教程,你将学会如何处理数据、构建和训练模型,并将模型应用于实际的金融风控和信用评估任务。
Echo_Wish
2024/07/26
3770
使用Python实现深度学习模型:智能金融风控与信用评估
使用Python实现深度学习模型:个性化推荐与广告优化
在这篇教程中,我们将构建一个深度学习模型,用于个性化推荐和广告优化。我们将使用TensorFlow和Keras库来实现这一目标。通过这个教程,你将学会如何处理数据、构建和训练模型,并将模型应用于实际的推荐和广告优化任务。
Echo_Wish
2024/07/23
2620
使用Python实现深度学习模型:个性化推荐与广告优化
Flask web表单 Flask-WTF表单扩展
它是HTML页面中负责数据采集的部件。表单有三个部分组成:表单标签、表单域、表单按钮。表单允许用户输入数据,负责HTML页面数据采集,通过表单将用户输入的数据提交给服务器。
Devops海洋的渔夫
2019/12/19
2.4K0
flask web开发实战 入门 pdf_常用的web开发框架
Flask是一个用Python编写的Web应用程序框架。Flask基于Werkzeug(WSGI工具包)和Jinja2模板引擎。
全栈程序员站长
2022/09/27
7.6K0
flask web开发实战 入门 pdf_常用的web开发框架
Day25Web开发
HTTP协议简介 在Web应用中,服务器把网页传给浏览器,实际上就是把网页的HTML代码发送给浏览器,让浏览器显示出来。而浏览器和服务器之间的传输协议是HTTP,所以: HTML是一种用来定义网页的文本,会HTML,就可以编写网页; HTTP是在网络上传输HTML的协议,用于浏览器和服务器的通信。 HTTP请求 步骤1:浏览器首先向服务器发送HTTP请求,请求包括: 方法:GET还是POST,GET仅请求资源,POST会附带用户数据; 路径:/full/url/path; 域名:由Host头指定:Host:
林清猫耳
2018/04/26
1.3K0
Day25Web开发
使用Python实现深度学习模型:用户行为预测与个性化服务
在这篇教程中,我们将构建一个深度学习模型,用于用户行为预测和个性化服务。我们将使用TensorFlow和Keras库来实现这一目标。通过这个教程,你将学会如何处理数据、构建和训练模型,并将模型应用于实际的用户行为预测和个性化服务任务。
Echo_Wish
2024/07/24
3410
使用Python实现深度学习模型:用户行为预测与个性化服务
使用Python Flask搭建Web问答应用程序并发布到公网远程访问
Flask是一个Python编写的Web微框架,让我们可以使用Python语言快速实现一个网站或Web服务,本期教程我们使用Python Flask搭建一个web问答应用程序框架,并结合cpolar内网穿透工具将我们的应用程序发布到公共网络上,实现可多人远程进入到该web应用程序访问。
鸽芷咕
2023/12/25
6310
使用Python Flask搭建Web问答应用程序并发布到公网远程访问
Flask 框架:运用WTForms实现用户注册
WTForms 是用于web开发的灵活的表单验证和呈现库,它可以与您选择的任何web框架和模板引擎一起工作,并支持数据验证、CSRF保护、国际化等,运用WTForms框架并配合Flask可实现一个带有基本表单验证功能的用户注册与登录页面,经过美化的页面可以直接应用到项目中。
王瑞MVP
2022/12/28
6090
Flask 框架:运用WTForms实现用户注册
使用 Flask 连接数据库和用户登录功能进行数据库的CRUD
在 Web 应用中,连接数据库是一项基本任务,而用户登录功能是很多应用的核心部分。本文将演示如何使用 Flask 框架连接数据库,并实现一个简单的用户登录功能。将创建一个名为 user 的数据库表,其中包含账号、密码和名字字段。还将实现一个登录页面,以及登录成功后跳转到的页面,显示用户姓名。
GeekLiHua
2025/01/21
2290
使用 Flask 连接数据库和用户登录功能进行数据库的CRUD
挑战30天学完Python:Day26 Python Web 服务
Python本身是一种通用的语言,可以用于很多的地方。在本篇中,我们将看到如何在Web开发中使用Python。它有很多的web架构框架。Django和Flask是比较流行。接下来我们就看看如何使用Flask进行web的开发。
MegaQi
2023/10/21
2570
挑战30天学完Python:Day26 Python Web 服务
使用Python实现深度学习模型:智能安防监控与异常检测
在这篇教程中,我们将构建一个深度学习模型,用于智能安防监控和异常检测。我们将使用TensorFlow和Keras库来实现这一目标。通过这个教程,你将学会如何处理视频数据、构建和训练模型,并将模型应用于实际的异常检测任务。
Echo_Wish
2024/07/27
2490
使用Python实现深度学习模型:智能安防监控与异常检测
Flask框架web开发:零基础入门 原
Flask框架是Python开发的一个基于Werkzeug和Jinja 2的web开发微框架,它的优势就是极其简洁,但又非常灵活,而且容易学习和应用。因此Flask框架是Python新手快速开始web开发最好的选择,此外,使用Flask框架的另一个好处在于你可以非常轻松地将基于Python的机器学习算法或数据分析算法集成到web应用中。
笔阁
2018/12/25
2K1
测试开发-web开发和flask
web即万维网, 基于html和超文本的图形信息系统, web应用基本上就是指现在B/S架构上的应用
打铁读书郎
2024/04/11
1150
一个超级好用的Web开发库!
Flask 是一个轻量级的 Web 应用框架,以其简单易用而闻名。作为一个灵活的微框架,它允许开发者自由地选择和整合各种第三方库。无论你是 Web 开发的新手,还是有丰富经验的老手,Flask 都能为你提供强大的支持。今天,我们将从 Flask 的基础入门开始,一步步深入探讨它的高级特性,并通过丰富的代码示例来展示如何高效地使用它。
老表
2024/07/31
2380
一个超级好用的Web开发库!
使用Flask构建简单的Web应用
在当今数字时代,构建高效、可扩展的Web应用程序是开发者们的一项重要任务。Python,作为一种简洁、强大的编程语言,为Web开发提供了丰富的工具和框架。在本篇文章中,我们将探讨使用Python构建Web应用程序的最佳实践,通过代码实例和深度解析来帮助你更好地理解和运用这些技术。
一键难忘
2024/04/17
5680
推荐阅读
相关推荐
将深度学习模型部署为web应用有多难?答案自己找
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验