基于SuperMap三维WebGL开发之s3m切片缓存图层属性查询

14 篇文章 1 订阅

API参考http://support.supermap.com.cn:8090/webgl/Build/Documentation/index.html

一、使用场景
在给定的模型里面,选定其中某个模型返回其属性进行展示,以官方例子中的樱花树为例,选择场景中的某一事物,需要返回他的属性信息。
二、数据处理及发布
1、管网下载樱花树数据,用桌面打开,可以查看默认的场景信息。
2、给数据集添加缓存,操作如下
(1)选定数据集,右键生成缓存,缓存类型如果有OSGB,选择OSGB格式,文件类型选择s3m,选择缓存存放目录
在这里插入图片描述
生成目录如下
在这里插入图片描述
注:每个数据集添加的缓存文件加都会带有一个.scp文件,该文件是用来将缓存添加到图层中来
(3)添加缓存到图层
打开场景,在图层管理器中,右键选择“普通图层”,添加“三维切片缓存图层”,选择每个数据集对应的缓存文件.scp,打开即可,如果多个数据集,重复以上步骤即可。
在这里插入图片描述
(4)将模型数据表另存为属性表(官方支持说是为了数据服务中查询效率)
选择数据集,浏览属性表,全选打开的表记录,鼠标右键,另存为数据集,保存为属性表即可
在这里插入图片描述
(5)保存新的工作空间,Iserver发布,发布选择三维服务,如果有数据查询,再加上数据服务就可以了。
三、webgl开发
1、加载影像图层,超图已经做好了,直接上代码即可
在这里插入图片描述
根据项目喜好,添加即可
2、设置气泡位置(非必须,可以换成自己的弹窗,或者alert)
在这里插入图片描述
3、添加缓存图层(s3m)
这种方式用来添加s3m缓存图层,桌面端必须生成场景缓存,具体见上面步骤
图中的相机参数第一可以通过桌面获取,或者在Iserver中webgl浏览时打印出相机的对象console.log(promise.camera)
4、添加图层点击事件
在这里插入图片描述
查询点击的面或者范围的的图层ID(数据集中的SMID)进行sql查询,查出具体的面的 其他属性,空间和sql的结合。
5、sql查询
在这里插入图片描述
和二维查询的方式一样,调用官方的api进行查询,需要注意的是datasetNames: [“Cherry:” + “yhsdata”] 里面的数据集最好使用属性表形式,如果采用空间查询,需要将属性表转成线、面的等矢量表,可以进行相交,包含等查询。
6、查询成功,属性展示
在这里插入图片描述
相关截图
在这里插入图片描述
在这里插入图片描述
相关代码

<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="utf-8">
		<meta http-equiv="X-UA-Compatible" content="IE=Edge,chrome=1">
		<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
		<title>樱花树查询</title>
		<link href="./Build/Cesium/Widgets/widgets.css" rel="stylesheet">
		<script src="./js/supermap/SuperMap.Include.js"></script>
		<link href="./css/pretty.css" rel="stylesheet">
		<script src="./js/jquery.min.js"></script>
		<script src="./js/config.js"></script>
		<script type="text/javascript" src="./js/require.min.js" data-main="js/main"></script>
	</head>
	<body>
		<div id="cesiumContainer"></div>
		<div id='loadingbar' class="spinner">
			<div class="spinner-container container1">
				<div class="circle1"></div>
				<div class="circle2"></div>
				<div class="circle3"></div>
				<div class="circle4"></div>
			</div>
			<div class="spinner-container container2">
				<div class="circle1"></div>
				<div class="circle2"></div>
				<div class="circle3"></div>
				<div class="circle4"></div>
			</div>
			<div class="spinner-container container3">
				<div class="circle1"></div>
				<div class="circle2"></div>
				<div class="circle3"></div>
				<div class="circle4"></div>
			</div>
		</div>
		<!-- 气泡HTML -->
		<div id="bubble" class="bubble" style="bottom:0;left:82%;display:none;">
			<div id="tools" style="text-align : right">
				<span style="color: rgb(95, 74, 121);padding: 5px;position: absolute;left: 10px;top: 4px;">对象属性</span>
				<span class="fui-export" id="bubblePosition" style="color: darkgrey; padding:5px" title="停靠"></span>
				<span class="fui-cross" title="关闭" id="close" style="color: darkgrey;padding:5px"></span>
			</div>
			<div style="overflow-y:scroll;height:150px" id="tableContainer">
				<table id="tab"></table>
			</div>
		</div>
		<div id='toolbar' class="param-container tool-bar">
			<p>提示:</p>
			<span>点击查看属性</span>
		</div>
		<script type="text/javascript">
			/*示范代码说明:
			 *分层分户信息查询
			 *
			 *主要涉及接口:
			 *setQueryParameter
			 *setPolygonoffset
			 *
			 * 示范代码:
			 */
			function onload(Cesium) {
				var viewer = new Cesium.Viewer('cesiumContainer');
				viewer.imageryLayers.addImageryProvider(new Cesium.BingMapsImageryProvider({
					url: 'https://dev.virtualearth.net',
					mapStyle: Cesium.BingMapsStyle.AERIAL,
					key: URL_CONFIG.BING_MAP_KEY
				}));
				var scene = viewer.scene;
				var widget = viewer.cesiumWidget;

				scene.globe.show = true;

				/* 气泡相关 1/4 start */
				var scenePosition = null; // 记录在场景中点击的笛卡尔坐标点
				var dock = false; // 是否停靠
				var infoboxContainer = document.getElementById("bubble");
				var table = document.getElementById("tab"); // 气泡内的表格
				$("#bubblePosition").click(function() { // 停靠状态切换
					dock = !dock;
					if ($("#bubblePosition").hasClass("fui-export")) {
						$("#bubble").removeClass("bubble").addClass("float");
						$("#bubblePosition").removeClass("fui-export").addClass("fui-bubble");
						$("#bubblePosition")[0].title = "悬浮";
						$("#bubble").css({
							'left': '82%',
							'bottom': '45%'
						});
						$("#tableContainer").css({
							'height': '350px'
						});
					} else if ($("#bubblePosition").hasClass("fui-bubble")) {
						$("#bubble").removeClass("float").addClass("bubble");
						$("#bubblePosition").removeClass("fui-bubble").addClass("fui-export");
						$("#bubblePosition")[0].title = "停靠";
						$("#tableContainer").css({
							'height': '150px'
						});
					}
				});
				$("#close").click(function() { // 关闭气泡
					$("#bubble").hide();
				});
				scene.postRender.addEventListener(function() { // 每一帧都去计算气泡的正确位置
					if (scenePosition && !dock) {
						var canvasHeight = scene.canvas.height;
						var windowPosition = new Cesium.Cartesian2();
						Cesium.SceneTransforms.wgs84ToWindowCoordinates(scene, scenePosition, windowPosition);
						infoboxContainer.style.bottom = (canvasHeight - windowPosition.y + 45) + 'px';
						infoboxContainer.style.left = (windowPosition.x - 70) + 'px';
						infoboxContainer.style.visibility = "visible";
					}
				});
				/* 气泡相关 1/4 end */

				var camera = scene.camera;
				var lastHouseEntity = null; // 最后一次显示的高亮面

				// 添加三维切片缓存图层
				var promise = scene.addS3MTilesLayerByScp(URL_CONFIG.CHERRY_SEASON_MODEL, {
					name: 'oblique photography'
				});


				promise.then(function(obliqueLayers) {
					scene.camera.setView({
						destination: new Cesium.Cartesian3.fromDegrees(114.290619, 30.61308, 47.9552),
						orientation: {
							heading: 0.34395448573153864,
							pitch: -0.0538346996932666,
							roll: 6.2831853071795685
						}
					});

					var handler = new Cesium.ScreenSpaceEventHandler(scene.canvas);
					handler.setInputAction(function(e) {
						// 获取点击位置笛卡尔坐标
						var position = scene.pickPosition(e.position);
						if (!position) {
							position = Cesium.Cartesian3.fromDegrees(0, 0, 0);
						}
						scenePosition = position; // 气泡相关 2/4
				
						var s3mLayer = scene.layers.find("oblique photography");
						var id = s3mLayer.getSelection();
						console.log(id);
						// 设置查询条件。Z在本例数据中代表户型面的底部高程,CENGG为层高,SmSdriW为最西边的经度,SmSdriE为最东边的经度,SmSdriS为最南边的纬度,SmSdriN为最北边的纬度
						doSqlQuery('SMID=' + id + '');
					}, Cesium.ScreenSpaceEventType.LEFT_CLICK);

					// 去除加载动画
					$('#loadingbar').remove();
				});


				function onQueryComplete(queryEventArgs) {
					console.log(queryEventArgs);

					var count = queryEventArgs.originResult.featureCount; // 选中信息对象
					if (count > 0) {
						var bottomHeight = Number(queryEventArgs.originResult.features[0].fieldValues[queryEventArgs.originResult.features[
							0].fieldNames.indexOf('BOTTOM')]); // 底部高程
						var extrudeHeight = Number(queryEventArgs.originResult.features[0].fieldValues[queryEventArgs.originResult.features[
							0].fieldNames.indexOf('LSG')]); // 层高(拉伸高度)
						Cesium.GroundPrimitive.bottomAltitude = bottomHeight; // 矢量面贴对象的底部高程
						Cesium.GroundPrimitive.extrudeHeight = extrudeHeight; // 矢量面贴对象的拉伸高度


						/* 气泡相关 4/4 start */
						$("#bubble").show();
						for (i = table.rows.length - 1; i > -1; i--) {
							table.deleteRow(i);
						}
						for (var index in queryEventArgs.originResult.features[0].fieldNames) {
							var newRow = table.insertRow();
							var cell1 = newRow.insertCell();
							var cell2 = newRow.insertCell();
							cell1.innerHTML = queryEventArgs.originResult.features[0].fieldNames[index];
							cell2.innerHTML = queryEventArgs.originResult.features[0].fieldValues[index];
						}
						return;
					}


					/* 气泡相关 4/4 end */
				}

				/**
				 * 执行SQL查询
				 * @param SQL SQL查询条件
				 */
				function doSqlQuery(SQL) {
					var getFeatureParam, getFeatureBySQLService, getFeatureBySQLParams;
					getFeatureParam = new SuperMap.REST.FilterParameter({
						attributeFilter: SQL
					});
					getFeatureBySQLParams = new SuperMap.REST.GetFeaturesBySQLParameters({
						queryParameter: getFeatureParam,
						toIndex: -1,
						datasetNames: ["Cherry:" + "yhsdata"] // 本例中“户型面”为数据源名称,“专题户型面2D”为楼层面相应的数据集名称
					});
					var url = URL_CONFIG.CHERRY_SEASON_DATA; // 数据服务地址
					getFeatureBySQLService = new SuperMap.REST.GetFeaturesBySQLService(url, {
						eventListeners: {
							"processCompleted": onQueryComplete, // 查询成功时的回调函数
							"processFailed": processFailed // 查询失败时的回调函数
						}
					});
					getFeatureBySQLService.processAsync(getFeatureBySQLParams);
				}

				function processFailed(queryEventArgs) {
					alert('查询失败!');
					console.log(queryEventArgs);
				}
			}
		</script>
	</body>
</html>

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值