从WMS图层导出PNG遇拉伸问题:OpenLayers如何重计算BBOX?
OpenLayers 调整WMS请求BBOX的核心算法
OpenLayers 修正BBOX的核心逻辑是保证地理范围的宽高比与图片的宽高比严格匹配,从而让每个像素在x、y方向对应的地理分辨率一致,避免图层拉伸。具体步骤如下:
第一步:计算原始请求BBOX的地理尺寸
- 地理宽度:
bboxWidth = bbox[2] - bbox[0](BBOX格式为[minX, minY, maxX, maxY]) - 地理高度:
bboxHeight = bbox[3] - bbox[1]
- 地理宽度:
第二步:计算两个关键比例
- 图片宽高比:
imageRatio = 图片宽度(width) / 图片高度(height) - 原始BBOX的地理宽高比:
bboxRatio = bboxWidth / bboxHeight
- 图片宽高比:
第三步:根据比例对比调整BBOX
- 若
bboxRatio > imageRatio(地理范围过宽):- 保持BBOX的高度不变,计算适配图片比例的新宽度:
newBboxWidth = bboxHeight * imageRatio - 以原始BBOX的中心为基准,收缩左右边界:
newMinX = bbox[0] + (bboxWidth - newBboxWidth) / 2newMaxX = newMinX + newBboxWidth - 上下边界
minY、maxY保持不变
- 保持BBOX的高度不变,计算适配图片比例的新宽度:
- 若
bboxRatio < imageRatio(地理范围过高):- 保持BBOX的宽度不变,计算适配图片比例的新高度:
newBboxHeight = bboxWidth / imageRatio - 以原始BBOX的中心为基准,收缩上下边界:
newMinY = bbox[1] + (bboxHeight - newBboxHeight) / 2newMaxY = newMinY + newBboxHeight - 左右边界
minX、maxX保持不变
- 保持BBOX的宽度不变,计算适配图片比例的新高度:
- 若两个比例完全相等,BBOX无需调整
- 若
简单来说,就是让地理范围的宽高比强制匹配图片的宽高比,且始终保持原始BBOX的中心位置不变,以此保证图层显示无拉伸。
内容的提问来源于stack exchange,提问作者Francesco Mangiacrapa
相关产品推荐
相关产品推荐

