2

すばらしいProj4Leafletプラグインを使用してリーフレット マップをセットアップしました。私のマップ内では、カスタム参照システム ( EPSG:28533 ) を使用しています。マップ タイル ( WMTSCapabilities ) がフェッチされ、レンダリングされます。しかし、タイルが間違った場所に変換されていることに遭遇しました。オフセットは約+9° latおよび+7° lngです。参照システム ( fiddleorigin )の定義内で間違った設定をしたと思います。

var rs25832 = new L.Proj.CRS(
    'EPSG:25832',
    '+proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs', {
        origin: [
            // I suppose the error is here!
            265948.8191,
            7288831.7014
        ],
        resolutions: [
            // TileMatrixScaleDenominator * OGC_PixelWidth
            17471320.7509   * 0.00028,
            8735660.37545   * 0.00028,
            4367830.18772   * 0.00028,
            2183915.09386   * 0.00028,
            1091957.54693   * 0.00028,
            545978.773466   * 0.00028,
            272989.386733   * 0.00028,
            136494.693366   * 0.00028,
            68247.3466832   * 0.00028,
            34123.6733416   * 0.00028,
            17061.8366708   * 0.00028,
            8530.9183354    * 0.00028,
            4265.4591677    * 0.00028,
            2132.72958385   * 0.00028
        ]
    }
);

var url = 'http://sg.geodatenzentrum.de/wmts_webatlasde/tile/1.0.0/webatlasde/default/DE_EPSG_25832_ADV/{z}/{y}/{x}.png';      
var layer = L.tileLayer(url, {
        maxZoom: rs25832.options.resolutions.length,
        continuousWorld: true
    }
);

var map = L.map('map', {
    crs: rs25832,
    center: [ 50.5881112, 7.2676084 ],
    zoom: 0,
    maxZoom: rs25832.options.resolutions.length,
    layers: [ layer ]
});

map.on('click', function(e) {
    alert('lat: ' + e.latlng.lat + ' lng: ' + e.latlng.lng)
});

私が設定を理解している限りorigin、参照システムの投影された境界の左上隅を定義します。spatialreference.orgの定義によると、この特定の参照系の境界は次のとおりです。

265948.8191, 6421521.2254, 677786.3629, 7288831.7014

CRS を決定するために間違ったアプローチを使用していoriginますか?

4

1 に答える 1

3

私は問題を解決しました!問題は、やはりorigin物件の判別方法でした。origin参照系の は、参照系の射影された境界の左上の点に等しいはずだと思っていました。しかし、私は間違っていました。正しいアプローチは、レイヤー BBox の左上隅を使用することです。サーバーの WMTSCapabilities に基づいて、proj4js をorigin使用して予測を計算することができました。これが私の更新されたコードです(fiddle):

// Proj4js EPSG:25832 definition
var proj4rs25832def = '+proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs';

// Calc origin
var orign = proj4(
    proj4rs25832def,
    // Upper left corner of the tile orign based on the WMTSCapabilities layer BBox
    [ 0.105946948013, 56.8478734515 ]
);

// Set resolutions
var resolutions = [ 17471320.7509, 8735660.37545, 4367830.18772, 2183915.09386, 1091957.54693, 545978.773466, 272989.386733, 136494.693366, 68247.3466832, 34123.6733416, 17061.8366708, 8530.9183354, 4265.4591677, 2132.72958385 ];

// Define CRS
var rs25832 = new L.Proj.CRS(
    'EPSG:25832',
    proj4rs25832def, 
    {
        origin: [ orign[0], orign[1] ],
        resolutions: resolutions.map(function (value) {
            return value * 0.00028;
        })
    }
);

// Create layer
var url = 'http://sg.geodatenzentrum.de/wmts_webatlasde/tile/1.0.0/webatlasde/default/DE_EPSG_25832_ADV/{z}/{y}/{x}.png';      
var layer = L.tileLayer(
    url, 
    {
        continuousWorld: true,
        bounds: [[ 45.2375, 0.1059 ],[ 56.8478, 20.4488 ]],
        maxZoom: resolutions.length
    }
);

// Setup map
var map = L.map('map', {
    crs: rs25832,
    center: [ 50.8805, 7.3389 ],
    zoom: 0,
    maxZoom: resolutions.length,
    layers: [ layer ]
});

// Setup click hander
map.on('click', function(e) {
  alert('lat: ' + e.latlng.lat + ' lng: ' + e.latlng.lng);
  console.log(e.latlng);
});
于 2016-02-18T12:38:35.050 に答える