Как преобразовать «Странный» формат XYZ-плитки ESRI в формат XYZ

#javascript #openlayers #esri #tile #xyz

#javascript #openlayers #esri #плитка #xyz

Вопрос:

Мне нужно получить доступ к службе Esri REST, которая имеет странный формат XYZ. Например:

В обычном XYZ-сервисе z равно 14, где в этом конкретном сервисе на той же высоте z равно 8.

Кто-нибудь знает, как преобразовать их и использовать «странный» формат в OpenLayers?

Это «обычный» сервис:

…../15/17122/11081 .png

И это «странный»:

…../8/458/170

Они оба примерно для одного и того же местоположения, на одинаковой высоте.

Комментарии:

1. У вас есть ссылка на сервис? Он может иметь ограниченный размер или использовать пользовательскую проекцию и нуждается в пользовательской сетке плиток.

2. @Mike Да. Это служебная ссылка , и это карта, в которую она встроена: link … Мне нужно встроить плитки наложения на пользовательскую карту OpenLayers

Ответ №1:

Это настраиваемая сетка плиток для проекции EPSG: 25832. Настройки, необходимые для настройки сетки в OpenLayers, можно найти в https://karte.breitbandmessung.de/servertmp/rest/services/Mobilfunkversorgung/MonitoringPortal_DT_4G/Mapserver?f=pjson Необходимы только origin и resolutions , но включение экстента предотвратит запрос плиток вне диапазона — xmax из fullExtent кажется немного слишком маленьким и отсекает самый восточный край страны, поэтому я составил экстент на основе уровня 0ширина 3 плитки

 <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
    <link rel="stylesheet" href="https://openlayers.org/en/v6.4.3/css/ol.css" type="text/css">
    <script src="https://openlayers.org/en/v6.4.3/build/ol.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/proj4js/2.6.1/proj4.js"></script>
    <style>
      html, body, .map {
        margin: 0;
        padding: 0;
        width: 100%;
        height: 100%;
      }
    </style>
</head>
<body>
<div id="map" class="map"></div> 
<script>

proj4.defs("EPSG:25832", " proj=utm  zone=32  ellps=GRS80  towgs84=0,0,0,0,0,0,0  units=m  no_defs");
ol.proj.proj4.register(proj4);

var origin = [233184, 6120719];

var resolutions = [
    1222.9948985513972,
     611.4974492756991,
     305.7487246378482,
      152.87436231920458,
       76.43718115960229,
       38.21859057966118,
       19.109295289886575,
        9.5546476449433,
        4.7773238224716374
];

//var extent = [280300, 5235800, 912300, 6106300];
var extent = [origin[0], origin[1] - 3 * 256 * resolutions[0], origin[0]   3 * 256 * resolutions[0], origin[1]];

var map = new ol.Map({
  target: 'map',
  layers: [   
      new ol.layer.Tile({
          source: new ol.source.OSM(),
      }),
      new ol.layer.Tile({
            source: new ol.source.XYZ({
                url: "https://karte.breitbandmessung.de/servertmp/rest/services/Mobilfunkversorgung/MonitoringPortal_DT_4G/Mapserver/tile/{z}/{y}/{x}",
                projection: "EPSG:25832",
                tileGrid: new ol.tilegrid.TileGrid({
                  origin: origin,
                  extent: extent,
                  resolutions: resolutions,
                  tileSize: [256, 256],
                }),

          }),
          opacity: 0.5,
      }),
  ],
  view: new ol.View({
      projection: "EPSG:25832", 
  })
});
  
map.getView().fit(extent);

   </script>
</body>
</html>