Scale和Resolution的含义及转换算法
转自http://www.cnblogs.com/hl3292/
(并非有意转,特此说明,请原作者谅解,之前引用过他人文章,但因为后来无故链接404)
分两部分:
第一部分 关于显示器的DPI
最近发现新的笔记本上显示的图形的实际大小并不是指定的大小(例如:想绘制 5cm 宽的矩形,在屏幕上显示的宽度只有3.6cm),仔细查阅了代码没有发现错误,最终发现原来是显示器DPI的问题。
在代码中通过 Graphic.DpiX 或 Graphic.DpiX 得到的DPI始终都是96,不论显示器的尺寸和分辨率怎么样变化。也就是说这个96的DPI不一定是显示器真实的DPI。实际上96是14寸的显示器在1024*768的分辨率的DPI(当17寸的显示器在1024*768的分辨率下实际上的DPI应该比96要小)。
无法获得显示器的真实DPI(或者屏幕的宽和高),也就无法保证显示器显示的准确性。
System.Windows.Forms.Screen 中有静态方法GetBounds(...)可以获得显示器的分辨率,GetWorkingArea(...)方法可以获得显示器的工作区(工作区是显示器的桌面区域,不包括任务栏、停靠窗口和停靠工具栏),但无法得到显示器的宽度和高度或者每点的宽度,也就无法获得当前显示器真实的DPI。期待 .Net 中提供能够获得显示器真实DPI或者显示器大小的函数。
第二部分 地图切片
原文地址:http://gispower.e2.91cdn.com/article/arcgis/ArcServer/2010/67/106711258224E1636AC2442GHJE09.html
当我们在用arcgis server 构建切片时,我们会发现在缓存生成的conf.xml中有这样的片段:
<TileOrigin xsi:type="typens:PointN"><X>-5123200</X><Y>10002100</Y></TileOrigin><TileCols>512</TileCols><TileRows>512</TileRows><DPI>96</DPI><LODInfos xsi:type="typens:ArrayOfLODInfo"><LODInfo xsi:type="typens:LODInfo"><LevelID>0</LevelID><Scale>125000000</Scale><Resolution>33072.982812632297</Resolution></LODInfo><LODInfo xsi:type="typens:LODInfo"><LevelID>1</LevelID><Scale>64000000</Scale><Resolution>16933.367200067736</Resolution></LODInfo></LODInfos>
<LODInfos xsi:type="typens:ArrayOfLODInfo"> <LODInfo xsi:type="typens:LODInfo"> <LevelID>0</LevelID> <Scale>64000000</Scale> <Resolution>0.1522855043731379</Resolution> </LODInfo> <LODInfo xsi:type="typens:LODInfo"> <LevelID>1</LevelID> <Scale>32000000</Scale> <Resolution>0.076142752186568949</Resolution> </LODInfo> </LODInfos>