初级开发者也能码出专业炫酷的3D地图吗?

好看的3D地图搭建出来,一定是要能为开发者所用与业务系统开发中才能真正地体现价值。基因于此,CityBuilder建立了与ThingJS的通道——直转ThingJS代码,支持将配置完成的3D地图一键转为代码,不仅减少开发者的工作量,还能作为非GISer开发者的地图教学工具,使一般开发者也能码出专业、炫酷的3D地图

上节说到如何使用GeoJSON、QGIS编辑地图数据,使用CItyBuilder搭建一键城市模型,并且转入到ThingJS开发,以免大家遗忘,我将步骤再次贴出来,然后告诉大家如何使用ThingJS的“在线开发”完成建筑的自定义顶牌、环绕飞行、沟边效果。

本教程使用GeoJSON绘制并且编写地图数据,使用QGIS微调,以优锘科技所在区域为地图数据,制作一个小范围的智慧城市模型一共分以下五个步骤:

1. 绘制地图资源:进入GeoJSON绘制优锘科技所在区域地图数据,根据项目所需为每个建筑添加必要的属性(name、height、type、district);

2. 编辑地图数据:将GeoJSON数据下载 ,使用QGIS编辑数据(没有数据偏移可以省略这一步,本次省略使用QGIS,感兴趣的人可以网上搜索如何使用QGIS编辑数据,超简单);

3. 上传地图数据:将处理好的GeoJSON上传至CityBuilder中,在CityBuilder中修改样式;

4. 调整地图样式:CityBuilder中调整好样式之后,保存并且退出CityBuilder编辑器,在CityBuilder页面中选择开发刚刚调整好的项目;

5. 开发相关功能:当完成第四步后,就进入到ThingJS在线开发中,为我们的智慧城市添加功能(视角自动轮巡、自动旋转等);

想知道前四个步骤的具体实现步骤,可以查看我写的《使用CityBuilder搭建智慧城市3D可视化模型之创建三维城市(上)》。

开发相关功能:

通过CityBuilder进入到ThingJS中,会生成相关代码引用我们刚才完成的地图场景,生成的相关代码如下:

var app = new THING.App();

// 设置app背景为黑色

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

// 引用地图组件脚本

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

app.create({

type: "Map",

url: "https://www.thingjs.com/citybuilder_console/mapProject/config/TVRnNE1EUT1DaXR5QnVpbGRlckAyMDE5",

complete: function (event) {

// 我们所有的代码都在complete函数中书写。

console.log(event.object.userLayers.length);

}

});

});

ThingJS在线开发中拥有着完善的官方示例,使用官方示例就能够完成我们的大部分需求,现在我们以图文结合代码的形式为大家讲解使用ThingJS制作的五个功能。

第一个小功能-获取建筑名字:

// aPP是ThingJS的全局对象,对全局对象绑定click事件,当点击到任意建筑,都会触发该事件。

app.on(‘click‘, function (ev) {

console.log(ev.object.userData.name) // 输出建筑的名字

}

第二个小功能-建筑自定义顶牌:

建筑自定义顶牌是官方示例中的代码,可以直接复制到你的项目中去,同时可以修改html文件,改成你所需要的顶牌样式。不过要记得调用test_create_ui()这个方法。

// 添加html

function create_html() {

var sign =

`<div class="sign" id="board" style="font-size: 12px;width: 120px;text-align: center;border: 3px solid #eeeeee;border-radius: 8px;color: #eee;position: absolute;top: 0;left: 0;z-index: 10;display: none;">

<div class="s1" style="margin: 5px 0px 5px 0px;line-height: 32px;overflow: hidden;">

<span class="span-l icon" style="float: left;width: 30px;height: 30px;background:url(https://www.thingjs.com/static/images/example/hydrant.png) no-repeat center;margin: 1px 1px 1px 5px;"></span>

<span class="span-l font" style="float: left;margin: 0px 0px 0px 3px;">物体</span>

<span class="span-r point" style="float: right;width: 12px;height: 12px;border-radius: 50%;margin: 10px 5px 10px 0px;"></span>

</div>

<div class="s2" style="margin: 5px 0px 10px 0px;line-height: 18px;font-size: 10px;overflow: hidden;">

<span class="span-l font1" style="float: left;margin: 0px 10px 0px 10px;">数值</span>

<span class="span-l font2" style="float: left;width: 70px;">0.14MPa</span>

</div>

<div class="point-top" style="position: absolute;top: -7px;right: -7px;width: 10px;height: 10px;border: 3px solid #eee;border-radius: 50%;"></div>

</div>`

$(‘#div3d‘).append($(sign));

}

create_html();

// 生成一个新面板

function create_element() {

var srcElem = document.getElementById(‘board‘);

var newElem = srcElem.cloneNode(true);

newElem.style.display = "block";

app.domElement.insertBefore(newElem, srcElem);

return newElem;

}

// 物体顶界面

var ui = null;

function test_create_ui() {

ui = app.create({

type: ‘UIAnchor‘,

parent: app.query(‘car02‘)[0],

element: create_element(),

localPosition: [0, 2, 0],

pivot: [0.5, 1] //  [0,0]即以界面左上角定位,[1,1]即以界面右下角进行定位

});

}

test_create_ui();

第三个小功能-物体环绕飞行:

物体环绕飞行同样也是是官方示例中的代码,但是需要修改几个位置,这是因为使用CityBuilder搭建的智慧城市可视化应用,所使用的摄像机与通过CamBuilder(模模搭)搭建的园区可视化或者是其他可视化行业应用不一样,需要修改摄像机环绕和停止的方法。将// 绕某看点位置 或者 某物体 环绕    注释对应的代码修改为app.camera.earthFlyRotateBySpeed({ ;将// 停止旋转注释对应的代码修改为app.camera.stopEarthFly();总的来说,就是切换camera对象所调用的方法。然后在环绕飞行的代码后面添加一个定时器,让其启动。

setTimeout(startRotate, 1000);

修改后的代码如下:

var timer;

// 设置停止操作的时间

var stopTime = 5 * 1000;

// 开始旋转

function startRotate() {

// 绕某看点位置 或者 某物体 环绕

app.camera.earthFlyRotateBySpeed({

target: app.camera.target, // 围绕摄像机当前目标点

speed: 3, // 环绕飞行的时间(3min)

});

clearTimer();

}

// 停止旋转

function stopRotate() {

app.camera.stopEarthFly();

resetTimer();

}

// 清除定时器

function clearTimer() {

if (timer) {

clearTimeout(timer);

timer = null;

}

}

// 重置定时器

function resetTimer() {

clearTimer();

timer = setTimeout(function () {

startRotate();

}, stopTime)

}

app.on(THING.EventType.MouseDown, function () {

stopRotate();

}, ‘如果按下鼠标 停止旋转‘);

app.on(THING.EventType.MouseWheel, function () {

stopRotate();

}, ‘如果滚动鼠标 停止旋转‘);

setTimeout(startRotate, 1000);

第四个小功能-物体沟边:

物体沟边同样也是是官方示例中的代码,但是由于较为简单,因此只选择其中的一小部分进行使用,使用全局绑定 selection 集合事件,当选择了GeoBuilding属性的物体后,让该物体沟边,同样绑定Deselect事件,则取消物体沟边

// 全局绑定 selection 集合事件

app.on(THING.EventType.Select, ‘.GeoBuilding‘, function (ev) {

ev.object.style.outlineColor = ‘#00ff00‘; // 集合中的物体沟边

});

app.on(THING.EventType.Deselect, ‘.GeoBuilding‘, function (ev) {

ev.object.style.outlineColor = null;

})

第五个小功能-视角归位:

视角归位需要我们选取一个最初视角,最初视角可以在CityBuilder中获取,方法是打开CityBuilder对应的项目文件,点击项目名右侧的菜单栏,点击视角设置,移动到一个合适的视角,并且拾取该视角。同时视角归位使用的也是app这个全局变量所绑定的click方法,通过判断是鼠标左键还是右键来确定是飞到物体上去还是视角归位。

相关功能代码如下:

app.on(‘click‘, function (ev) {

if (ev.button == 0) { // 鼠标左键

if (ev.object.type == ‘GeoBuilding‘) {

cameraFly(ev.object); // 摄像机飞行到建筑

console.log(ev.object.userData.name) // 输出建筑的名字

app.selection.select(ev.object); // 将建筑放进 selection 集合中

}

} else if (ev.button == 2) { // 鼠标右键

app.selection.clear(); // 清空集合

// 摄像机飞行到指定位置

app.camera.earthFlyTo({

time: 2000,

lonlat: [116.46531369922128, 39.98585330794342, -0.009057496674358845],

heading: -16.67619746802896,

height: 276.80479009170085,

pitch: 33.76486653158114

});

}

});

最后附上完整代码:

var app = new THING.App();

// 设置app背景为黑色

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

// 引用地图组件脚本

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

app.create({

type: "Map",

url: "https://www.thingjs.com/citybuilder_console/mapProject/config/TVRnNE1EUT1DaXR5QnVpbGRlckAyMDE5",

complete: function (event) {

// 自定义顶牌

function create_html() {

var sign =

`<div class="sign" id="board" style="font-size: 12px;width: 120px;text-align: center;border: 3px solid #eeeeee;border-radius: 8px;color: #eee;position: absolute;top: 0;left: 0;z-index: 10;display: none;">

<div class="s1" style="margin: 5px 0px 5px 0px;line-height: 32px;overflow: hidden;">

<span class="span-l icon" style="float: left;width: 30px;height: 30px;background:url(https://www.thingjs.com/static/images/example/hydrant.png) no-repeat center;margin: 1px 1px 1px 5px;"></span>

<span class="span-l font" style="float: left;margin: 0px 0px 0px 3px;">优锘科技有限公司</span>

<span class="span-r point" style="float: right;width: 12px;height: 12px;border-radius: 50%;margin: 10px 5px 10px 0px;"></span>

</div>

<div class="s2" style="margin: 5px 0px 10px 0px;line-height: 18px;font-size: 10px;overflow: hidden;">

<span class="span-l font1" style="float: left;margin: 0px 10px 0px 10px;">地区</span>

<span class="span-l font2" style="float: left;width: 70px;">朝阳区</span>

</div>

<div class="point-top" style="position: absolute;top: -7px;right: -7px;width: 10px;height: 10px;border: 3px solid #eee;border-radius: 50%;"></div>

</div>`

$(‘#div3d‘).append($(sign));

}

create_html();

// 生成一个新面板

function create_element() {

var srcElem = document.getElementById(‘board‘);

var newElem = srcElem.cloneNode(true);

newElem.style.display = "block";

app.domElement.insertBefore(newElem, srcElem);

return newElem;

}

// 物体顶界面

var ui = null;

function test_create_ui() {

ui = app.create({

type: ‘UIAnchor‘,

parent: app.query(‘北京优锘科技有限公司‘)[0], // 顶牌的对象

element: create_element(),

localPosition: [0, 2, 0],

pivot: [0.5, 1] //  [0,0]即以界面左上角定位,[1,1]即以界面右下角进行定位

});

}

var timer;

// 设置停止操作的时间

var stopTime = 5 * 1000;

// 开始旋转

function startRotate() {

// 绕某看点位置 或者 某物体 环绕

app.camera.earthFlyRotateBySpeed({

target: app.camera.target, // 围绕摄像机当前目标点

speed: 3, // 环绕飞行的时间(3min)

});

clearTimer();

}

// 停止旋转

function stopRotate() {

app.camera.stopEarthFly();

resetTimer();

}

// 清除定时器

function clearTimer() {

if (timer) {

clearTimeout(timer);

timer = null;

}

}

// 重置定时器

function resetTimer() {

clearTimer();

timer = setTimeout(function () {

startRotate();

}, stopTime)

}

app.on(THING.EventType.MouseDown, function () {

stopRotate();

}, ‘如果按下鼠标 停止旋转‘);

app.on(THING.EventType.MouseWheel, function () {

stopRotate();

}, ‘如果滚动鼠标 停止旋转‘);

setTimeout(startRotate, 1000);

test_create_ui();

app.on(‘click‘, function (ev) {

if (ev.button == 0) { // 鼠标左键

if (ev.object.type == ‘GeoBuilding‘) {

cameraFly(ev.object); // 摄像机飞行到建筑

console.log(ev.object.userData.name) // 输出建筑的名字

app.selection.select(ev.object); // 将建筑放进 selection 集合中

}

} else if (ev.button == 2) { // 鼠标右键

app.selection.clear(); // 清空集合

// 摄像机飞行到指定位置

app.camera.earthFlyTo({

time: 2000,

lonlat: [116.46531369922128, 39.98585330794342, -0.009057496674358845],

heading: -16.67619746802896,

height: 276.80479009170085,

pitch: 33.76486653158114

});

}

});

// 全局绑定 selection 集合事件

app.on(THING.EventType.Select, ‘.GeoBuilding‘, function (ev) {

ev.object.style.outlineColor = ‘#00ff00‘; // 集合中的物体沟边

});

app.on(THING.EventType.Deselect, ‘.GeoBuilding‘, function (ev) {

ev.object.style.outlineColor = null;

})

function cameraFly(object) {

app.camera.earthFlyTo({

time: 2000,

object: object

});

}

}

});

});

原文地址:https://www.cnblogs.com/ThingJS3D/p/11769603.html

时间: 2024-10-12 17:41:01

初级开发者也能码出专业炫酷的3D地图吗?的相关文章

24、Cocos2dx 3.0游戏开发找小三之网格动作:高炫酷的3D动作

重开发者的劳动成果,转载的时候请务必注明出处:http://blog.csdn.net/haomengzhu/article/details/37596763 网格动作类似于动作特效,可以实现翻转.震荡.抖动.水的波纹等效果. 网格的基类: GridBase* Grid 获取或设置该节点的网格特效状态.网格应用于绘图平面上,可以实现水纹等 3D 特效: 基类定义:cocos2d/2d/CCGrid.h中: 基于这个基类有两个子类: Grid3D TiledGrid3D 这两个子类的共同点是:网格

canvas - 炫酷的3D星空

1.国际惯例,先上效果 (⊙o⊙)- 效果图看上去效果并不很炫酷啊,直接戳 这里 看效果吧! 2代码部分 html: <canvas id="canvas" width="1920" height="1080"></canvas> css: *{margin: 0;padding: 0;} /*没啥必须的css*/ js:(这个博主也是够了,那么多的js代码,一点注释都没有,差评!)公子莫慌,由于代码比较多,注释部分就不在

wooyoo游戏-炫酷大刀3D模型展现(一)

这是在3Dmax中制作好的大刀模型,很炫吧.现在我要做的是把它上传到wooyoo在线游戏开发平台(http://www.wooyoogame.com/)的资源库中.当然,需要做适当的调整. 首先,看一下尺寸和坐标位置 这里模型的尺寸过大了,在wooyoo游戏平台中,由于在浏览器中展示,尺寸不宜过大.一个通用单位1可以表示一米,我们需要在单位设置中选择通用单位. 现在我把大刀模型尺寸调小了,模型坐标也调整为(0,0,0),这样可以确保模型在浏览器场景中的居中位置. 现在,模型就基本调整好了,导出为

python老司机带你玩玩炫酷的3D渲染,酷毙了!

自从学会了turtle模块后,画了不少简笔画.像小猪佩奇.哆啦A梦等等,但是这些依然不能让身边人感受到python的强大,依然是每次装逼必被打脸.就像你用turtle画了这个 别人拿出了这个 怎么办?面对函数库如此丰富的python,一库不行,我们还有另一库.那就是pyray库. pyray库介绍 pyray库创建于2018年1月,虽然目前渲染3D场景的最佳工具仍然是POV ray.但是为什么我们不能在Python中使用这种功能(渲染2D.3D和更高维的对象和场景),这是一种可能已经被广泛使用的

【pano2vr】网页Flash中简单实现炫酷的3D模型制作

花了两天时间学习如何能够高效的实现3D模型效果,毕竟是从0开始学习,感觉pano2vr这款软件挺容易上手,并且可以很容易实现简单的热点交互,可以根据交互需求设置皮肤,故将这一款软件推荐给大家: 1.简介.http://ggnome.com/pano2vr.用户可以自行下载. 2.简单教程. 3.皮肤编辑.用户可以根据提供的系统皮肤或者自制皮肤或网上资源实现,皮肤可以说是一个默认的播放器. 4.应用.用户可以将其应用于Flash以及网页中,根据官方提供的信息进行摸索制作. Flash API:ht

经典炫酷的HTML5/jQuery动画应用示例及源码

jQuery是一款普遍受前端开发者欢迎的Javascript框架,但是开发者貌似更关注jQuery开发的插件,海量的jQuery插件让前端开发者非常方便.HTML5的加入让jQuery这个家族更加丰富多彩,因为利用HTML5,我们可以制作更加绚丽动感的动画特效,HTML5结合jQuery,真是我们开发者的福利啊.本文分享了一些经典炫酷的HTML5/jQuery动画应用,喜欢的朋友可以分享和收藏. jquery视差滑块幻灯特效 很传统的一款jQuery焦点图插件,但是该焦点图插件是宽屏的,整体看起

超炫酷的jQuery/HTML5应用效果及源码

jQuery非常强大,我们之前也用jQuery分享过很多实用的插件.HTML5可以让网页变得更加绚丽多彩,将HTML5和jQuery结合使用那将发挥更棒的效果. 今天向大家收集了一些关于HTML5和jQuery的应用及其源码,一起来看看. HTML5动感的火焰燃烧动画特效 这又是一款基于HTML5的超炫动画特效,是一款动感的火焰燃烧动画效果.这款HTML5动画火焰燃烧非常逼真. 核心jQuery代码: $( document ).ready(function() { // Set canvas

一个Android开发者开博一周年的成长日记——送给不知如何下手的【初级开发者】和【在校生】

今天一看日历,哟,2.12号,这不是我第一份工作入职的时间吗?不知不觉竟然已经工作了一年了,那根据“主席”的话说,应该算是中级开发者水平了!在这工作的一年里,我有过迷茫,有过动摇,但更多,则是坚持和努力,无论如何,我终于算是摸到了开发者的这一条道路的大门,剩下的就是更加坚定的走下去.平常和大家分享的都是技术文章,今天趁着公司没活,给还没找到入手点的初级开发者和在校生写点东西,算是一点经验之谈,给你们一点前进的方向. 其实我接触Android开发应该是很早的时候了,2012年就因为“齐鲁软件大赛”

送给不知如何下手的【初级开发者】和【在校生】

薄仕森:清朝宫廷丰胸秘方第四代传人 北京姐妹:丁雅心丰胸茶助我实现模特梦!! 今天一看日历,哟,2.12号,这不是我第一份工作入职的时间吗?不知不觉竟然已经工作了一年了,那根据“主席”的话说,应该算是中级开发者水平了!在这工作的一年里,我有过迷茫,有过动摇,但更多,则是坚持和努力,无论如何,我终于算是摸到了开发者的这一条道路的大门,剩下的就是更加坚定的走下去.平常和大家分享的都是技术文章,今天趁着公司没活,给还没找到入手点的初级开发者和在校生写点东西,算是一点经验之谈,给你们一点前进的方向. 其