2009-08-12 87 views

回答

1

這並不美觀,但過去我在圖層描述中附加了一個guid。事情是這樣的:

<LAYER guid='a9843c88-3caa-4953-ad96-ca9990b410e9' revision='1' /> 

我有一個DLL左右浮動,將踩住這些XML斷枝到MXD的每一層(與前面足夠的CR/LF滾動XML片段走出層描述的ArcMap Layer Prop對話框)。

有一個在的7z文件幫助文件(文檔是稀疏的,因爲我在做其他事情): http://code.google.com/p/umbriel/downloads/list

+0

我想我可以運行程序,增加了這對每一層第一開始我的工具時。 您可能會想,在所有這些年後,ESRI會添加這個簡單的屬性或者至少限制重複的名稱。 感謝 – 2009-08-13 20:47:39

+1

柯克Kuykendall做出添加屬性集,以ILayerExtensions和它保持與該層的提...甚至與圖層保存到圖層文件: http://bit.ly/38PAK – 2009-08-14 12:24:25

2

有一個ArcObjects的接口禮物設置或獲取一個ID爲一個層。 你應該看看ILayerDescriptor:ID, http://resources.esri.com/help/9.3/ArcGISDesktop/ArcObjects/esriCarto/ILayerDescriptor_ID.htm

這裏是一個VBA代碼片段,顯示它如何被使用:

Public Sub layerInfo() 

Dim app As IApplication ' 
Set app = Application 

Dim mxDoc As IMxDocument 
Set mxDoc = app.Document 

Dim myMap As IMap 
Set myMap = mxDoc.ActiveView 

Dim mapServer As IMxdServer 
Set mapServer = New MxdServer 

'''Point to your .mxd... 
mapServer.Start ("D:\Test.mxd") 

Dim myArray As IArray 
Set myArray = mapServer.LayerDescriptors(myMap.Name) 

MsgBox myArray.Count 

Dim x As ILayerDescriptor 
Dim intX As Integer 
intX = 0 

For intX = 0 To myArray.Count - 1 
Set x = myArray.Element(intX) 
MsgBox x.ID 
MsgBox x.Name 
Next 

End Sub 
+0

我已經以前從未使用過ILayerDescriptor。我只是嘗試了你的代碼 - 它沒有提供打開後添加的圖層的ID(需要事先保存mxd)。有沒有辦法讓LayerDescriptors無需啓動MXD? – 2009-08-14 12:22:31

+0

同樣的問題在這裏。 – 2009-08-14 19:15:38

+0

是的,你是對的。該接口基本上用於從ArcGIS Server提供的MXD。當MXD被保存並被讀取時,也可以使用它們。但是,正如你發現的那樣,在使用這個地圖文件之前,需要保存地圖文件。 – 2009-08-17 10:32:10

0

容易。使用COM的副作用以及vtables的佈局方式是,您可以使用圖層本身的內存地址作爲您的唯一標識符。在許多ESRI GeoDatabase和Carto代碼本身的實現中,這個技巧正在被廣泛使用。

+0

你如何獲得內存地址?此地址在mxd中工作時是否也會更改或保存? – 2009-08-19 01:08:13

+0

取決於語言。在C++中,接口*指針*本身就是一個指針,使用它。在VB6(或VBA)中也是如此。 換句話說: 暗淡播放器作爲ILAYER 組玩家= pMap.Layers(0) 使用播放器作爲在收集/字典的關鍵。 不,在COM對象的生命週期中它不會改變(當它們仍然在同一個MxD中工作時)。如果他們保存*,並繼續他們的會話*將保持不變*但是,如果關閉文檔並再次打開它,則會有所不同。 – rburhum 2009-08-31 21:58:57

1

我喜歡使用GUID的想法。這可以存儲在ModelName屬性中,該屬性是自定義對象開發人員使用的工具,用於保證獨立於真實姓名或別名的對象名稱。

有更多的細節和示例代碼在http://geographika.co.uk/?p=58