2009-08-12 10 views
1

Есть ли способ в arcobjects получить уникальный идентификатор для слоя? Если вы выполняете поиск по имени слоя, возможны дубликаты.Как вы получаете уникальный идентификатор слоя или генерируете его в Arcmap?

Если нет свойства, существует способ создания идентификатора? Я попытался использовать GetHash(), но это не оставалось неизменным.

ответ

1

Это некрасиво, но в прошлом я добавил указатель в описании слоя. Что-то вроде этого:

<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 добавит это простое свойство или, по крайней мере, ограничит дубликаты имен. Благодаря –

+1

Кирк Kuykendall упомянул о добавлении PropertySet к ILayerExtensions и что он остается со слоем ... даже слой сохраняется в файле слоя: http://bit.ly/38PAK – 2009-08-14 12:24:25

2

Существует присутствующий ArcObjects интерфейс для установки или получения идентификатора для слоя. Вы должны смотреть на 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. Я просто пробовал ваш код - он не предоставляет идентификаторы для слоев, которые добавляются после открытия (требуется предварительный переход mxd). Есть ли способ получить LayerDescriptors без необходимости запуска MXD? – 2009-08-14 12:22:31

+0

Тот же вопрос здесь. –

+0

Да, вы правы. Этот интерфейс в основном предназначен для MXD, которые обслуживаются с ArcGIS Server. Они также могут использоваться, когда MXD сохраняется и считывается. Однако, как вы выяснили, необходимо сохранить документ карты, прежде чем это можно будет использовать. –

0

Easy. Побочным эффектом использования COM и потому, что выкладываются vtables, является то, что вы можете использовать адрес памяти самого слоя в качестве своего уникального идентификатора. Внутри реализации многих ESRI GeoDatabase и самого Carto-кода этот трюк используется повсеместно.

+0

Как вы получаете адрес памяти? Также меняется ли этот адрес, когда он работает в mxd или сохраняет его? –

+0

Зависит от языка. В C++ интерфейс * указатель * сам по себе является указателем, используйте его. В VB6 (или VBA) то же самое верно. Другими словами: тусклый медиаплеера как ILAYER множества PLAYER = pMap.Layers (0) использования плеера в качестве ключа в вашей коллекции/словаря. Нет, он не изменится во время жизни COM-объекта (пока они все еще работают в одном и том же MxD). Если они сохраняют * и продолжают сеанс *, он останется прежним ... однако, если закрыть документ и снова открыть его, тогда он будет другим. – rburhum

1

Мне нравится идея использования GUID. Затем это можно сохранить в свойстве ModelName , который является инструментом для разработчиков пользовательских объектов, которые будут использоваться для гарантирования имен объектов, не зависящих от имени или имени псевдонима.

Есть более подробная информация и примеры кода на http://geographika.co.uk/?p=58