該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、針對實際應用系統,針對性地修改