SuperMap iClient3D for Cesium 几何对象匹配建筑物或者地形

        大家在做项目的过程中经常遇到需要将自动将点位匹配到建筑物或者地形表面的需求,小编针对大家的这一需求,对其中最常用的点、线、面三种类型的对象分别如何匹配到建筑或者地形来做一个详细介绍。

  1. 点对象

        对于只有经纬度信息的位置点,我们不能够直接将点贴到建筑或者地形上,但是目前可以针对二维点,获取到该点位的高程值,所以,我们可以先将二维转换维三维,然后在场景中直接添加三维对象即可。

关键步骤:

SuperMap iClient3D for Cesium 几何对象匹配建筑物或者地形_第1张图片

  1. 发布空间服务:

我们在对生成缓存后的三维场景发布服务时,除了选择三维服务,还需要选择空间分析服务。

SuperMap iClient3D for Cesium 几何对象匹配建筑物或者地形_第2张图片

成功发布服务后我们需要使用extractvector3d资源,该资源是基于几何对象的,依据倾斜或tin地形提取三维矢量结果集资源。对该资源发送POST请求,则可以创建一个提取三维矢量结果资源。

SuperMap iClient3D for Cesium 几何对象匹配建筑物或者地形_第3张图片

   2. 二维转三维:

接下来我们就需要在代码中去实现将二维点转换维三维点:

function getheiht(x, y) {
		var geometries = [];

		var geometry = new Cesium.GeoPoint3D({
				x: x,
				y: y,
				z: 0 //此处是二维点,高度为0
			});
		geometries.push(geometry);

					//利用提取三维点的空间服务
	var extractvector3dParameter = {
			geometries: geometries,
			sceneName: "未命名场景",
			layerName: "ZJJKCYC_1_1@TF-ZJJKCYC-JG原始",
			interpolationDistance: 0
			};
	var url ="http://localhost:8090/iserver/services/spatialAnalysis-data777/restjsr/spatialanalyst/geometry/3d/extractvector3d.json";
	var queryData = JSON.stringify(extractvector3dParameter);

            //先发送POST请求
					$.ajax({
						url: url,
						async: true,
						data: queryData,
						method: "POST"
					}).done(function(data) {
						//再发送一次GET请求  获取到运算结果
						$.ajax({
							url: data.newResourceLocation + ".json",
							method: "GET"
						}).done(function(data) {
							//失败 没有内容
							if (data.geometries == null) {
								return;
							}
							console.log(data.geometries);

//重新添加 基于地形获取高程点 的三维点
var newPositions = [];
var newPoint;
for (var i = 0; i < data.geometries.length; i++) {
newPoint = data.geometries[i].points[0];					newPositions.push(Cesium.Cartesian3.fromDegrees(newPoint.x, newPoint.y, newPoint.z)); //从地形获取的高度值
			}
			console.log(newPoint);
						})
					});
				}

关键接口:extractvector3dParameter:
  • geometries,//需要提取高程的二维数据;
  • sceneName: "未命名场景", //场景名称;
  • layerName: "ZJJKCYC_1_1@TF-ZJJKCYC-JG原始", //用于提取高度的缓存图层或者地形图层名称
  • interpolationDistance: 0 //插值距离,默认0,表示不插值

最后返回来的newPoint就是最后的结果,其中的Z值就表示对应点位的高程;

 3. 添加三维点

将上一步得到的三维点添加到场景的Entity里面就可以了。

var point3D = viewer.entities.add({
			name: '3D Point',
			position: Cesium.Cartesian3.fromDegrees(newPoint.x, newPoint.y, newPoint.z),
			point: {
					pixelSize: 5,
					color: new Cesium.Color(0, 1, 1)
					}
		});

 2. 线对象

线对象相对于点对象更简单,可以直接添加,设置对应为贴地模式即可:

关键代码:

function addline() {
		var polyline = viewer.entities.add({
				polyline: {
						positions: [new Cesium.Cartesian3.fromDegrees(103.809772925335,30.6625624230936 , 0.449),new Cesium.Cartesian3.fromDegrees(103.810252782935 ,30.6619926905915 , 3.447),],
						material: Cesium.Color.RED.withAlpha(0.5),
						clampToGround: true,
						},
					});
				}

关键接口:clampToGround设置维true。

 3. 面对象

面对象同样可以直接添加,设置对应为贴地模式即可:

关键代码:

function addregion() {
			var polygon = viewer.entities.add({
					polygon: {
					hierarchy: {
						positions: [new Cesium.Cartesian3.fromDegrees(103.808874884716, 30.6618438948975, 0.449),new Cesium.Cartesian3.fromDegrees(103.809516962045, 30.6622166526969, 0.447),new Cesium.Cartesian3.fromDegrees(103.809787219443, 30.6618685901869, 3.447),new Cesium.Cartesian3.fromDegrees(103.809150007665, 30.6615278368998, 0.207)]},
						material: Cesium.Color.BLUE.withAlpha(0.5),
						clampTos3m: true
						}
					});
				}

关键接口:clampTos3m设置为true

注意:面和线设置的接口不同。

你可能感兴趣的:(WebGIS,三维GIS,json,javascript,开发语言)