Проблема с рендерингом источника тайлового вектора с использованием системы координат RGF93/Lambert-93 -- France

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">&copy; MapTiler</a> <a href = "https://www.openstreetmap.org/copyright" target = "_blank">&copy; 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);

Мои вопросы:

  1. почему Франция не нанесена прямо в центр карты, учитывая, что я использую точные «проекционные границы», как определено здесь, и устанавливаю их в проекции, используя setExtent, и учитывая, что я также использую ol.extent.getCenter для получения центра ?
  2. почему данные появляются только на уровне масштабирования 2 и полностью исчезают на уровнях масштабирования 1 или 3?
  3. что я должен сделать, чтобы карта Франции была хорошо центрирована и увеличена в середине карты?

Посмотрите этот пример cloud.maptiler.com/maps/basic-2154/openlayers Вам нужно указать тайловую сетку, так как она не использует сетку EPSG:3857 по умолчанию..

Mike 21.12.2020 17:48

Обновлен jsFiddle jsfiddle.net/1jye9uto

Mike 21.12.2020 23:49

@Майк, это прекрасно, но это также и черная магия. Где узнать обо всем этом? Я даже не знал, что существует понятие «тайловая сетка», не говоря уже о том, как оно определяется, какова семантика и как оно взаимодействует с другими параметрами.

Marcus Junius Brutus 22.12.2020 11:56
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
498
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Так же, как в некоторых примерах 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

Другие вопросы по теме