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

发布于:2025-03-29 ⋅ 阅读:(31) ⋅ 点赞:(0)

背景

经过测试,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


网站公告

今日签到

点亮在社区的每一天
去签到