在說明之前要先瞭解在MapGuide裡面三個與顯示相關的屬性:
1. Map.DisplayWidth:直翻─顯示寬度
2. Map.DisplayHeight:直翻─顯示高度
3. Map.DisplayDpi:直翻─顯示DPI
有寫過相關轉換的人一定會立刻了解該怎麼做了,但是如果看到這篇,或是自己之後回來看想必是忘記了,這樣的濫翻譯不會讓未來的自己看的懂,所以做一個簡單的測試。
首先要先了解什麼是螢幕解析度跟DPI。如果我們說螢幕為1920*1080,就代表我們的螢幕由寬1920個點、高1080個點所構成,有時候們不會把螢幕調成最高解析度,或許1920*1080的螢幕用1600*900顯示,就代表螢幕會去計算由多個點來顯示一個點的資料,造成有時候調整比例不對,例如1920*1080的用800*600就會明顯看出螢幕糊掉的感覺。
那DPI是什麼勒?原文是dot per inch,意思代表每英吋幾個點,也就是說如果DPI為100,就代表螢幕上100個點的長度就是1英吋(2.54公分),所以當我們知道螢幕解析度與螢幕DPI時,就可以利用該數據來計算出目前於螢幕上實際的距離為多少。
那麼MapGuide怎麼擷取解析度跟DPI?首先先看一下目前的螢幕解析度為:1920*1080
擷取螢幕解析度的語法:DisplayWidth與DisplayHeight,直接看跑出來的數值:
我們逐步將視窗放大,可以看到從第一張到第三張,數值都隨著我們所期望的不斷增大,若是去詳細計算所呈現的數值,會發現DisplayWidth與DisplayHeight就是地圖視窗的解析度,但到了第四張,會發現雖然我們退回第二張的視窗大小,寬度有正常抓取到正確資料,高度卻依然停留在第三張的高度,爾後繼續變換高度與寬度都會發現,寬度皆會呈現正確數值,但高度卻始終停留在最高數值,若是重新整理視窗會發現高度還是會正常變大,但由大視窗縮小後依舊停留在曾經視窗的最大值,感覺上這是MapGuide的Map框架在計算比例上的錯誤,又或許是為了某種原因特別的設計,所以暫且記住就好,或許2011版就會正常顯示。
獲取解析度以後,我們就可以配合Map.DisplayDpi這個指令獲得目前螢幕設定的DPI值,或許有些人沒有調整過螢幕DPI,所以截圖讓大家看一下位置:
(一般若是覺得字體太小,希望在同一個解析度下讓字體變大,就可以透過這邊的調整來改善。)
有了解析度與DPI以後就可以計算螢幕上實際的距離,也就是解析度/DPI,然後再換算成想要的單位,因為要計算比例尺所以一般我們都會換算成公尺,所以程式碼就是:
public double GetMapWidth_FromMonitor()
{
return Map.DisplayWidth / Map.DisplayDpi * 2.54 / 100;
}
public double GetMapHight_FromMonitor()
{
return Map.DisplayHeight / Map.DisplayDpi * 2.54 / 100;
}
如此就可以獲得螢幕上寬度與高度的真實數值。所以接下來就會有兩個方向可以使用:
1. 在定位上,已經有要定位的座標值,進而計算要定位的比例尺。
2. 在列印上,已經有要輸出的比例尺大小,進而計算要顯示的地圖範圍。
這些說起來很基本,但是換算錯的時候也是很惱人的。
沒有留言:
張貼留言