Answers:
如果您正在设计地图,则计划将其覆盖在Google地图或虚拟地球上并创建切片方案,那么我认为您正在寻找的是每个缩放级别的比例尺,请使用以下这些比例尺:
20 : 1128.497220
19 : 2256.994440
18 : 4513.988880
17 : 9027.977761
16 : 18055.955520
15 : 36111.911040
14 : 72223.822090
13 : 144447.644200
12 : 288895.288400
11 : 577790.576700
10 : 1155581.153000
9 : 2311162.307000
8 : 4622324.614000
7 : 9244649.227000
6 : 18489298.450000
5 : 36978596.910000
4 : 73957193.820000
3 : 147914387.600000
2 : 295828775.300000
1 : 591657550.500000
来源:http: //webhelp.esri.com/arcgisserver/9.3/java/index.htm#designing_overlay_gm_mve.htm
我发现此回复(由Google员工撰写)可能是最准确的回复:
这将是不准确的,因为带有墨卡托投影的地图(如Google地图)的分辨率取决于纬度。
可以使用以下公式进行计算:
metersPerPx = 156543.03392 * Math.cos(latLng.lat() * Math.PI / 180) / Math.pow(2, zoom)
这是基于地球半径为6378137m的假设。我们使用的值是:)
摘自:https : //groups.google.com/forum/#!topic/google-maps-js-api-v3/hDRO4oHVSeM
顺便说一句-我猜是:
'latLng.lat()' = map.getCenter.lat()
'zoom' = map.getZoom()
为了帮助您理解数学(不是精确的计算,仅用于说明):
假设您的电脑显示器每英寸有100像素(PPI)。这意味着256个像素的长度约为6.5厘米。就是0.065 m。
在缩放级别0上,整个360度的经度在单个图块中可见。您无法在Google Maps中观察到它,因为它会自动移至缩放级别1,但是您可以在OpenStreetMap的地图上看到它(它使用相同的切片方案)。
赤道上的360度赤道等于地球周长40,075.16公里,即40075160 m
分40075160米与0.065米,你就会得到616313361,这是缩放等级为0的规模在赤道上的电脑显示器与100 DPI
另请参阅:http : //wiki.openstreetmap.org/wiki/FAQ#What_is_the_map_scale_for_a_particular_zoom_level_of_the_map.3F
591657550.500000
根据此答案,刻度为0级。但是根据@CaptDragon的说法是1级。我应该考虑从1级开始使用Google Maps进行计算吗?
没那么容易。给定投影,图块像素的大小取决于您感兴趣的区域的纬度。然后,将图块像素大小转换为屏幕像素大小,就取决于屏幕和显示数据的分辨率,屏幕正在使用的dpi。
简单明了的权威正确答案:
591657550.500000 / 2^(level-1)
它为您提供了上表,并输入了缩放级别。
在jsfiddle.net上进行尝试
由于该问题仅适用于Google MAPS,不适用于EARTH,因此OP不在乎3D几何。谷歌地图已经被拉平,因此在这里和在极子中,在自动扶梯中,像素和像素之间的距离总是1像素(以DEGREES,这是谷歌地图所关心的)。
顺便说一句,您是否意识到世界地图的第一像素行内的某个地方的比例是1:1?
Microsoft的Virtal Earth Tile System文档中有这样一个表。但是正如GuillaumeC所说,这些值取决于纬度和屏幕分辨率。该表给出了在赤道和屏幕分辨率为96 dpi时测得的值。
PS:不确定,但是与Google的缩放级别相比,Microsoft的缩放级别可能会移动1。但是,它们肯定会使用相同的投影,因此这些值对于Google仍然正确。
半径@赤道精确6,378,137米(WGS-84)
赤道周长= 40,075,017米(2πr)
缩放级别24在圆周上使用2到32的幂(4,294,967,296)像素。
赤道周长/ 2 32 = .009330692米/像素
纬度单位=(纬度余弦)X(赤道单位)
缩放级别使每个增量加倍。
1英尺(国际)= 0.3048米
编辑
好吧,这并不是一个真正合理的问题。缩放比例是相对于打印文档而不是计算机屏幕而言的。要使这些图像以任何精度使用,您需要知道每个像素的尺寸,然后根据叠加的图像缩放图像。
因此,回到15-20年前,有人将WGS-84作为基础数据。(请注意,在上一篇文章中,有人使用了40,075,160的值,我在Wikipedia上看到过一些地方,但这是不正确的。正确的值是40,075,017
然后,他们将其除以完整的32位整数。这是一个合理的选择,因为它可以产生大约1厘米的全局精度,这对于航空影像来说已经足够了。32位整数也可以有效地存储和处理。
为什么选择24级,但我不知道,但是这里的其他人得出0会使您下降到一个256像素平铺的地球。
现在给出一个如何使用以上数据的示例。可以说我有一个缩放级别为20的图像(按当前允许的缩放比例进行缩放)取0.009330692(赤道的缩放比例为24),将其加倍以进行缩放23,再次进行缩放22,再次进行缩放21,最后一次进行缩放20您现在应该有0.149231071。
现在假设我们的图像位于纬度45。取那个的余弦(0.707106781)乘以我们的0.149231071,它将得到0.105564729米。这是缩放级别20时纬度为45的图像中一个像素的长度和高度。如果屏幕捕获该区域的1000 x 1000像素图像,则尺寸为105.56米见方。如果你想用脚除那0.3048
至于消息来源,我大约5年前从网络上找到了包括Google和MS映射支持站点在内的各种信息和文档,这实际上是一位逆向工程师。
我已经用了这百次时间,并将其与实际的田野调查数据叠加在一起,并且它始终是正确的。将其与此处发布的表中的任何一个进行检查,数字将匹配。
进行了一些计算,得出以下结果:
Google地图显示一个1公里的标尺(在地图的左下方),该标尺的长度为90像素,缩放级别为13。这意味着:
假设屏幕分辨率为96 dpi或36 dpcm,则在缩放级别13下,我们在1cm处有0.4km(从36/90开始),对于96dpi屏幕,其地图比例为1:40,000。
对于屏幕上的各种操作,最好以90像素为基础,因为所有数字在所有缩放级别上都是舍入的,即
等等。
请注意,这是一个近似值,应该在较小的比例而不是较大的比例上或多或少地起作用。
(Google最终喜欢舍入数字...)
根据提供的所有信息,我构建了一个函数,当您想要一条代表显示的地图的N%的水平线时,可以将最佳的z应用于地图。
显示的地图以其自己的像素宽度为特征。
function calculateZoom(WidthPixel,Ratio,Lat,Length){
// from a segment Length (km),
// with size ratio of the segment expected on a map (70%),
// with a map WidthPixel width in pixels (100px),
// and a latitude (45°) we can get the best Zoom
// assume earth is a perfect ball with radius : 6,378,137m and
// circumference at the equator = 40,075,016.7 m
// The full world on google map is available in tiles of 256 px;
// it has a ratio of 156543.03392 (px/m).
// For Z = 0;
// pixel scale at the Lat_level is ( 156543,03392 * cos ( PI * (Lat/180) ))
// The map scale increases at the rate of square root of Z.
//
Length = Length *1000; //Length is in Km
var k = WidthPixel * 156543.03392 * Math.cos(Lat * Math.PI / 180); //k = circumference of the world at the Lat_level, for Z=0
var myZoom = Math.round( Math.log( (Ratio * k)/(Length*100) )/Math.LN2 );
myZoom = myZoom -1; // Z starts from 0 instead of 1
//console.log("calculateZoom: width "+WidthPixel+" Ratio "+Ratio+" Lat "+Lat+" length "+Length+" (m) calculated zoom "+ myZoom);
// not used but it could be useful for some: Part of the world size at the Lat
MapDim = k /Math.pow(2,myZoom);
//console.log("calculateZoom: size of the map at the Lat: "+MapDim + " meters.");
//console.log("calculateZoom: world circumference at the Lat: " +k+ " meters.");
return(myZoom);
}
我还不能添加评论,但这是Pete上面回复的可能来源:https : //developers.google.com/maps/documentation/javascript/maptypes#MapCoordinates
请注意,在x和y方向上,每个增加的缩放级别都是原来的两倍。因此,每个更高的缩放级别包含的分辨率是前一个级别的四倍。例如,在缩放级别1,地图由4个256x256像素的图块组成,因此像素空间为512x512。在缩放级别19时,可以使用0到256 * 2 19之间的值来引用地图上的每个x和y像素
嗨,我想我已经计算出直线上的1pixel = 11.627km;没有考虑到地球的半径。此处的视频链接说明了如何:https : //www.youtube.com/watch?v=Y3cvTeiMJqE&feature=youtu.be。希望能使您头脑清醒。
Zoom level set meters: ${meters}
); var zoomfactor = 1; if(米<1128){zoomfactor = 15; } if if((meters> 1128)&&(meters <2256)){zoomfactor = 14; } if if((meters> 2256)&&(meters <4513)){zoomfactor = 13; } if if((meters> 4513)&&(meters <9027)){zoomfactor = 12; } if if((meters> 9027)&&(meters <18055)){zoomfactor = 11; } if if((meters> 18055)&&(meters <36111)){zoomfactor = 10; } else if((meters> 36111)&&(meters <72