Como você recebe um ID único para uma camada ou gerar um no ArcMap?
-
13-09-2019 - |
Pergunta
Existe uma maneira em ArcObjects para obter um ID único para uma camada? Se você fizer uma pesquisa por nome da camada poderia haver possíveis duplicatas.
Se não houver uma propriedade é Existe uma maneira de gerar um id? Eu tentei usar o GetHash (), mas isso não ficar consistente.
Solução
Não é bonito, mas no passado eu já anexado um guid na descrição camada. Algo parecido com isto:
<LAYER guid='a9843c88-3caa-4953-ad96-ca9990b410e9' revision='1' />
Eu tenho uma DLL por aí que iria bater esses frags XML em cada camada de um MXD (com suficiente cr / lf em frente para rolar o fragmento xml fora da descrição da camada no diálogo Prop ArcMap Layer).
Há um arquivo de ajuda no arquivo 7z (documentação é escassa, porque eu estou fazendo outras coisas): http://code.google.com/p/umbriel/downloads/list
Outras dicas
Há uma ArcObjects interface presente para definir ou obter um ID para uma camada. Você deve olhar para ILayerDescriptor: ID, http://resources.esri.com/help/9.3/ ArcGISDesktop / ArcObjects / esriCarto / ILayerDescriptor_ID.htm
Aqui está um trecho VBA que mostra como ele pode ser usado:
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
Eu gosto da idéia de usar um GUID. Este pode então ser armazenado na propriedade ModelName que é uma ferramenta para desenvolvedores de objetos personalizados para usar para garantir os nomes de objetos independentes do verdadeiro nome ou apelido nome.
Há mais detalhes e código de exemplo em http://geographika.co.uk/?p = 58
Easy. Um efeito colateral do uso COM e porque como os vtables são definidos, é que você pode usar o endereço de memória da própria camada como o seu identificador exclusivo. Dentro da implementação de muitas código ESRI GeoDatabase e Carto-se, este truque está sendo usado em todo o lugar.