2009-08-12 90 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