在http://laudontech.com/GISBlog/?p=28引用,我知道谷歌地图缩放级别的米尺度:
缩放级别0 1:20088000.56607700米
缩放级别1 1:10044000.28303850米
放大等级2 1:5022000.14151925米
放大等级3 1:2511000.07075963米
放大等级4 1:1255500.03537981米
放大等级5 1:627750.01768991米
放大等级6 1:313875.00884495米
放大等级7 1:156937.50442248米
放大等级8 1:78468.75221124米
放大等级9 1:39234.37610562米
放大等级10 1:19617.18805281米
放大等级11 1:9808.59402640米
放大等级12 1:4909.29701320米
放大等级13 1:2452.14850660米
放大等级14 1:1226.07425330米
放大等级15 1:613.03712665米
放大等级16 1:306.51856332米
放大等级17 1:153.25928166米
放大等级18 1:76.62964083米
缩放级别19 1:38.31482042米
我想使用这些信息创建一个类似的函数:
function getZoomLevel(meters) {
//take input in whole meters
//return best match for zoom level as integer
}
我已经考虑过嵌套if else更多/更少条件,但是不是有更简化的方法吗?
答案 0 :(得分:3)
缩放级别的每次降低都意味着将仪表加倍,因此您不必存储每个单独的值。
你可以试试这个:
function getZoomLevel(m){
var z=0;
var i=20088000;
while(i/2>=m && z<19){
z++;
i=i/2;
}
return z;
}
只要米超过当前水平,它就会返回下一个较小的缩放级别。
或更好:
function getZoomLevel(m){
var z=Math.floor((Math.log(20088000/m))/Math.log(2));
if (z>19) z=19;
if (z<0) z=0;
return z;
}
答案 1 :(得分:1)
如果您将缩放级别存储在数组中,例如
var zoomLevels = [
20088000.56607700,
10044000.28303850,
5022000.14151925,
2511000.07075963
// etc. ...
];
然后迭代以获得最佳效果。因为已知缩放级别数组正在减少,所以搜索将为O(n)
。
function getZoomLevel(meters) {
for (var idx = 0; idx < zoomLevels.length; ++idx) {
if (zoomLevels[idx] < meters) {
return idx;
}
}
return zoomLevels.length - 1;
}