Как получить уникальный идентификатор слоя или сгенерировать его в Arcmap?

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

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


person Donny V.    schedule 12.08.2009    source источник


Ответы (4)


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

<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

person Community    schedule 13.08.2009
comment
Думаю, я могу запустить процедуру, которая добавляет это к каждому слою при первом запуске моего инструмента. Можно подумать, что спустя столько лет ESRI добавит это простое свойство или, по крайней мере, ограничит повторяющиеся имена. Спасибо - person Donny V.; 14.08.2009
comment
Кирк Куйкендалл упомянул о добавлении набора свойств в ILayerExtensions и о том, что он остается со слоем... даже если слой сохраняется в файле слоя: bit.ly/38PAK - person ; 14.08.2009

Существует интерфейс 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
person Devdatta Tengshe    schedule 14.08.2009
comment
Я никогда раньше не использовал ILayerDescriptor. Я только что попробовал ваш код - он не предоставляет идентификаторы для слоев, которые добавляются после открытия (необходимо предварительное сохранение mxd). Есть ли способ получить LayerDescriptors без запуска MXD? - person ; 14.08.2009
comment
Да, ты прав. Этот интерфейс в основном предназначен для MXD, которые обслуживаются с сервера ArcGIS. Их также можно использовать при сохранении и чтении MXD. Однако, как вы уже выяснили, документ карты необходимо сохранить, прежде чем его можно будет использовать. - person Devdatta Tengshe; 17.08.2009

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

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

person geographika    schedule 26.09.2009

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

person rburhum    schedule 18.08.2009
comment
Как узнать адрес памяти? Также этот адрес меняется при работе в mxd или сохраняется? - person Donny V.; 19.08.2009
comment
Зависит от языка. В C++ сам интерфейс pointer является указателем, используйте его. В VB6 (или VBA) то же самое. Другими словами: dim pLayer as ILayer set pLayer = pMap.Layers(0) используйте pLayer в качестве ключа в вашей коллекции/словаре. Нет, он не изменится во время жизни COM-объекта (пока они работают в том же MxD). Если они сохранят, и продолжат свой сеанс, он останется прежним... однако, если закрыть документ и открыть его снова, он будет другим. - person rburhum; 01.09.2009