Bug:比例尺(ScaleLine)在Openlayers v4.6.5中計算錯誤

該bug,官方已經在後續版本修正,故只針對OL 4.6+。在此自做記錄。

場景:

1、引用Openlayers v4.6.5的js文件
2、view的座標系採用EPSG:4326
3、比例尺的單位爲米(metric)

原因分析:

在源碼scaleline.js中,

......
ol.control.ScaleLine.prototype.updateElement_ = function() {
  ......

  var center = viewState.center;
  var projection = viewState.projection;
  var units = this.getUnits();
  var pointResolutionUnits = units == ol.control.ScaleLineUnits.DEGREES ?
    ol.proj.Units.DEGREES :
    ol.proj.Units.METERS;
  var pontResolution =
      ol.proj.getPointResolution(projection, viewState.resolution, center, pointResolutionUnits);
  if (units != ol.control.ScaleLineUnits.DEGREES) {
    pointResolution *= projection.getMetersPerUnit();
  }

......
};

ol.control.ScaleLine.Property_ = {
  UNITS: 'units'
};

問題就出在這裏:

//step1:
var pontResolution =
      ol.proj.getPointResolution(projection, viewState.resolution, center, pointResolutionUnits);
//step2:
if (units != ol.control.ScaleLineUnits.DEGREES) {
    pointResolution *= projection.getMetersPerUnit();
 }

當比例尺單位不爲度(degrees)時,會乘以 projection.getMetersPerUnit()的值,因此在視圖爲EPSG:4326等經緯度座標系的情況下,pointResolution的計算錯誤。

解決:

1、官方IssuesOL 5.0.0 - ScaleLine slightly incorrect for EPSG:4326 with non-degree display units
2、更換版本
3、借鑑其他版本,修改本版本源碼
4、針對實際應用系統,針對性地修改

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章