2010年7月12日 星期一

MapGuide_列印導讀_螢幕解析度VS實際長度

在開發地理資訊系統時,常常會遇到一個問題,怎麼計算出一個正確的比例尺,輸出到圖紙上的時候是否還是原本輸出的比例尺?使用者使用不同規格的螢幕是否會影響到相關的比例計算?地圖定位如果不想被定位的地區直接佔滿整個畫面,希望可以看到部分旁邊的景物,這時候的比例尺要怎麼計算?諸如此類的問題,最先都是要先了解螢幕解析度跟實際長度變換的計算方式,充分瞭解轉換方式,就可以隨心所欲的取得或給予正確的比例值。

在說明之前要先瞭解在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. 在列印上,已經有要輸出的比例尺大小,進而計算要顯示的地圖範圍。

這些說起來很基本,但是換算錯的時候也是很惱人的。

沒有留言:

張貼留言