当前位置: 首页 > 知识库问答 >
问题:

WMTSLayers似乎无法在EPSG:25830中工作

邹海荣
2023-03-14

我正在开发新的web,我想使用ArcGIS javascript API4使用WMTS服务

选择空间参考EPSG:25830时,Javascript API 4.11中的WMTSLayer似乎不起作用。

问题是API生成的请求不正确,Tilerow参数错误。

正在发送的请求是这样的。http://www.ign.es/wmts/ign-base?SERVICE=WMTS

而且一定是...

http://www.ign.es/wmts/ign-base?SERVICE=WMTS

下面是我的代码示例。

JSFIDDLE

或者

html" target="_blank">html prettyprint-override"><!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta
      name="viewport"
      content="initial-scale=1,maximum-scale=1,user-scalable=no"
    />
    <link
      rel="stylesheet"
      href="https://js.arcgis.com/4.11/esri/themes/light/main.css"
    />
    <title>Select WMTSLayer sublayer - 4.11</title>

    <style>
      html,
      body,
      #viewDiv {
        padding: 0;
        margin: 0;
        height: 95%; /* allow space for sublayer switcher */
        width: 100%;
      }

      select,
      label {
        font-family: "Avenir Next W00", "Helvetica Neue", Helvetica, Arial,
          sans-serif;
      }

      #selectDiv {
        background-color: lightgrey;
        padding: 10px;
      }

      #theLabel {
        visibility: hidden; /* hide until populated */
      }

      .esri-layer-list {
        width: 310px;
      }
    </style>

    <script src="https://js.arcgis.com/4.11/"></script>

    <script>
      var map, view;

      require([
        "esri/Map",
		"esri/Basemap",
        "esri/Viewpoint",
        "esri/geometry/Extent",
        "esri/views/MapView",
        "esri/layers/WMTSLayer",
		"esri/widgets/LayerList",
        "esri/core/watchUtils"
      ], function(
        Map,
		Basemap,
        Viewpoint,
        Extent,
        MapView,
        WMTSLayer,
		LayerList,
        watchUtils
      ) {
	  
		var layerBase = {baseMapLayers: [{id: "basemap-layer", opacity: 1, title: "aaaaa", url: "http://arcgis.bizkaia.eus/arcgis/rest/services/ORTOFOTOS/GOBIERNO_VASCO_2016_AMPLIADO/MapServer", visibility: true, layerType:"ArcGISTiledMapServiceLayer"}], title: "Basemap"}
        layer = new WMTSLayer({
          url: "http://www.ign.es/wmts/ign-base"
        });

        map = new Map({
			basemap: Basemap.fromJSON(layerBase),
	    });
        view = new MapView({
          container: "viewDiv",
          map: map
        });
        view.when(function() {
          layerList = new LayerList({
            view: view
          });
          view.ui.add(layerList, "bottom-left");
		  layer.load();

          layer.when(function() {
            // add all sublayers to the select element
            layer.sublayers.forEach(function(sublayer, i) {
				if (sublayer.id === "IGNBaseOrto" || sublayer.id === "IGNBaseTodo" )
					selectSublayer.options[ selectSublayer.options.length ] = new Option("(" + i + ") " + sublayer.title, sublayer.id);
            });
			// once populated, show the select element
            var theDiv = document.getElementById("theLabel");
            theDiv.style.visibility = "visible";
          }); // end layer.load function
        });

        // if sublayer is changed, recreate map, view, and widgets using new activeLayer
        document.getElementById("selectSublayer").onchange = function(event) {
			map.removeAll();
			if(event.target.value!==""){
				layer.activeLayer = layer
				.findSublayerById(event.target.value)
				.clone();
				map.layers.add(layer);
			}
        };
      });
    </script>
  </head>
  <body>
    <div id="selectDiv">
      <label id="theLabel">
        Pick a layer from the WMTS catalog
        <select id="selectSublayer"><option value="">No Layers Selected</option></select>
      </label>
    </div>
    <div id="viewDiv"></div>
  </body>
</html>

要重现错误,必须从选择框中选择一个WMTSLayer。

有解决这个问题的方法吗?

共有2个答案

赵明亮
2023-03-14

在这张图中,您可以检查IGNBaseTodo层(我正在尝试使用的层)上支持哪些投影。

我用EPSG:28530 spatial reference将该层加载到QGIS上,我捕获了请求,并与arcgis API4正在执行的请求进行了比较,唯一的区别是tilerow参数,其他一切都正常。

形象

康烨伟
2023-03-14

您的basemap图层类型是ArcGISTiledMapServiceLayer,在新的API 4.11中,它是一个TileLayer。根据ESRI提供的Tillelayer文件:

https://developers.arcgis.com/javascript/latest/api-reference/esri-layers-TileLayer.html

已知的限制

在SceneView中向地图添加TileLayer时,存在以下限制:

此图层需要从ArcGIS Server 10.3及更高版本或ArcGIS Server 10.2发布。2使用此应用的修复程序。如果查看模式为全局模式,则仅支持使用ArcGIS Online/Bing Maps/Google Maps(Web Mercator)或WGS84地理坐标系版本2平铺方案的服务。如果viewingMode为local,则仅支持具有投影坐标系的服务。仅支持具有以下平铺方案规范的平铺层:

256x256或512x512像素分幅比例级别必须增加或减少两倍,在级别0时,根分幅不应超过30个。所有平铺层必须具有相同的平铺方案和空间参照。

请在这里找到小提琴和例子,它不起作用,但也不失败(加载层时不显示400个坏请求

    <!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta
      name="viewport"
      content="initial-scale=1,maximum-scale=1,user-scalable=no"
    />
    <link
      rel="stylesheet"      href="https://js.arcgis.com/4.11/esri/themes/light/main.css"
    />
    <title>Select WMTSLayer sublayer - 4.11</title>

    <style>
      html,body,
      #viewDiv {
        padding: 0;
        margin: 0;
        height: 95%; /* allow space for sublayer switcher */
        width: 100%;
      }
      select, label {
        font-family: "Avenir Next W00", "Helvetica Neue", Helvetica, Arial,
          sans-serif;
      }
      #selectDiv {
        background-color: lightgrey;
        padding: 10px;
      }
      #theLabel {
        visibility: hidden; /* hide until populated */
      }
      .esri-layer-list {
        width: 310px;
      }
    </style>
    <script src="https://js.arcgis.com/4.11/"></script>
    <script>
var map, view, layer;
require([
        "esri/Map",
            "esri/Basemap",        
        "esri/views/MapView",
        "esri/layers/WMTSLayer",
            "esri/widgets/LayerList",
        "esri/layers/TileLayer"
      ], function(Map,Basemap,MapView,WMTSLayer,LayerList,TileLayer) {

var basemap = new Basemap({
  baseLayers: [
    new TileLayer({
    url: "http://arcgis.bizkaia.eus/arcgis/rest/services/ORTOFOTOS/GOBIERNO_VASCO_2016_AMPLIADO/MapServer"
  })]
});

var layerBase = {
        title: "Basemap",
    baseMapLayers: [{
    url: "http://arcgis.bizkaia.eus/arcgis/rest/services/ORTOFOTOS/GOBIERNO_VASCO_2016_AMPLIADO/MapServer",
    visibility: true,
    layerType:"ArcGISTiledMapServiceLayer"}]};
layer = new WMTSLayer({
          url: "http://www.ign.es/wmts/ign-base"          
        });
map = new Map({
 //basemap: Basemap.fromJSON(layerBase),
 //basemap: "streets",
 basemap: basemap,
 layers: [layer]
});

view = new MapView({
     container: "viewDiv",
     map: map
 });
 view.when(function() {
   view.extent = layer.fullExtent;
   var layerList = new LayerList({
     view: view
   });
   view.ui.add(layerList, "bottom-left");
 });
});
    </script>
  </head>
  <body>
    <div id="viewDiv"></div>
  </body>
</html>

我认为问题在于参考系统(只读),上面的层没有重新投影以适应基础图。

 类似资料:
  • 我刚刚安装了node.js,我还在环境变量中设置了PATH。PATH值为:

  • 所以我不知道如何让桌子在雪花中旋转。我试图在这里为帮助页面建模https://docs.snowflake.com/en/sql-reference/constructs/pivot.html。 枢轴输出 sql文本:

  • 问题内容: 我正在尝试通过检查golang TCPConn.Write返回的错误来检测发送失败,但它为nil。我也尝试使用TCPConn.SetWriteDeadline,但没有成功。 事情就是这样发生的: 服务器启动 客户端连接 服务器发送一条消息,客户端收到它 客户端 关闭 服务器再发送一条消息:没有错误 服务器发送第三条消息:仅现在出现错误 问题 :为什么只有第二条消息发送给不存在的客户端会

  • 我对nodeJS…和编程是新手。但我试图让这段代码工作,我无法理解为什么它似乎不起作用。更糟糕的是,我也不知道如何排除故障。如果我使用控制台。日志语句,我可以看到,一旦我启动网页,它就会连接,但网页从未从nodeJS服务器收到消息,服务器也从未从网页收到消息。我正在使用Chrome浏览器。 服务器.js: 我从命令提示符在树莓pi zero w上启动它: index.html引用interface

  • 问题内容: 我似乎无法理解QueryDSL的elasticsearch方面。以下是我的查询对象以及我的数组的映射。我正在尝试将它们放入基于标签的多面导航中。每个“元素”将在标签数组中关联多个标签[并非所有元素都具有标签。一些将有一个空数组。]。每个标签都是具有id和tag属性的对象。 我尝试了嵌套的构面方法,并得到“标签未嵌套”的错误,因此我在下面尝试了此方法。我没有收到错误,但是返回JSON中没

  • 我在Spark上使用Python时遇到问题。我的应用程序有一些依赖项,如numpy、pandas、astropy等。我无法使用virtualenv创建具有所有依赖项的环境,因为集群上的节点除了HDFS之外没有任何公共挂载点或文件系统。因此,我一直坚持使用。我将站点包的内容打包在一个ZIP文件中,并使用