jsFiddle приведен здесь: здесь
Я новичок в Open Layers 6, и я пытаюсь отобразить данные векторных листов на карте, более или менее основываясь на примере, приведенном в мастерской Open Layers.
URL-адрес источника векторных листов, указанный в приведенном выше примере кода, не работал, поэтому я использую источник векторных листов, описанный на этой странице . Там я прочитал, что источник определяется с использованием системы координат RGF93 / Lambert-93 (EPSG:2154), а затем с помощью Google я нашел определение и границы этой системы координат на этой странице.
В следующем коде я использую определение проекции и проецируемые границы из этой последней ссылки.
Несмотря на то, что данные отображаются на карте, они появляются только в самой дальней левой части экрана и только при уровне масштабирования 2, как показано ниже:
Если я изменяю уровень масштабирования, на экране ничего не отображается.
Код приведен ниже (см. также ссылку на JsFiddle выше):
/*
* Provenance:
*
* https://cloud.maptiler.com/tiles/v3-2154/
* https://epsg.io/2154
*
*/
const EPSG_2154 = 'EPSG:2154';
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");
ol.proj.proj4.register(proj4);
const proj = ol.proj.get(EPSG_2154);
proj.setExtent([-378305.81, 6093283.21, 1212610.74, 7186901.68]);
const extent = proj.getExtent();
console.info('extent is: ', extent);
const key = '7A1r9pfPUNpumR1hzV0k';
const layer = new ol.layer.VectorTile({
source: new ol.source.VectorTile({
attributions: [
'<a href = "https://www.maptiler.com/copyright/" target = "_blank">© MapTiler</a> <a href = "https://www.openstreetmap.org/copyright" target = "_blank">© OpenStreetMap contributors</a>'
],
/*
* It is important that the Vector Tile Source projection be explicitly declared and
* be the same as the view projection, otherwise you get:
*
* https://github.com/openlayers/openlayers/issues/11429
*
*/
projection: EPSG_2154,
format: new ol.format.MVT(),
url: `https://api.maptiler.com/tiles/v3-2154/{z}/{x}/{y}.pbf?key=${key}`,
maxZoom: 14
})
});
const center = ol.extent.getCenter(extent);
console.info('center is: ', center);
const map = new ol.Map({
target: 'map-container',
view: new ol.View({
projection: EPSG_2154,
center,
zoom: 2
})
});
map.addLayer(layer);
Мои вопросы:
setExtent
, и учитывая, что я также использую ol.extent.getCenter
для получения центра ?Обновлен jsFiddle jsfiddle.net/1jye9uto
@Майк, это прекрасно, но это также и черная магия. Где узнать обо всем этом? Я даже не знал, что существует понятие «тайловая сетка», не говоря уже о том, как оно определяется, какова семантика и как оно взаимодействует с другими параметрами.
Так же, как в некоторых примерах MapTiler используется TileJSON (см. https://github.com/mapbox/tilejson-spec/tree/master/2.2.0) для растровых плиток, существуют также TileJSON для векторных плиток, для пример стиль https://api.maptiler.com/maps/basic-2154/style.json?key=7A1r9pfPUNpumR1hzV0k
содержит ссылку
"sources":{"openmaptiles":{"url":"https://api.maptiler.com/tiles/v3-2154/tiles.json?key=7A1r9pfPUNpumR1hzV0k","type":"vector"}}
который, в свою очередь, определяет тайловую сетку. Если вы хотите избежать черной магии жесткого кодирования параметров тайловой сетки, вы можете получить URL-адрес TileJSON и создать тайловую сетку и источник векторной плитки из содержимого с помощью кода, похожего на https://github.com/OrdnanceSurvey/OS-Data- Hub-API-Demos/blob/master/OSVectorTileAPI/OpenLayers/map.js#L52-L71
Посмотрите этот пример cloud.maptiler.com/maps/basic-2154/openlayers Вам нужно указать тайловую сетку, так как она не использует сетку EPSG:3857 по умолчанию..