проекции в openlayers 4

Кроме QGIS
Ответить
a77x7
Новоприбывший
Сообщения: 4
Зарегистрирован: 12 апр 2017, 07:50
Репутация: 0

проекции в openlayers 4

Сообщение a77x7 » 12 апр 2017, 08:20

Не могу разобраться в сути проблемы...
есть веб-страничка с openlayers 4, на ней в качестве основ можно выбирать Bing, OSM, Yandex и другие:

Код: Выделить всё

        src = new ol.source.BingMaps({
            imagerySet: 'AerialWithLabels',//'AerialWithLabels',
            key: '---'
        });
        bases["bing"] = new ol.layer.Tile({
            name: 'bing',
            title: 'Bing Maps aerial',
            is_base_layer: true,
            visible: false,
            source: src
        });

        src = new ol.source.XYZ({
            url: 'https://{a-c}.tile.thunderforest.com/cycle/{z}/{x}/{y}.png',
            visible: true
        });
        bases["tf"] = new ol.layer.Tile({
            name: 'tf',
            visible: false,
            source: src,
            is_base_layer: true
        });

        src = new ol.source.OSM();
        bases["osm"] = new ol.layer.Tile({
            name: 'osm',
            visible: false,
            source: src,
            is_base_layer: true
        });
с Яндексом посложнее:

Код: Выделить всё

        var yaex = [-20037508.342789244, -20037508.342789244, 20037508.342789244, 20037508.342789244];
        proj4.defs('EPSG:3395', '+proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs');
        ol.proj.get('EPSG:3395').setExtent(yaex);

        bases["yandex"] = new ol.layer.Tile({
            source: new ol.source.XYZ({
                url: 'http://vec0{1-4}.maps.yandex.net/tiles?l=map&x={x}&y={y}&z={z}',
                projection: 'EPSG:3395',
                tileGrid: ol.tilegrid.createXYZ({
                    extent: yaex
                })
            }),
            visible: false,
            is_base_layer: true
        });
создаю карту как обычно:

Код: Выделить всё

        var map = new ol.Map({
            controls: ol.control.defaults({
                attribution: false
            }).extend([mousePositionControl]),
            target: 'map',
            layers: [],
            view: new ol.View({
                projection: 'EPSG:3857'
            })
        });
всё работает отлично, можно переключать основы, всё корректно.
теперь хочу изменить проекцию вида на 4326:

Код: Выделить всё

view: new ol.View({
                projection: 'EPSG:4326'
            })
все основы отображаются корректно, а Яндекс не отображается.
Хром говорит:

Код: Выделить всё

proj4-src.js:1836 Uncaught TypeError: Cannot read property 'x' of null
    at transformer (proj4-src.js:1836)
    at forward (proj4-src.js:1875)
    at ol-debug.js:5515
    at ol.reproj.Triangulation.transformInv_ (ol-debug.js:67660)
    at new ol.reproj.Triangulation (ol-debug.js:67720)
    at new ol.reproj.Tile (ol-debug.js:70840)
    at ol.source.XYZ.ol.source.TileImage.getTile (ol-debug.js:72003)
    at ol.renderer.canvas.TileLayer.prepareFrame (ol-debug.js:69282)
    at ol.renderer.canvas.Map.renderFrame (ol-debug.js:23128)
    at ol.Map.renderFrame_ (ol-debug.js:31812)
смотрим подробнее:

Код: Выделить всё

	function transformer(from, to, coords) {
	  var transformedArray;
	  if (Array.isArray(coords)) {
	    transformedArray = transform(from, to, coords);
	    if (coords.length === 3) {
	      return [transformedArray.x, transformedArray.y, transformedArray.z];
	    }
	    else {
	      return [transformedArray.x, transformedArray.y];// <--- ОШИБКА ЗДЕСЬ
	    }
	  }
	  else {
	    return transform(from, to, coords);
	  }
	}
transformedArray равен null. null он равен потому, что transform() вызывается для точки [0, -90], а Яндекс имеет extent [-180,-85,180,85], т.е. точка вне границ Яндекс карт. я подумал из-за этого, но посмотрел на Bing и у них тоже extent [-180,-85,180,85] как у Яндекс.
Если я Яндексу ставлю проекцию 3857, то всё начинает отображаться, но проблема в том, что Яндекс тогда смещён.
В общем не пойму почему так происходит. Скорее всего я не понимаю какую-то фундаментальную вещь, так как только начинаю разбираться в веб-картографии. Буду благодарен если кто-то просвятит...

Аватара пользователя
Игорь Лебедь
Завсегдатай
Сообщения: 428
Зарегистрирован: 24 апр 2010, 19:47
Репутация: 97
Откуда: Воронеж

Re: проекции в openlayers 4

Сообщение Игорь Лебедь » 12 апр 2017, 09:44

У Яндекса проекция 3395, и видимо параметры трансформации надо прописывать дополнительно, раз он отображает со смещением, то не может корректно перепроецировать.

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3367
Зарегистрирован: 11 апр 2008, 21:09
Статьи: 33
Проекты: 9
Репутация: 514
Ваше звание: Author
Контактная информация:

Re: проекции в openlayers 4

Сообщение Denis Rykov » 12 апр 2017, 09:47

Spatial is now, more than ever, just another column- The Geometry Column.

freeExec
Гуру
Сообщения: 796
Зарегистрирован: 23 апр 2011, 10:32
Проекты: 1
Репутация: 113
Откуда: Ульяновск

Re: проекции в openlayers 4

Сообщение freeExec » 12 апр 2017, 09:50

Всё дело в том, что проекция Яндекса основана на элипсойде, а не на сфере как у всех остальных, поэтому тут 3857 не в тему. Да и вообще, пользоваться Яндексом можно только через их API, а не какие-то там ОткрытыеСлои.

a77x7
Новоприбывший
Сообщения: 4
Зарегистрирован: 12 апр 2017, 07:50
Репутация: 0

Re: проекции в openlayers 4

Сообщение a77x7 » 12 апр 2017, 10:23

Я правильно понимаю, что всё это происходит, потому что я пытаюсь с помощью OL показать карты Яндекс, которые в общем-то не заточено под это?
И когда вся эта автоматика OL начинает работать, думая, что Яндекс карты такие же как большинство, то происходит затык.
Тогда, могу ли я, и правильно ли это, сделать функцию получения URL для Яндекс карт, чтобы отключить автоматику OL и правильно в этой функции обращаться к API Яндекс карт, выдавая правильные тайлы и, что там ещё...

a77x7
Новоприбывший
Сообщения: 4
Зарегистрирован: 12 апр 2017, 07:50
Репутация: 0

Re: проекции в openlayers 4

Сообщение a77x7 » 12 апр 2017, 12:15

решение пришло из Греции...
http://gis.stackexchange.com/questions/ ... rojections
спасибо Павлосу.
Короче, проблема в proj4, сменил версию (на более старую) и всё заработало
Спасибо и вам.

Аватара пользователя
Филиппов Владислав
Гуру
Сообщения: 979
Зарегистрирован: 17 фев 2006, 06:28
Проекты: 1
Репутация: 132
Ваше звание: Геннадич
Откуда: Новосибирск
Контактная информация:

Re: проекции в openlayers 4

Сообщение Филиппов Владислав » 12 апр 2017, 14:34

так там тоже ответили про 3395 - "So it seems reprojecting tiles on client from 3395 to 4326 works fine"

a77x7
Новоприбывший
Сообщения: 4
Зарегистрирован: 12 апр 2017, 07:50
Репутация: 0

Re: проекции в openlayers 4

Сообщение a77x7 » 12 апр 2017, 15:00

Ну, да. Насколько я понял, Павлос написал, что у него всё работает и посоветовал проверить версию proj4

Ответить

Вернуться в «Свободные, бесплатные, открытые ГИС»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя