WMTSLayers, кажется, не работает в EPSG: 25830 - PullRequest
0 голосов
/ 14 мая 2019

Я занимаюсь разработкой новой сети и хочу использовать сервисы WMTS с помощью ArcGIS javascript API4

Кажется, что WMTSLayer в Javascript API 4.11 не работает, если выбрана пространственная ссылка EPSG: 25830.

Проблемаявляется то, что запрос, генерируемый API, является неправильным, параметр Tilerow является неправильным.

Запрос отправляется, это.http://www.ign.es/wmts/ign-base?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&LAYER=IGNBaseTodo&STYLE=default&FORMAT=image%2Fjpeg&TILEMATRIXSET=EPSG%3A25830&TILEMATRIX=18&TILEROW=236256&TILECOL=32268

И должно быть ...

http://www.ign.es/wmts/ign-base?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&LAYER=IGNBaseTodo&STYLE=default&FORMAT=image%2Fjpeg&TILEMATRIXSET=EPSG%3A25830&TILEMATRIX=18&TILEROW=32374&TILECOL=32268

Вот мой пример кода.

JSFIDDLE

или

<!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 ]

0 голосов
/ 14 мая 2019

на этом изображении вы можете проверить, какие проекции поддерживаются на слое IGNBaseTodo - слое, который я собираюсь использовать.

Я загрузил этот слой в QGIS с помощью пространственной привязки EPSG: 28530, и я записал запросы и сравнил их с запросами, которые выполняет arcgis API4, уникальным отличием является параметр tilerow, в любом случае все в порядке. изображение

0 голосов
/ 14 мая 2019

Тип слоя вашей базовой карты - ArcGISTiledMapServiceLayer, который в новом API 4.11 является TileLayer.Согласно документации TileLayer из ESRI:

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

Известные ограничения

При добавлении TileLayer к карте в SceneView действуют следующие ограниченияСуществуют:

Этот слой должен быть опубликован в ArcGIS Server 10.3 и более поздних версиях или ArcGIS Server 10.2.2 с этим приложенным исправлением.Если viewMode является глобальным, то поддерживаются только сервисы с ArcGIS Online / Bing Maps / Google Maps (Web Mercator) или WGS84 Geographic Coordinate System, версия 2.Если viewMode является локальным, то поддерживаются только сервисы с проецируемыми системами координат.Поддерживаются только слои листов со следующими спецификациями схемы листов:

256x256 или плитки размером 512x512 пикселей. Уровни шкалы должны увеличиваться или уменьшаться в два раза. На уровне 0 не должно быть более 30 корневых плиток.Все мозаичные слои должны иметь одинаковую схему листов и SpatialReference.

Пожалуйста, найдите скрипку здесь и пример, который не работает, но также не дает сбоя (не показывает 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>

Я думаю, что проблема в системе отсчета (которая доступна только для чтения), вышеприведенный слой не проецируется повторно, чтобы соответствовать базовой карте.

...