Расположение мыши и карты Openlayers (ol5) на позициях ~ -5 км к северу, ~ -3 км к востоку - PullRequest
0 голосов
/ 29 марта 2020

Я пытаюсь портировать сайт Openlayers2 на OL5. Реализация OL2 работала отлично в течение многих лет и не имеет проблем, описанных здесь.

У меня работает большинство вещей, но я озадачен следующим: отображаемая позиция мыши и события map.on все позиции отчета примерно в 5 км к югу и в 3 км к западу от истинного положения на карте.

Все карты являются сетками TMS в EPSG: 2193. Я разрешаю отображение координат наложения в проекциях диапазона - включая сетку NZ-метра NZTM2000 (EPSG: 2193) и широту / долготу WGS (EPSG: 4326). Но все координаты находятся примерно на 5 км / 3 км или их градусном эквиваленте в любой проекции, которую я использую. Величина ошибки остается постоянной для всех уровней масштабирования и для всей 2000 км / 3000 км области карты.

Соответствующие биты кода приведены ниже. Кто-нибудь видел что-нибудь подобное или получил какие-либо предложения о том, где можно попытаться найти / устранить ошибки? Это поставило меня в тупик.

proj4.defs('EPSG:2193', '+proj=tmerc +lat_0=0 +lon_0=173 +k=0.9996 +x_0=1600000 +y_0=10000000 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs');
ol.proj.proj4.register(proj4);

var view = new ol.View({
                         center: [1600000, 5500000],
                         zoom: 2,
                         projection: ol.proj.get('EPSG:2193'),
                         maxResolution: 4891.969809375,
                         numZoomLevels: 11
            });
            mpc= new ol.control.MousePosition({
                 coordinateFormat: createStringXY(current_projdp),
                 projection: ol.proj.get('EPSG:'+current_proj)
            });
            topo50_2009=new TileLayer({
                source: new XYZ({
                  projection: ol.proj.get('EPSG:2193'),
                  url: 'http://au.mapspast.org.nz/topo50/{z}/{x}/{-y}.png',
                  maxResolution: 4891.969809375,
                  numZoomLevels: 11
                }),
                name: 'NZTM Topo 2009',
                visible: true,
                projection: ol.proj.get('EPSG:2193'),
                maxResolution: 4891.969809375,
                numZoomLevels: 11

              });

      map_map = new Map({
        view: view,
        target: 'map',
        layers: [topo50_2009],
        controls: defaultControls().extend([  mpc ]),
      });

==

Относительно HTML - на этой стадии нет ничего, кроме карты.

  <body>
    <div id="map" class="map"></div>
    <script> init_map(); </script>
  </body>

1 Ответ

0 голосов
/ 29 марта 2020

Спасибо, Майк. Если бы это был ответ, а не комментарий, то я бы пометил его как решение.

Ни одно из значений, необходимых для tilegrid, не было указано в приложении openlayers2, поэтому я полагаю, что он использовал значения по умолчанию, которые были правильными для всех слоев EPSG2193 TMS, которые у меня есть. И этот ol5 использовал разные значения по умолчанию. Я покопался в веб-приложении openlayers2, используя отладчик, и обнаружил, к каким значениям по умолчанию они пришли. Применение их к тайлу сетки ol5 (как показано ниже) решило проблему. Координаты теперь правильные.

var origin=[-20037508, 20037508];
var resolutions=[156543.0339,
                            78271.51695,
                            39135.758475,
                            19567.8792375,
                            9783.93961875,
                            4891.969809375,
                            2445.9849046875,
                            1222.99245234375,
                            611.496226171875,
                            305.7481130859375,
                            152.87405654296876,
                            76.43702827148438,
                            38.21851413574219,
                            19.109257067871095,
                            9.554628533935547,
                            4.777314266967774];
var extent=[-20037508, -20037508, 20037508, 20037508];
var tilegrid=new ol.tilegrid.TileGrid({
        origin: origin,
        resolutions: resolutions,
        extent: extent});
topo50_2009=new TileLayer({
    source: new XYZ({
      projection: epsg2193,
      url: 'http://au.mapspast.org.nz/topo50/{z}/{x}/{-y}.png',
      maxResolution: 4891.969809375,
      numZoomLevels: 11,
      tileGrid: tilegrid
    }),
    name: 'NZTM Topo 2009',
    visible: false,
    projection: epsg2193,
    maxResolution: 4891.969809375,
    numZoomLevels: 11
  });
...