我想按比例缩放到 ol3 地图(例如 1:50000(。这意味着在现实世界中,每 1 厘米必须显示 50000 厘米。为了将比例转换为分辨率,我使用了如下:
var getResolutionFromScale = function(scale, units) {
var dpi = getDpi();
var mpu = ol.proj.METERS_PER_UNIT[units];
var inchesPerMeter = 39.37;
return parseFloat(scale) / (mpu * inchesPerMeter * dpi);
}
function getDPI()
{
var div = document.createElement("div");
div.style.width="1in";
var body = document.getElementsByTagName("body")[0];
body.appendChild(div);
var dpi = document.defaultView.getComputedStyle(div, null).getPropertyValue('width');
body.removeChild(div);
return parseFloat(dpi);
}
现在为了测试它,我使用 ScaleLine,当 scaleLine 控件显示 1000m 时,它的长度必须是 2 厘米,但它几乎是 2.5 厘米。
问题出在哪里?如何根据比例进行缩放?
在线演示
投影是墨卡托投影,可保留角度但不保留距离。这意味着整个地图上的比例不同:(
要看到它,只需从赤道移动到极点,然后看到比例线长度的增长。
因此,您无法计算全球比例尺,您必须在本地计算(计算地图投影中视图中心的 2 个点与哈尔正弦距离之间的距离以获得比率(。请注意,DPI 取决于您使用的设备(屏幕、打印机(,并且可能彼此不同。
您可以使用geometry.getLength()
和ol.Sphere.getLength()
来计算 2 个距离。 请看 ol 示例:https://openlayers.org/en/latest/examples/measure.html