私はOpenLayers 3を使って、高解像度の画像を深くズームしています(ジオ座標、ピクセルのみ)。OpenLayersで異なるサイズの2番目のレイヤーを追加するには?
XYZは投影として必要なフォーマットですが、別の投影が必要なため、もう1つのタイルレイヤを追加する際に問題があります。 I.私のメインレイヤーはピクセルでサイズ(X)x(Y)を持ちますが、第2レイヤーはサイズ(X * k)x(Y * k)を持ちます。従って、これらの層は互いに対応していない。どちらの場合もタイルサイズは同じです。ここで
はコードです:
const imWidth = 100440;
const imHeight = 221312;
const primaryImageProjection = new ol.proj.Projection({
code: 'PIXELS',
units: 'pixels',
extent: [0, 0, imWidth, imHeight],
getPointResolution: function (resolution, point) {
return resolution;
}
});
ol.proj.addProjection(primaryImageProjection);
var heatMapProj = new ol.proj.Projection({
code: 'HEATMAP',
units: 'pixels',
extent: [0, 0, imWidth, imWidth],
getPointResolution: function (resolution, point) {
return resolution;
}
});
ol.proj.addProjection(heatMapProj);
const koef = 21.5;
ol.proj.addCoordinateTransforms('PIXELS', 'HEATMAP',
function (coordinate) {
return [coordinate[0] * koef, coordinate[1] * koef];
},
function (coordinate) {
return [coordinate[0]/koef, coordinate[1]/koef];
});
this.map = new ol.Map({
layers: [
new ol.layer.Tile({
source: new ol.source.XYZ({
crossOrigin: crossOrigin,
tileSize: [512, 512],
tileUrlFunction: (tileCoord, pixelRatio, projection) => {
const tileUrlTemplate = 'http://.../?lvl={z}&tx={x}&ty={y}';
const z = 9 - tileCoord[0];
const tileUrl = tileUrlTemplate
.replace("{z}", (z).toString())
.replace("{x}", (tileCoord[1]).toString())
.replace("{y}", (((-tileCoord[2]) - 1)).toString());
return tileUrl;
},
projection: 'PIXELS'
})
}),
new ol.layer.Tile({
source: new ol.source.XYZ({
crossOrigin: crossOrigin,
tileSize: [512, 512],
tileUrlFunction: (tileCoord, pixelRatio, projection) => {
const heatMapUrlTemplate = 'http://...?lvl={z}&tx={x}&ty={y}';
var z = 4 - tileCoord[0];
const heatMapUrl = heatMapUrlTemplate
.replace('{z}', (z).toString())
.replace('{x}', (tileCoord[1]).toString())
.replace('{y}', (((-tileCoord[2]) - 1)).toString());
return heatMapUrl;
},
projection: 'HEATMAP'
}),
opacity: 0.5
})
],
controls: [],
target: this.mapSelector,
renderer: "canvas",
view: new ol.View({
projection: 'PIXELS'
})
});
どのように私はこの問題を解決することができますか?たぶん投影法は正しい方法ではなく、別の方法で解決できます。
PS:私はgetPointResolution関数を使用しています。それ以外の場合は、コンソールにエラーメッセージが表示されます。「変換を定義する必要があります。そして、私は、OpenLayersが私の計画から内部的に "EPSG:4326"への変換を行っていることに気付きました。フラットな画像しか使用していないので、内部に球面座標があるとは思っていませんが、OpenLayersはそれが必要です。
ありがとうございます!私はコードを追加し、その間にZoomifyからXYZに切り替えました。 残念ながら、JSFIddle-sampleは画像のソースが内部にあるので問題があります。 addCoordinateTransformsは、k = 1を使用しても私に正しい画像を生成しません。画像はまだ整列していません。 – murad
こんにちは!私はこの場合のjsfiddleを準備しました。https://jsfiddle.net/x3jdc1kr/ どうぞご覧ください。タイルの数字は現在のズームレベルに対応しています。 – murad