есть веб-страничка с 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);
	  }
	}Если я Яндексу ставлю проекцию 3857, то всё начинает отображаться, но проблема в том, что Яндекс тогда смещён.
В общем не пойму почему так происходит. Скорее всего я не понимаю какую-то фундаментальную вещь, так как только начинаю разбираться в веб-картографии. Буду благодарен если кто-то просвятит...


