在SuperMap iDesktop 之提取三维数据中,已经描述了如何在SuperMap iDesktop 中提取三维数据,那么在项目进行过程中,会出现需要在前端去获取二维数据的情况。当然,在SuperMap iClient3D for WebGL(以下简称WebGL)中,也有相应的类似接口,分别是viewer.scene.globe.getHeight(Cartographic)和sampleTerrain(terrainProvider, level, positions).
对于sampleTerrain(terrainProvider, level, positions),文档是这样描述的:
也就是说,我们需要使用地形高度的地形细节级别来作为参数;
但是对于viewer.scene.globe.getHeight(Cartographic),文档是这样描述的:
由于前端是gpu的方式获取,所以这个方式只建议在近距离时使用。
那么还有没有其它获取方式呢?当然有!
SuperMap iServer中就有这样的接口,我们只需要在WebGL中对其进行调用请求即可。
首先通过官网示例服务让这个接口亮个相:http://www.supermapol.com/realspace/services/spatialAnalysis-dixingyingxiang/restjsr/spatialanalyst/geometry/3d/extractvector3d
下面请看具体操作。
一、数据准备
首先当然是需要准备数据啦!首先我们先来看下接口描述:
从文档描述中我们可知:和iDesktop一样,可以说hi用倾斜摄影图层或TIN图层进行三维数据的提取,本文以TIN地形数据为例展开。
准备TIN地形缓存,发布三维服务和空间分析服务,具体操作可参考:加载地形数据操作
二、在WebGL中加载
可参考官网示例demo:http://support.supermap.com.cn:8090/webgl/examples/webgl/editor.html#terrainAndImagery
三、使用Ajax调用iserver空间分析服务
先上代码:
var queryObj = {
"geometries": [{
"type": "POINT3D",
POINT3D
}, ],
"sceneName": "terrainAndImagery",
"layerName": "DEM25",
"interpolationDistance": 0.0
};
var queryData = JSON.stringify(queryObj);
var newResourceLocation;
$.ajax({
type: "post",
url: dataUrl,
data: queryData,
success: function(result) {
newResourceLocation = (result.newResourceLocation; + ".json").toString();
console.log(newResourceLocation);
$.ajax({
type: "get",
url: newResourceLocation,
// data: data,
success: function(result) {
console.log(result);
},
});
},
error: function(msg) {
console.log(msg);
},
})
代码分析:
首先来看iserver中给出的示例参数:
几何对象的格式是这样的:
[{"type":"POINT3D", "x":120.01,"y":40.01,"z":0},
{"type":"LINE3D" , "parts":[2], "points":[{"x":120.21,"y":40.21,"z":0}{"x":121.21,"y":41.21,"z":0}]}]
这里我们可以看到,无论是点还是线,都是没有高度(高度为0)的,而我们查询之后,查询结果是这样的
可以看到已经有了结果。
在代码中可以看到发了两次请求,这是由于第一次返回的是一个页面,如图:
所以第一次请求结果中无法获取到需要的信息,只能看到分析成功与否,并且查看这个结果可知:对这个页面请求可以得到json格式的结果,那么就有了第二次的请求,得到了最终的结果。
作者:wzr