MO開發小技巧(一)
本人用VB+MO開發近兩年,中間積累了一些小經驗,對老手可能沒用,但對新手可能有一點幫助。下面把它記下來,也算是一個小小的總結。很多東西沒想起來,下次更新時補上。 大部分內容只是概述了實現的思路,具體實現的方法,有心者自己領會吧~,不對之處,請指教。
一、出圖線寬的問題。
問題描述:MO出圖一般使用Output2方法。但該方法有一個問題就是出圖后線寬特別細,這是由于打印機分辨率比屏幕分辨高得多的緣故。為了得與屏幕顯示相同地線寬,必須在打印前對顯示符號(Symbol)對象作相應的調整,執行完畢后再調整回來。
出圖代碼如下:
Dim dblScale As Double
dblScale = GetDeviceCaps(Printer.hdc, 88) / GetDeviceCaps(Me.hdc, 88) '即打印機分辨率/屏幕分辨率
ResetLnSize dblScale
On Error GoTo errh
'此處執行打印操作,mpprinter是本人組織開發的專門用于打印出圖的控件
mpPrinter.DoPrint()
ResetLnSize 1 / dblScale
'下面是用于縮放線寬的函數
Private Sub ResetLnSize(dblScale As Double)
Dim i As Integer
Dim obj As Object
Dim ly As MapLayer
For i = 0 To Map1.Layers.Count - 1
Set obj = Map1.Layers(i)
If TypeOf obj Is MapObjects2.MapLayer Then
Set ly = obj
If ly.ShapeType <> moShapeTypePoint Then
ly.Symbol.Size = CInt(ly.Symbol.Size * dblScale)
End If
End If
Next
'跟蹤層的Event的線粗也要設置,只要設置跟蹤層所有的symbol就可以了。
Dim Sym As MapObjects2.Symbol
For i = 0 To Map1.TrackingLayer.SymbolCount - 1
Set Sym = Map1.TrackingLayer.Symbol(i)
If Sym.SymbolType <> moPointSymbol Then
Sym.Size = CInt(Sym.Size * dblScale)
End If
Next i
End Sub
二、指北針。最簡單的辦法是使用ESRI公司提供的指北針字體ESRI_North。
三、注記的縮放。顯示注記一般用LabelRenderer來實現,要實現與地圖其它內容一起縮放,只要設置HeightField屬性即可。HeightField即高度字段,是一個數值型字段。
四、關于編輯功能
1、新建線或面時的捕捉問題。用MO新建要素的傳統方法是用TrackLine或TrackPolygon方法。但該方法有一個致命的弱點就是新建過程中不能進行捕捉,這是由于MO對系統消息進行了屏蔽的緣故。為了能夠實現捕捉,只能自己再想辦法實現。最簡單辦法是自己處理MouseDown,MouseMove,MouseUp事件,判斷狀態,然后在TrackLayer中添加或修改一個GeoEvent來實現,這樣就可以在新建要素過程中實現捕捉了。
2、新建線、多邊形點個數太多時的閃爍問題。當點的個數很多時,會閃爍比較厲害。為了避免出現這種情況,可以在新建過程中,將加入的點集人為分為若干個點一組,每一組成為一個獨立的GeoEvent。但這樣處理比較麻煩。
3、編輯回退的問題。首先將編輯進行分類,可以分為節點編輯,新增要素,刪除要素三種。更新要素(如移動)可以歸結為新增一個要素和刪除一個要素,分割(split等)也是如此。然后根據這些類型定義不同的數據結構對其進行保存。保存方式可以保存在內存中,也可以保存為臨時的Shape文件中,建議使用后者,因為保存屬性比較方便,同時不占用內存,理論上可以不限回退步數。
4、歷史版本問題。 要點:第一,需要保存歷史數據的圖層在入庫時要建立一個對應的的歷史圖層,此時歷史圖層與現狀層數據完全一致,作為歷史數據的初始狀態;第二,將所有編輯過程歸結為刪除和新增兩種操作,編輯可以歸結為刪除一個(或幾個)要素,同時新增一個(或幾個)要素。然后在歷史圖層中添加兩個字段:新增時間和刪除時間,現狀的數據的刪除時間可以定義為9999-01-01。 第三要啟用事務編輯,一次編輯過程包含若干個編輯步驟。一次編輯過程可以形成一個版本,也可以歸入上一次編輯所屬的版本中,在編輯結束時應允許選擇。一次編輯過程中的的所有編輯步驟要經過計算處理成兩個列表,及新增要素列表和刪除要素列表,在事務提交時同時寫歷史層。第四、版本的合并,清除等操作均可以歸結為對歷史圖層的新建時間和刪除時間兩個字段的操作。 第五,版本的標識可以建立一個普通table保存,更加人性化。
浙公網安備 33010602011771號