SuperMap iClient3D for Cesium 实现图层下钻功能

这篇具有很好参考价值的文章主要介绍了SuperMap iClient3D for Cesium 实现图层下钻功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

前言

一、所需数据及发布服务

1、数据准备

 2、地图展示

二、Cesium.SuperMapImageryProvider 接口

三、相关代码



前言

        实现地图下钻功能可以提供更详细的地理信息、支持交互式探索、展示层级关联的数据和提供数据分析决策支持等优势。通过点击地图上的区域或点,用户可以获取更详细的地理数据,并可以根据自己的需求和兴趣,在地图上逐层深入查看和分析不同地理区域的数据。这种交互式的探索体验可以帮助用户更好地了解、比较和对比不同地区的数据,从而支持更深入的分析和决策。在地理信息系统、数据可视化和空间分析等领域中,地图下钻功能具有广泛的用途和需求。

SuperMap iClient3D for Cesium 实现图层下钻功能,Cesium,桌面GIS,3d,经验分享,笔记

一、所需数据及发布服务

1、数据准备

        需要准备好地图数据,包括各个层级的地理数据和相应的标识码(ADCODE)方便进行查询:ADCODE(本层级代码)、PARENT(上一层级代码)

SuperMap iClient3D for Cesium 实现图层下钻功能,Cesium,桌面GIS,3d,经验分享,笔记

 2、地图展示

        使用iDesktop制作相应的地图,并在iserver中发布需要进行数据查询的数据服务,和省级、市级、县级地图服务

SuperMap iClient3D for Cesium 实现图层下钻功能,Cesium,桌面GIS,3d,经验分享,笔记

二、Cesium.SuperMapImageryProvider 接口

        Cesium.SuperMapImageryProvider 是 CesiumJS 中用于集成 SuperMap 地图服务的接口,可以在 Cesium 地球上加载 SuperMap 发布的影像地图服务。该接口可以通过指定 SuperMap 服务的 URL、访问令牌、影像图层名称等参数来创建一个影像地图图层,这样就能够在 Cesium 地球上显示 SuperMap 提供的影像地图服务。

以下是 Cesium.SuperMapImageryProvider 的一些常见属性和方法:

SuperMap iClient3D for Cesium 实现图层下钻功能,Cesium,桌面GIS,3d,经验分享,笔记

        layerStatusParameters: 是一个包含图层状态参数的对象。这些参数可能包括图层名称、可见性、透明度等信息,用于配置加载的影像地图图层的状态。

        通过使用 Cesium.SuperMapImageryProvider,可以方便地在 Cesium 中集成 SuperMap 的影像地图服务,并进行地图显示和交互操作。

三、相关代码

        首先定义了一个 urlConfig 对象,包含了不同类型地图服务的 URL 地址。接着定义了一些变量,包括 levelCode、tempAdcode、codeList,用于控制加载地图的级别和区域编码。然后调用 loadMap 函数加载地图。这个函数接受两个参数:type 是地图类型,根据 codeList[levelCode] 的值来确定;layerStatus 是图层状态参数,用于配置加载的影像地图图层的状态。

let urlConfig = {
  queryUrl: 'http://localhost:8090/iserver/services/data-china/rest/data/featureResults.rjson?returnContent=true',
  Province: 'http://localhost:8090/iserver/services/map-china/rest/maps/Province%40china',
  City: 'http://localhost:8090/iserver/services/map-china/rest/maps/City%40china',
  County: 'http://localhost:8090/iserver/services/map-china/rest/maps/County%40china'
};

let levelCode = 0,
  tempAdcode = ['100000'],
  codeList = ['Province', 'City', 'County', 'County'];

let currentLayer = loadMap(codeList[levelCode]);
console.log(currentLayer)
let labels = [];
let supportCodeList = ['320000', '340000', '320200', '320500', '340100', '341100', '320505', '320506', '320507', '320508', '320509', '320581', '320582', '320583', '320585', '320205', '320206', '320211', '320213', '320214', '320281', '320282'];

initEvent();

function loadMap(type, layerStatus) {
  //添加图层
  let imageProvider = new Cesium.SuperMapImageryProvider({
    url: urlConfig[type],
    layerStatusParameters: layerStatus
  });
  let layer = new Cesium.ImageryLayer(imageProvider);
  viewer.imageryLayers.add(layer);
  return layer;
}

        该段代码发送一个 POST 请求到指定的 URL(urlConfig['queryUrl']),请求参数为 queryObj 对象的 JSON 字符串。请求的数据类型为 JSON,异步请求。当请求成功时,根据返回的结果进行处理。如果 res.features 存在并且 levelCode 小于 2,则从响应结果中获取第一个 feature,提取其 ADCODE 并判断是否在 supportCodeList 中。如果存在,则增加 levelCode 值,移除当前图层,加载对应的地图,并根据获取的 ADCODE 显示地图区域。如果 levelCode 等于 2,则直接加载对应的地图,不需要根据 ADCODE 进行筛选显示。如果不满足以上条件,则给出警告提示。

function initEvent() {
  const handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
  handler.setInputAction(movement => {
    if (levelCode === 3) {
      return;
    }
    let positions = viewer.scene.pickPosition(movement.position);
    if (!positions) {
      return;
    }
    let position = new Cesium.Cartesian3(positions.x, positions.y, positions.z);
    let cartographic = Cesium.Cartographic.fromCartesian(positions);
    let lon = Number(Cesium.Math.toDegrees(cartographic.longitude).toFixed(6)); // 经度
    let lat = Number(Cesium.Math.toDegrees(cartographic.latitude).toFixed(6)); // 纬度
    let height = cartographic.height; // 高度
    position = [lon, lat, height];

    var queryObj = {
      getFeatureMode: 'SPATIAL',
      spatialQueryMode: 'INTERSECT',
      datasetNames: ["china:" + codeList[levelCode]],
      geometry: createPointGeometry(position),
      hasGeometry: true,
      queryParameter: {},
      fields: ['ADCODE', 'NAME']
    };

    $.ajax({
      url: urlConfig['queryUrl'],
      type: 'POST',
      data: JSON.stringify(queryObj),
      dataType: 'json',
      async: true,
      success: res => {
        if (res && res.features) {
          if (levelCode < 2) {
            let feature = res.features[0];
            let adcode = feature.fieldValues[feature.fieldNames.indexOf('ADCODE')];
            if (supportCodeList.indexOf(adcode) !== -1) {
              levelCode++;
              currentLayer && viewer.imageryLayers.remove(currentLayer, true);
              tempAdcode.push(adcode);
              currentLayer = loadMap(codeList[levelCode], [
                {
                  layerName: codeList[levelCode] + '@china',
                  isVisible: true,
                  displayFilter: "PARENT='" + adcode + "'"
                }
              ]);
            } else {
              console.warn('因数据量原因,暂不支持此行政区划,目前仅支持江苏苏州、江苏无锡、安徽合肥、安徽滁州区域!');
            }
          } else if (levelCode == 2) {
            let feature = res.features[0];
            let adcode = feature.fieldValues[feature.fieldNames.indexOf('ADCODE')];
            if (supportCodeList.indexOf(adcode) !== -1) {
              levelCode++;
              currentLayer && viewer.imageryLayers.remove(currentLayer, true);
              tempAdcode.push(adcode);
              currentLayer = loadMap(codeList[levelCode], [
                {
                  layerName: codeList[levelCode] + '@china',
                  isVisible: true,
                  displayFilter: 'ADCODE=' + adcode
                }
              ]);
            } else {
              console.warn('因数据量原因,暂不支持此行政区划');
            }
          }
        }
      }
    });
  }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
}

当点击返回按钮时,会执行back()函数,返回上一层级。首先,它会检查levelCode的值是否为1,如果是,则会移除当前图层,并加载上一层级的地图。然后,它会通过tempAdcode.pop()方法将数组tempAdcode中的最后一个元素移除。如果levelCode不为1,那么它会继续判断tempAdcode数组的长度是否大于0,如果是,则使用tempAdcode.pop()方法将数组tempAdcode中的最后一个元素移除。使用tempAdcode.splice(levelCode, 1)方法将tempAdcode数组中索引为levelCode的元素移除。如果levelCode大于1,levelCode减1,并移除当前图层,加载上一层级的地图。文章来源地址https://www.toymoban.com/news/detail-774272.html

$('.back').on('click', () => {
  back();
});
// 返回上一层级
function back() {
  if (levelCode === 1) {
    currentLayer && viewer.imageryLayers.remove(currentLayer, true);
    currentLayer = loadMap(codeList[levelCode - 1]);
    levelCode = 0;
    tempAdcode.pop();
    return;
  }
  if (tempAdcode.length > 0) {
    tempAdcode.pop();
  }
  tempAdcode.splice(levelCode, 1);
  if (levelCode > 1) {
    levelCode--;
    currentLayer && viewer.imageryLayers.remove(currentLayer, true);
    currentLayer = loadMap(codeList[levelCode], [
      {
        layerName: codeList[levelCode] + '@china',
        isVisible: true,
        displayFilter: 'PARENT=' + tempAdcode[levelCode]
      }
    ]);
  };
}

到了这里,关于SuperMap iClient3D for Cesium 实现图层下钻功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SuperMap iClient3D 11i (2023) SP1 for Cesium之移动实体对象

     作者:nannan 目录 前言 一、代码思路 1.1 绘制面实体对象 1.2 鼠标左键按下事件 1.3 鼠标移动事件 1.4 鼠标左键抬起事件 二、运行效果 三、注意事项        SuperMap 官网三维前端范例 编辑线面,可以对面实体对象的节点进行增加、删除以及修改位置。那可不可以整个线/面对

    2024年02月09日
    浏览(34)
  • SuperMap iClient3D for WebGL查询地图栅格值

    栅(shān)格数据就是将空间分割成有规律的网格,每一个网格称为一个单元,并在各单元上赋予相应的属性值来表示实体的一种数据形式。每一个单元(像素)的位置由它的行列号定义,所表示的实体位置隐含在栅格行列位置中,数据组织中的每个数据表示地物或现象的非几何

    2024年02月04日
    浏览(35)
  • 【超图】SuperMap iClient3D for WebGL/WebGPU ——颜色(1)

    作者:taco         在项目中通常会出现,高亮对象。给对象设置颜色的一些问题。那么针对颜色设置在超图的 iClient3D for WebGl/WebGPU 中又提供了哪些方式呢?本篇文章将介绍一些颜色的设置方法。以及一些颜色的参数设置。         在iClient3D for WebGl/WebGPU 中主要以Supe

    2024年02月04日
    浏览(41)
  • 【超图】SuperMap iClient3D for WebGL/WebGPU —— 坐标系&位置 —— Cartesian2

    作者:taco         说到关于地理必然逃不开位置的关系。借用百度百科的内容来说 地理学(geography) ,是研究地球表层 空间地理 要素或者地理综合体 空间分布规律 、时间演变过程和 区域 特征的一门学科。 所以 位置坐标系 必然逃不掉了。那么在SuperMap iClient3D for Web

    2024年01月16日
    浏览(39)
  • iClient3D for Cesium&WebGL入门之使用vscode以服务方式运行调试

    作者:超图研究院技术支持中心-于丁 iClient3D for CesiumWebGL入门之使用vscode以服务方式运行调试 相信大家第一次使用SuperMap iClient3D for Cesium或SuperMap iClient3D for WebGL的时候,都遇到过和我一样的事情: 在文件夹中直接打开html的示例代码文件于浏览器中; 或者使用vscode安装open

    2024年02月04日
    浏览(37)
  • 超图iClient3DforCesium地形、影像、模型、在线影像交互示例

    数据源:基于iserver发布的三维场景(地形、影像、BIM模型) + 在线arcgis影像 应用:目录树展示源数据列表、目录树控制源数据可视化结果显隐、BIM模型点选查询关联属性

    2024年02月03日
    浏览(34)
  • SuperMap Hi-Fi 3D SDK for Unity设置渲染范围

    kele     在三维项目中经常会使用到大屏,有可能会用到4K屏、8K屏、长屏、带鱼屏等高分辨率的屏幕,这些屏幕的其中一个特点是其长宽比比较大,有些时候会是几块16:9的屏幕横向拼接而成,这就使得这整个屏幕在水平方向上跨度很大,渲染内容增加。通常情况下会是

    2024年02月09日
    浏览(28)
  • SuperMap Hi-Fi 3D SDK for Unreal问题集锦

    ###前言 使用SuperMap Hi-Fi 3D SDK for Unreal,会遇到一些崩溃或者加加载不上等问题,本文档手收集记录一些使用过程总可能会遇到的一些问题并给予相应的解决方案,很多问题新版本已做优化,推荐大家可使用前,可在http://support.supermap.com.cn/DownloadCenter/ProductPlatform.aspx 地址下载最

    2024年02月06日
    浏览(43)
  • SuperMap Hi-Fi 3D SDK for Unity基础开发教程

    作者:kele 众所周知,游戏引擎(Unity)功能强大,可以做出很多炫酷的游戏和动画效果,这部分功能的实现往往不仅仅是靠可视化界面就能够实现的,还需要代码开发。SuperMap Hi-Fi SDKS for Unity游戏引擎插件能够实现地理数据与游戏引擎相结合,碰撞出更绚烂的火花,目前Sup

    2024年02月03日
    浏览(38)
  • SuperMap Hi-Fi 3D SDK for Unity制作游戏引擎材质

    kele     在交通,电力,规划等行业中,有的对象常常具有很强的质感,比如金属质感的 钢轨,电力塔;陶瓷材质的绝缘子;玻璃材质的建筑幕墙等,但常规方式的表现效果 往往差强人意。     游戏引擎(Unity3D)中已有丰富的材质资源库,比如玻璃,金属等材质,这

    2024年02月09日
    浏览(75)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包