当前位置: 首页 > news >正文

ArcGIS 10.8.1之后发布栅格数据的MapServer 动态工作空间 替换数据源渲染问题

背景

经过测试,Server 10.8.1、11.0、11.1发布相关服务设置动态空间之后,前端都无法自动读取同名的clr色彩映射表文件进行渲染,服务都是由ArcGIS Pro进行发布。

原因

基于ArcMap发布的服务才支持,但是10.8.1之后不支持ArcMap发布服务。自动读取clr色彩映射表文件,需要ArcMap Runtime后台支持,已废弃,可以加载切换数据源,但是不支持渲染,需要采用新的开发方式。
在这里插入图片描述

首先,如何发布服务并开启动态空间?

通过Pro发布服务后在Manager设置开启即可。
在这里插入图片描述
测试示例代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>加载ArcGIS Server服务</title>
    <!-- <link rel="stylesheet" href="https://js.arcgis.com/4.25/esri/themes/light/main.css">
    <script src="https://js.arcgis.com/4.25/"></script> -->
    <link rel="stylesheet" href="https://js.arcgis.com/4.32/esri/themes/light/main.css" />
    <script src="https://js.arcgis.com/4.32/"></script>
    <style>
        #viewDiv {
            height: 100vh;
            width: 100%;
        }
    </style>
</head>
<body>
    <div id="viewDiv"></div>
    <script>
        require([
            "esri/Map",
            "esri/views/MapView",
            "esri/layers/MapImageLayer"
        ], function(Map, MapView, MapImageLayer) {
            // 创建一个地图实例
            const map = new Map({
                basemap: "streets"
            });

            // 创建一个地图视图实例
            const view = new MapView({
                container: "viewDiv",
                map: map,
                center: [120.0916129,30.2487992],
                zoom: 8
            });

            // 定义 token
            //const tkstr = "iN8hBNamZvCpIeo_-QD-dHAg8afm1y4ZUWuj1RmswuM";

            // 创建一个动态地图服务图层
            const dynamicLayer = new MapImageLayer({
                //url: "http://xxxx:6080/geoscene/rest/services/demstyletest/MapServer",
                url: "http://xxxx:6080/geoscene/rest/services/demstyletest/MapServer",
                sublayers: [
                    {
                        id: 0,
                        source: {
                            type: "data-layer",
                            dataSource: {
                                type: "raster",
                                workspaceId: "kkk123",
                                dataSourceName: "aster84.tif"
                            }
                        }
                    }
                ]
            });

            // 将地图服务图层添加到地图中
            map.add(dynamicLayer);
        });
    </script>
</body>
</html>

动态空间路径下即使,存放了同名clr色彩映射表,也是不支持读取渲染的。
在这里插入图片描述

在这里插入图片描述

解决方案

1. 导出为 RGB 方案的栅格数据

这种方法主要针对较为固定的成果数据,如果渲染也是动态的则无法满足。

具体方法可以参考:https://www.cnblogs.com/wigis/p/11065631.html

2. 将数据作为在线数据资源,使用ImageTileLayer加载

这种方法主要针对用户查看的栅格数据,tif栅格数据可以放在Tomcat或其他服务器都可以,渲染通过前端设置render控制,示例代码可以参考:

<html>
  <head>
    <meta charset="utf-8" />
    <meta name="viewport" content="initial-scale=1, maximum-scale=1, user-scalable=no" />
    <title>hello</title>
    <style>
      html,
      body,
      #viewDiv {
        padding: 0;
        margin: 0;
        height: 100%;
        width: 100%;
      }
    </style>
     <link
     rel="stylesheet"
     href="https://js.arcgis.com/4.30/esri/themes/light/main.css"
   />
   <script src="https://js.arcgis.com/4.30/"></script>
    <script>
        require([
                "esri/config",
                "esri/WebMap",
                "esri/views/MapView",
                "esri/views/SceneView",
                "esri/layers/ImageryTileLayer",
                "esri/layers/TileLayer",
                "esri/layers/support/RasterFunction",
                "esri/renderers/RasterShadedReliefRenderer",
                "esri/smartMapping/raster/support/colorRamps",
                "esri/renderers/RasterStretchRenderer",
                "esri/rest/support/MultipartColorRamp",
                "esri/rest/support/AlgorithmicColorRamp",
                "esri/Color",
            ], function(esriConfig,Map, MapView, SceneView,ImageryTileLayer, TileLayer, RasterFunction, RasterShadedReliefRenderer, colorRamps, RasterStretchRenderer, MultipartColorRamp, AlgorithmicColorRamp, Color) {

            const colorRamp = new MultipartColorRamp({
              colorRamps: [
                new AlgorithmicColorRamp({
                  fromColor: new Color([20, 100, 150, 255]),
                  toColor: new Color([70, 0, 150, 255])
                }),
                new AlgorithmicColorRamp({
                  fromColor: new Color([70, 0, 150, 255]),
                  toColor: new Color([170, 0, 120, 255])
                }),
                new AlgorithmicColorRamp({
                  fromColor: new Color([170, 0, 120, 255]),
                  toColor: new Color([230, 100, 60, 255])
                }),
                new AlgorithmicColorRamp({
                  fromColor: new Color([230, 100, 60, 255]),
                  toColor: new Color([255, 170, 0, 255])
                }),
                new AlgorithmicColorRamp({
                  fromColor: new Color([255, 170, 0, 255]),
                  toColor: new Color([255, 255, 0, 255])
                })
              ]
            });


            const stretchRenderer = new RasterStretchRenderer({
              colorRamp: colorRamp,
              type: "raster-stretch",
              bandIds: [0], // 使用第一个波段
              stretchType: "min-max", // 最小值-最大值拉伸
              statistics: [[0, 255]], // 波段的最小值和最大值
              gamma: [1] // Gamma 值
            });


              let layer = new ImageryTileLayer({
                url: "http://localhost/data/red.tif",
                renderer: stretchRenderer
              })


              const map = new Map({
                layers: [layer]
              });


              const view = new MapView({
                  map: map,
                  container: "viewDiv"
              });

              function updateImageTileLayerUrl(newUrl) {
                // 移除旧图层
                map.remove(layer);

                // 创建新图层
                let newLayer = new ImageryTileLayer({
                  url: newUrl,
                  renderer: stretchRenderer
                });

                // 将新图层添加到地图
                map.add(newLayer);
              }

              let btn = document.getElementById("click")
              btn.onclick = () => {
                updateImageTileLayerUrl("http://127.0.0.1:5500/static/fanred.tif")
              }
      })

     

    </script>

  </head>
  <body>
    <div id="viewDiv"></div>
    <button id="click">change</button>
  </body>
</html>

在这里插入图片描述

2. 发布单景栅格数据的 ImageServer

需要通过代码层面,替换服务下的同名栅格数据源,同样,渲染也需要通过前端renderer控制。可以参考:
https://blog.csdn.net/suntongxue100/article/details/130303795?spm=1011.2415.3001.5331

相关文章:

  • 基于Spring AI开发本地Jenkins MCP Server服务
  • JAVA中synchronized重量级锁加锁和释放锁的机制
  • Golang中间件的原理与实现
  • Linux 配置NFS服务器
  • Edge浏览器快速开启IE模式
  • MySQL 锁机制全面解析:乐观锁与悲观锁实现及深度剖析
  • ubuntu 2204键盘按键映射修改
  • DataGear 5.3.0 制作支持导出表格数据的数据可视化看板
  • OceanBase的闪回查询功能实践
  • IP数据报报文格式
  • 英伟达「虚拟轨道+AI调度」专利:开启自动驾驶3.0时代的隐形革命
  • 离散的数据及参数适合用什么算法做模型
  • vscode_拼写关闭
  • 从 WPF 到 MAUI:跨平台 UI 开发的进化之路
  • C++使用do {} while(false)的好处
  • 机器学习模型类型
  • OpenCV 图形API(2)为什么需要图形API?
  • 关于《数据资源建设费用测算标准》(工作组讨论稿)意见征集的通知
  • 白盒测试用例的设计
  • 【学Rust写CAD】16 0、1、-1代数单位元(algebraic_units.rs)
  • 金沙记忆|元谋龙街渡:是起点也是终点
  • 观察|“离境退税”撬动上海“五一”假期入境消费
  • 浙江医生举报3岁男童疑遭生父虐待,妇联:已跟爷爷奶奶回家
  • 赵厚均评《唐诗与唐代园林景观的审美建构研究》|林泉恣探历,风景暂徘徊
  • 大学2025丨对话深大人工智能学院负责人李坚强:产学研生态比“造天才”更重要
  • 马上评|扩大高速免费救援范围,打消出行后顾之忧