正如http://laudontech.com/GISBlog/?p=28所引用的,我知道谷歌地图缩放级别的标尺:
缩放层0 1:20088000.56607700米
变焦1:10044000.28303850米
变焦二级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 :19617.18805281米
变焦级11 :9808.59402640米
变焦级12 :4909.29701320米
变焦级13 :2452.14850660米
变焦电平14 1:1226.07425330米
变焦级15 :613.03712665米
变焦级别16 :306.51856332米
缩放级别17 1:153.25928166米
变焦级18 :76.62964083米
变焦级19 :38.31482042米
我希望使用这些信息创建如下所示的函数:
function getZoomLevel(meters) {
//take input in whole meters
//return best match for zoom level as integer
}
我已经考虑过做嵌套的,如果不是更大/更少的条件,但有没有一个更精简的方法?
发布于 2011-08-26 04:01:52
变焦级别的每一次下降都意味着表的两倍,所以您不必存储每个单独的值。
你可以试试这个:
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;
}
发布于 2011-08-26 03:54:41
如果将缩放级别存储在数组中,例如
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;
}
https://stackoverflow.com/questions/7199790
复制相似问题