Mais

Rotulando pontos com números e adicionando rótulo de texto à legenda como lista no ArcMap?

Rotulando pontos com números e adicionando rótulo de texto à legenda como lista no ArcMap?


Estou desenvolvendo uma série de mapas no ArcGIS 10 e não tenho muito espaço para rotular as feições no mapa. É por isso que pensei em numerar cada recurso no dataframe e, em seguida, exportar os rótulos como uma lista e colocá-los na legenda do mapa.

Portanto, uma lista da seguinte maneira é criada e adicionada à legenda

Rótulo SO 1 Rótulo 2 Rótulo 3 Rótulo

Meu fluxo de trabalho atual para fazer isso é o seguinte: Estou adicionando um atributo 'número' manualmente, por exemplo, para todos os pontos SO laranja e, a seguir, os identifico com o número. Em seguida, exporto-o como uma tabela no Excel e, em seguida, no Illustrator para gerar uma tabela de boa aparência e copio-a de volta para o ArcMap como uma imagem.

Existe uma maneira mais fácil de fazer isso no ArcGIS, eu tenho muitos mapas para fazer e fazer isso manualmente leva muito tempo? Você pode pensar em uma solução melhor para fazer isso?


Existem 2 scripts em funcionamento.

Primeiro cria anexo - arquivo de texto - no polígono de páginas orientadas a dados armazenado em FGDB, nome em TOC = Pages.

Os dados originados na tabela de anexos da camada chamada 'pnts' devem ter a consulta de definição de página ativa. Para controlar a aparência da tabela futura, você precisará de um elemento de texto em seu layout chamado TABLE. Isso é o que a ferramenta espera como parâmetros:

Os valores na lista de campos são nomes de campos de 'pnts' que você deseja mostrar:

Sim, você deve alterar a lista para atender às suas necessidades.

O script itera através das páginas e faz:

  • Remover anexo existente
  • Crie anexos de valores retirados da tabela pnts no DDP atual.

    (Eu geralmente crio um pequeno buffer em torno das páginas, cruzo-o com pnts. Isso cria 2 pnts onde os buffers se sobrepõem)

Eu uso a fonte Calibri Light para o texto da TABELA.

Roteiro:

import arcpy, traceback, os, sys, numpy from arcpy import env.overwriteoutput = True folder = arcpy.GetParameterAsText (0) allNames = arcpy.GetParameterAsText (1) fldNames = allNames.split (';') table = r'in_memory  attach '#Reference MXD e camadas try: def showPyMessage (): arcpy.AddMessage (str (time.ctime ()) + "-" + mensagem) def isLayerExist (mxd, lName): layers = arcpy.mapping.ListLayers ( mxd, lNome) se len (camadas) == 0: aumentar NameError, ' n' + lNome + "camada não encontrada. Saindo…" + ' n' resultado = camadas [0] retornar resultado mxd = arcpy.mapping. MapDocument ("CURRENT") thePagesLayer = isLayerExist (mxd, "Pages") thePointsLayer = isLayerExist (mxd, "pnts") ddp = mxd.dataDrivenPages fld = ddp.pageNameField.name Page_Name para elm em arcpy.mapping.ListLayoutElements (mxd): if elm.name == "TABLE": tableTxt = elm x = elm.elementPositionX y = elm.elementPositionY ## THING TO CHANGE !!!!! formatS = "{: 5d} {: 8.2f} {: 8.2f} {: 8.2f} {: 8.2f} {: 8.2f} {: 8.2f} {: 8.2f}" para pageID no intervalo (1, ddp.pageCount + 1): arcpy.AddMessage (pageID) ddp.currentPageID = pageID arcpy.RefreshActiveView () fOut = pasta + os.sep + Page_Names [pageID-1] [0] + ". txt" arcpy.SelectLayerByAttribute_management (thePoLayer ) linkValue = Page_Names [pageID-1] [0] attachName = Page_Names [pageID-1] [0] + ". txt" arcpy.CreateTable_management ('in_memory', 'attach') arcpy.AddField_management (tabela, "Página", "TEXT", "", "", 25) arcpy.AddField_management (table, "Page2", "TEXT", "", "", 250) curT = arcpy.da.InsertCursor (table, ("Page", " Página2 ")) theRow = (linkValue, fOut) curT.insertRow (theRow) arcpy.RemoveAttachments_management (thePagesLayer, fld, table," Page ") tbl = arcpy.da.TableToNumPyArray (thePointsLayer, fldpyArray) tbl = num ) se len (tbl)> 0: m = 0 para rec em tbl: ## THING TO CHANGE !!!!! bit = formatS.format (rec [0], rec [1], rec [2], rec [4], rec [6], rec [3], rec [5], rec [7]) textB + = bit + '  n 'm + = 1 se m> 54: quebrar tableTxt.text = textB arcpy.SelectLayerByAttribute_management (thePointsLayer, "CLEAR_SELECTION") tableTxt.elementPositionX = x tableTxt.elementPositionY = y arcpy.RefreshActiveView () fileO = open () ') fileO.write (textB) fileO.close () arcpy.AddAttachments_management (thePagesLayer, fld, tabela, "Página", "Página2") arcpy.Delete_management (fOut) exceto: mensagem = " n *** ERROS DE PYTHON * ** "; showPyMessage () message = "Python Traceback Info:" + traceback.format_tb (sys.exc_info () [2]) [0]; showPyMessage () message = "Python Error Info:" + str (sys.exc_type) + ":" + str (sys.exc_value) + " n"; showPyMessage ()

Exemplo de saída que estou usando para controlar a aparência das impressões:

Observe que a parte cinza é um elemento separado aqui. Você também deve alterar a linha de formato de texto no script acima.

O segundo script imprime (exporta para pdf, usando o nome DDP), assume o nome da camada DDP = Pages (aquele com attachmet) e há um elemento de texto chamado TABLE no layout

import arcpy, traceback, os, sys from arcpy import env.overwriteoutput = True folder = arcpy.GetParameterAsText (0) aTable = arcpy.GetParameterAsText (1) #Reference MXD e camadas try: def showPyMessage (): arcpy.AddMessage (str (time.ctime ()) + "-" + mensagem) def isLayerExist (mxd, lNome): camadas = arcpy.mapping.ListLayers (mxd, lNome) se len (camadas) == 0: aumentar NameError, ' n' + lNome + "camada não encontrada. Saindo…" + ' n' resultado = camadas [0] retornar resultado mxd = arcpy.mapping.MapDocument ("CURRENT") thePagesLayer = isLayerExist (mxd, "Pages") ddp = mxd. dataDrivenPages fld = ddp.pageNameField.name dict = {} both = arcpy.da.TableToNumPyArray (thePagesLayer, (fld, "OBJECTID")) para a linha em ambos: dict [linha [0]] = linha [1] Page_Names = [ linha [0] para linha em ambos] del both #Reference page layout elements for elm in arcpy.mapping.ListLayoutElements (mxd): if elm.name == "TABLE": tableTxt = elm x = elm.elementPositionX y = elm. elementPositionY para pageID no intervalo (1, ddp.pageCount + 1): ## para pageID no intervalo (1,3): ddp.currentPageID = pageID baseName = Page_Names [pageID-1] OID = dicção [baseName] query = "REL_OBJECTID =% s"% str (int (OID)) com arcpy.da.SearchCursor (aTable, 'DATA', query) como cursor: para linha no cursor: binaryRep = linha [0] textB = binaryRep.tobytes () if len (textB)> 0: tableTxt.text = textB else: tableTxt.text = "" tableTxt.elementPositionY = y arcpy.RefreshActiveView () ddp .exportToPDF (pasta + os.sep + baseName + ".pdf", "CURRENT") arcpy.AddMessage ('Exportado% i% s'% (pageID, baseName)) exceto: mensagem = " n *** ERROS DE PYTHON *** "; showPyMessage () message = "Python Traceback Info:" + traceback.format_tb (sys.exc_info () [2]) [0]; showPyMessage () message = "Python Error Info:" + str (sys.exc_type) + ":" + str (sys.exc_value) + " n"; showPyMessage ()

No exemplo acima, os pontos são rotulados por SectionID e a tabela fornece uma referência perfeita.

Este casal me economizou semanas de tempo ...

Estou usando 2 scripts porque a formatação é uma parte difícil, então eu executo o primeiro script com apenas 2 camadas - pontos e páginas em um mxd muito básico. O segundo funciona bem e eu o executo no mapa com várias camadas, simbologia classificada etc.

Este é um canto superior direito de uma das páginas de saída:


Aqui estão as etapas para obter um número-chave próximo à sua etiqueta em uma legenda dinâmica.

Você simboliza como quiser no mapa principal e, em seguida, copia a camada para fazer uma camada fictícia para a legenda, onde não há simbolização, mas todos os recursos são listados por nome ou qualquer campo que desejar. Veja abaixo, a camada simbolizada na camada inferior e a camada superior não tem simbolização, mas todos os valores de nome adicionados.

Clique duas vezes na camada de legenda, a camada de POI superior e adicione uma descrição a cada valor. Guia Simbologia> Clique com o botão direito em Valor ou Rótulo> Editar Descrição e digite o número. Esta é uma parte muito manual, mas se você tiver uma camada para toda a série de mapas, valerá a pena. Se você tiver muitas camadas para este procedimento, pode ser necessário examinar uma das outras soluções listadas.

Adicione legenda e inclua apenas a camada de legenda. Clique com o botão direito em Legenda> Propriedades> guia Itens> clique na camada de legenda> Estilo e escolha aquele destacado aqui.

Em seguida, clique em Propriedades para ajustar a configuração da Descrição da etiqueta como desejar. Para obter o que é mostrado na minha imagem final abaixo, use essas configurações.

De volta à guia Itens de Fonte, escolha Aplicar à Descrição da Classe, coloque em negrito e justificado à direita.

Para limitar a legenda ao que está em cada mapa, certifique-se de marcar "Mostrar apenas classes que são visíveis na extensão do mapa atual".

Espero que isso faça sentido.


Assista o vídeo: Tutorial ArcGIS - Rótulos de diferentes estilos agrupado pela simbologia - Label group by symbol