2013-11-26 2 views
0

Возможно ли использовать открытые слои 2 или 3 или листовки с пользовательскими картами в локальном CRS?Пользовательские плитки в локальном CRS без проекции

У меня есть карта/план очень маленькой области, и у меня есть местный CRS. Местный CRS означает: у меня есть только координаты x и y и не заботятся о прогнозах. Каждый Координат может быть непосредственно пересчитан на карту простым вычислением: PixelX = x * factorX + offsetX. Теперь я хочу сказать приложение веб-карты: Покажите плитки карты в качестве базового слоя и возьмите верхний левый пиксель первой плитки (0/0) как x = 5126 и Y = 24 и возьмите левый нижний пиксель последней плитки на уровне масштабирования z при x = 7256 и y = 2344 (или что-то подобное). Как я могу это достичь?

Насколько я понимаю, мне нужен любой тип проекции, но мне не нужна проекция в моем проекте (в этой маленькой области мир плоский). И я не понимаю, как сказать OpenLayers (или, может быть, Leaflet, если OpenLayers не поддерживает это): Вот мой местный CRS, и плитки должны быть помещены в этот CRS таким образом ...

ответ

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

Мне нужно было сделать что-то подобное. Это было мое решение в Openlayers 3. Мой набор плиток имеет плитки размером 256x256 пикселей. Есть 4x4 из них на уровне увеличения 2, 8x8 на уровне масштабирования 3 и 16x16 на уровне масштабирования 4. Следующие нагрузки загружаются, с координатами, соответствующими смещениям пикселей слева внизу на уровне увеличения 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 (аналогичный вопрос от ранее). Я разместил это же решение для обоих.

Смежные вопросы