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