本地CRS中的自定义图块无投影

时间:2013-11-26 16:42:20

标签: openlayers leaflet

是否可以在本地CRS中使用openlayers 2或3或带有自定义地图图块的传单?

我有一个非常小的区域的地图/计划,我有一个本地CRS。本地CRS意味着:我只有x和y坐标,不关心投影。通过简单的计算,每个坐标可直接在卡片上显示:PixelX = x * factorX + offsetX。现在我想告诉一个Web地图应用程序:将地图图块显示为基础图层,并将第一个图块(0/0)的左上角像素设为x = 5126,Y = 24,并取最后一个图块的左下角像素在缩放级别z,x = 7256,y = 2344(或类似的东西)。我怎样才能做到这一点?

据我所知,我需要任何类型的投影,但我的项目中不需要任何投影(在这个小区域,世界是平坦的)。而且我不明白,如何告诉OpenLayers(或者也许Leaflet,如果OpenLayers不支持):这是我的本地CRS,并且必须以这种方式将瓷砖放入此CRS ......

2 个答案:

答案 0 :(得分:2)

这似乎适用于OpenLayers 2:

var tiles = new OpenLayers.Layer.XYZ("Local tiles", "tiles/${z}/${x}/${y}.png", {
    isBaseLayer: true,
    maxExtent: [
        x1,
        y2,
        x2,
        y1
    ]
});
map.addLayer(tiles);

x1 / y1是缩放级别为0的图块左上角的坐标,右下角的坐标为x2 / y2。

答案 1 :(得分:1)

我必须做类似的事情。这是我在Openlayers 3中的解决方案。我的图块集具有256x256像素的图块。缩放级别为2,其中4x4,缩放级别为3时为8x8,缩放级别为4x16。以下加载这些内容,坐标与缩放级别2左下角的像素偏移相匹配,正向上和右侧。

我使用Zoomify投影(平面)但不使用Zoomify图层类型,因为这需要JPEG图块具有非常特殊的命名方案。

var mapEdge = 1024;
var tileSize = 256;

var projection = new ol.proj.Projection({
    code: 'ZOOMIFY',
    units: 'pixels',
    extent: [0, 0, mapEdge, mapEdge]
});
var projectionExtent = projection.getExtent();

var maxResolution = ol.extent.getWidth(projectionExtent) / tileSize;
var resolutions = [];
for (var z = 2; z <= 4; z++) {
    resolutions[z] = maxResolution / Math.pow(2, z);
}

var map = new ol.Map({
    target: 'map',
    layers: [new ol.layer.Tile({
        source: new ol.source.TileImage({
            tileUrlFunction: function(tileCoord, pixelRatio, projection) {
                var z = tileCoord[0];
                var x = tileCoord[1];
                var y = -tileCoord[2] - 1;
                return '/map/background/' + z + '/' + x + '/' + y + '.png';
            },
            projection: projection,
            tileGrid: new ol.tilegrid.TileGrid({
                origin: ol.extent.getTopLeft(projectionExtent),
                resolutions: resolutions,
                tileSize: tileSize
            }),
        }),
        extent: projectionExtent
    })],
    view: new ol.View({
        projection: projection,
        center: [mapEdge / 2, mapEdge / 2],
        zoom: 2,
        minZoom: 2,
        maxZoom: 4,
        extent: projectionExtent
    })
});

map.on('click', function(e) {
    console.log(e.coordinate);
});

在邮件列表主题https://groups.google.com/forum/#!topic/ol3-dev/EQh6anrVsP0(我的原始问题)和https://groups.google.com/forum/#!topic/ol3-dev/VVdNXHwiZEk(前面的类似问题)中进行了一些讨论。我已经向两者发布了同样的解决方案。