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、针对实际应用系统,针对性地修改

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值