Openlayers не перепроектируют запросы WMS - PullRequest
0 голосов
/ 15 января 2019

У меня есть карта openlayers в моем проекте, и я хотел добавить плитки WMS к ней. Это мой код:

const map = new ol.Map({
  layers: [
    new ol.layer.Tile({
      name: 'wmstiles',
      source: new ol.source.TileWMS({
        url: 'https://ssl-geowms.lillemetropole.fr/dynmapr/dynmapr.php',
        serverType: 'geoserver',
        version:"1.1.1",
        params: {
          LAYERS: 'PLU%2Fplu',
          VERSION: '1.1.1',
          TRANSPARENT: false,
          HEIGHT: 256,
          WIDTH: 256
        },
        pixelRatio: 1,
        projection: 'EPSG:2154'
      }),
      visible: false
    })
  ],
  view: new ol.View({
    center: ol.proj.fromLonLat([3.1666, 50.6167]),
    zoom: 13,
    maxZoom: 20,
  })
});

Как видите, я пытаюсь проецировать координаты в EPSG:2154 (Франция), чтобы отправить их на сервер WMS. Но моя карта пуста, потому что openlayers не генерировали вызов с хорошей проекцией.

Это сгенерировало мне это: https://ssl -geowms.lillemetropole.fr / dynmapr / dynmapr.php? SERVICE = WMS & VERSION = 1.1.1 & REQUEST = GetMap & FORMAT = image% 2Fpng & TRANSPARENT = false & IN = PLU% 2Fplu & LAYERS = 252Fplu & ВЫСОТА = 919 & ШИРИНА = 2881 & SRS = EPSG% 3A3857 & ТИПОВ = & BBOX = 324977,41473478096% 2C6544989.716173889% 2C380031.18435717915% 2C6562551.1234224085

Вместо чего-то подобного (сгенерированного с другого сайта, который не использует openlayers): https://ssl -geowms.lillemetropole.fr / dynmapr / dynmapr.php? In = PLU / plu & service = WMS & request = GetMap & version = 1.1 0,1 & слои = PLU% 2Fplu & стили = & формат изображения =% 2Fjpeg & прозрачно = ложно & высота = 256 & ширина = 256 & = EPSG SRS% 3A2154 & BBOX = 704615.2885901299,7064111.541254971,705393.894388002,7064886.656737898

Как видите, он не перепроектируется в EPSG:2154, а в EPSG:3857. Есть и другие проблемы, такие как высота и ширина, но это другая история. Если я скопирую / вставлю ограничивающий прямоугольник из рабочей ссылки в первую, это сработает.

1 Ответ

0 голосов
/ 15 января 2019

Ваш код работает для меня (после добавления параметра IN). Вы определили проекцию (и зарегистрировали ее, если используете OpenLayers 5)? Я добавил полупрозрачный слой OSM, чтобы проверить правильность выравнивания репроекции. Вам не нужно указывать размер плитки, OpenLayers установит ее автоматически на основе сетки плитки по умолчанию и других параметров.

proj4.defs('EPSG:2154', '+proj=lcc +lat_1=49 +lat_2=44 +lat_0=46.5 +lon_0=3 +x_0=700000 +y_0=6600000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs ');
if (ol.proj.proj4 && ol.proj.proj4.register) { ol.proj.proj4.register(proj4); }

const map = new ol.Map({
  layers: [
new ol.layer.Tile({
  name: 'wmstiles',
  source: new ol.source.TileWMS({
    url: 'https://ssl-geowms.lillemetropole.fr/dynmapr/dynmapr.php',
    serverType: 'geoserver',
    version:"1.1.1",
    params: {
      IN: "PLU/plu",
      LAYERS: 'PLU%2Fplu',
      VERSION: '1.1.1',
      TRANSPARENT: false,
    },
    pixelRatio: 1,
    projection: 'EPSG:2154',
  }),
  visible: true,
}),
new ol.layer.Tile({
    source: new ol.source.OSM(),
    opacity: 0.5
}),
  ],
  target: 'map',
  view: new ol.View({
center: ol.proj.fromLonLat([3.1666, 50.6167]),
zoom: 13,
maxZoom: 20,
  })
});
<link rel="stylesheet" href="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/v5.3.0/css/ol.css" type="text/css">
<script src="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/v5.3.0/build/ol.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/proj4js/2.4.4/proj4.js"></script>
<div id="map" class="map"></div>
...