Mais

Zoom de um recurso para outro no modo de edição?

Zoom de um recurso para outro no modo de edição?


Tenho que editar manualmente um shapefile de algumas centenas de pontos.

Eu gostaria de uma maneira rápida de pular de um ponto a outro tanto no sentido de atributo quanto no sentido visual / espacial, ou seja, eu gostaria de, enquanto no modo de edição, pular do ID do objeto 1 para o ID do objeto 2 sem ter que abrir a tabela de atributos , selecione o próximo ponto, amplie a seleção, etc.

Uma espécie de botão "Avançar" que agilizaria o processo manual.


A primeira parte é o AddIn, o trabalho real é feito em um formulário:

Herda ESRI.ArcGIS.Desktop.AddIns.Button Privado pForm As fFeatureInspector Public Shared IsFormLoaded As Boolean = False Public Sub New () End Sub Protected Overrides Sub OnClick () 'My.ArcMap.Application.CurrentTool = Nothing If Not IsFormLoaded Then pFormed Novo fFeatureInspector pForm.pApp = CType (My.ArcMap.Application, ESRI.ArcGIS.ArcMapUI.IMxApplication) pForm.Show () Else pForm.sResetList () End If End Sub Protegido Substitui Sub OnUpdate () Enabled = My.ArcMap.Application IsNot Nothing End Sub

Quando você cria um novo addin, a maior parte dele já está lá para você. Em seguida, adicione um formulário ao projeto (nomeie fFeatureInspector ou você precisará alterá-lo algumas vezes no código).

É importante obter os nomes corretos ou você precisará localizar e substituir no código do formulário. A caixa de ferramentas do formulário possui todos os controles comuns: botão, caixa de seleção, caixa de listagem, caixa de combinação.

Como isso funciona, a ferramenta obtém todos os recursos selecionados e editáveis, copia seu nome e OID / FID na caixa de listagem e, em seguida, quando um é destacado, ele o seleciona (após limpar a seleção primeiro) e o amplia. Há um botão salvar e carregar para salvar a inspeção, retroceder e avançar, verificação de salvamento automático e botão de reinicialização. A ferramenta será atualizada quando for carregada, mas depois disso você pode atualizar a qualquer momento. O salvamento automático não é compatível com a edição de shapefiles já que o FID não é estático e é compactado ao salvar.

Os pontos têm uma extensão de largura 0, por isso é importante definir uma escala mínima para algo realista; Zoom% é quanto mais do que um polígono / linha que você deseja ver ao seu redor.

Aqui está o código do formulário (desculpe a falta de comentários):

Importações ESRI.ArcGIS.Framework Importações ESRI.ArcGIS.ArcMapUI Importações ESRI.ArcGIS.Carto Importações ESRI.ArcGIS.Geometry Importações ESRI.ArcGIS.Geodatabase Importações ESRI.ArcGIS.esriSystem Importações públicas ESRI.ArcGIS.Display fFeatureInspector Const FormCaption As String = "Feature Inspector (22 Fev 10)" Const FormName As String = "fFeatureClass" Público pApp As IApplication Privado pDoc As IMxDocument Privado pMap As IMap Dim pEd As IEditor2 Dim pID As UID = Novo UID Dim pFeatFrom () As String Dim pFeatWS As IFeatureWorkspace Dim pWS As IWorkspace Dim pFeatOID () As Long Dim pFeatCnt As Long Dim pInRefresh As Boolean Dim pPointExtent As IEnvelope Dim pSaveEdits As ICommandItem Dim pLoadTime As Long Dim pInRefresh As Data Dim Dim pPointExtent As IEnvelope Dim pSaveEdits As ICommandItem Dim pLoadTime As Long Dim pNow As Date Dim Dim pStartIndex As LongTime As DateTime Private Sub fFeatureInspector_Disposed (ByVal sender As Object, ByVal e As System.EventArgs) Manipula Me.Disposed StartFeatureInspector.IsFormLoaded = False End Sub Private Sub fFea tureInspector_Load (ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load pEd = pApp.FindExtensionByName ("Esri Object Editor") End Sub Private Sub form1_Move (ByVal sender As Object, ByVal e As System.EventArgs) Lida com Me.Move Dim pOutFile como inteiro Dim pTempDir As String = Environ ("Temp") If Me.Visible Then pOutFile = FreeFile () FileOpen (pOutFile, pTempDir & "" & FormName & ".xy", OpenMode.Output) WriteLine (pOutFile, Me.Left & "," & Me.Top) FileClose (pOutFile) End If End Sub Private Sub Form1_Shown (ByVal sender As Object, ByVal e As System.EventArgs) Manipula Me.Shown StartFeatureInspector.IsFormLoaded = True Me .Text = FormCaption pDoc = CType (pApp.Document, IMxDocument) Dim pTempDir As String = Environ ("temp") Dim pInFile As Integer Dim pReadString As String = "" Dim pResyk As String = "" Dim pXpos As Integer = 0 Dim pYpos As Integer = 0 fZoomPercent.Items.Add (110) fZoomPercent.Items.Add (150) fZoomPercent.Items.Add (200) fZoomPercent.Text = "110" fPointScale. Items.Add (200) fPointScale.Items.Add (500) fPointScale.Items.Add (1000) fPointScale.Items.Add (2500) fPointScale.Items.Add (10000) fPointScale.Text = "1000" If My.Computer. FileSystem.FileExists (Environ ("Temp" & "" & FormName & ".xy")) Then pApp.StatusBar.Message (0) = "Posição de carregamento" pInFile = FreeFile () FileOpen (pInFile, pTempDir & "" & FormName & ".xy", OpenMode.Input) pReadString = LineInput (pInFile) pReadString = Mid (pReadString, 2, Len (pReadString) - 2) pApp.StatusBar.Message (0) = pReadString pResyk = Microsoft.VisualBasic.Left (pReadString, InStr (pReadString, ",") - 1) pApp.StatusBar.Message (0) = pResyk pXpos = CInt (pResyk) pApp.StatusBar.Message (0) = "Xposition" & pXpos pResyk = Microsoft.VisualBasic. Right (pReadString, Len (pReadString) - InStr (pReadString, ",")) pApp.StatusBar.Message (0) = pResyk pYpos = CInt (pResyk) pApp.StatusBar.Message (0) = "Yposition" & pYpos FileClose ( pInFile) Me.Left = pXpos Me.Top = pYpos End If sResetList () pID.Value = "{59D2AFD2-9EA2-11D1-9165-0080C71 8DF97} "Dim pComBars As ICommandBars = pApp.Document.CommandBars pSaveEdits = pComBars.Find (pID, False, False) End Sub Privado Sub fSaveButton_Click () Dim pOutfile As Integer Dim cnt As Long pOutfile = FreeFile () FileOut () Environ ("Temp") & "" & "FeatInspect"), OpenMode.Output, OpenAccess.Write) Imprimir (pOutfile, pFeatCnt & vbNewLine) Para cnt = 0 To pFeatCnt - 1 Imprimir (pOutfile, pFeatFrom (cnt) & " | "& pFeatOID (cnt) & vbNewLine) Próximo cnt Imprimir (pOutfile, fFeatureList.SelectedIndex & vbNewLine) Imprimir (pOutfile, fZoomPercent.Text & vbNewLine) Imprimir (pOutfile, fPointScale.ewTextO Subfile privado) fSaveButton_Click (ByVal sender As System.Object, ByVal e As System.EventArgs) Manipula fSaveButton.Click fSaveButton_Click () End Sub Private Sub fLoadButton_Click (ByVal remetente As System.Object, ByVal e As System.EventButton.Click DimArgs) Manipula fLoadButton.Click DimArgs) Long Dim pInFile As Integer Dim pReadString As String Dim pSplitString () As String pInRefresh = True fF eatureList.Items.Clear () pInFile = FreeFile () FileOpen (pInFile, (Environ ("Temp") & "" & "FeatInspect"), OpenMode.Input, OpenAccess.Read) pReadString = LineInput (pInFile) pFeatCnt = pRStreading ReDim pFeatFrom (pFeatCnt) ReDim pFeatOID (pFeatCnt) fFeatureList.Items.Clear () For cnt = 0 Para pFeatCnt - 1 pReadString = LineInput (pInFile) pSplitString = Split (pReadString, "|") pFeat (pFeat) pFeat () pFeatOID (cnt) = pSplitString (1) fFeatureList.Items.Add (pFeatFrom (cnt) & "-" & pFeatOID (cnt)) Próximo cnt pInRefresh = False pReadString = LineInput (pInFile) fFeatureList.SReadingIndex (pInFile) pFeatOID (cnt)) ) fZoomPercent.Text = pReadString pReadString = LineInput (pInFile) fPointScale.Text = pReadString FileClose () pStartIndex = fFeatureList.SelectedIndex pNow = Now () pLoadTime = (Hora (pNow) * 6000) + (Minuto) Second (pNow) End Sub Private Sub fBackButton_Click (ByVal sender As System.Object, ByVal e As System.EventArgs) Manipula fBackButton.Click If fFeatur eList.SelectedIndex = 0 Then MsgBox ("Mas você já está no início!") Exit Sub End If fFeatureList.SelectedIndex = fFeatureList.SelectedIndex - 1 End Sub Private Sub fGoDown_Click (ByVal remetente como System.Object, ByVal e As System .EventArgs) Manipula fGoDown.Click If fFeatureList.SelectedIndex = fFeatureList.Items.Count - 1 Then MsgBox ("Isso é tudo que existe, não existe mais.") Sair Sub End If fFeatureList.SelectedIndex = fFeatureList.SelectedIndex + 1 Sub Private Sub bReset_Click (ByVal sender As System.Object, ByVal e As System.EventArgs) Manipula bReset.Click pInRefresh = True sResetList () pInRefresh = False fFeatureList_Change () pLoadTime = (Hora (pNow) * 3600) + (Minuto (pNow) * 3600) + (Minuto (pNow) ) * 60) + Second (pNow) End Sub Public Sub sResetList () Dim pEnumFeat As IEnumFeature Dim pFeature As IFeature Dim pFeatClass As IFeatureClass If pEd.EditState = esriEditState.esriStateNotEditing Then Sair Sub pEnumFeature pEdEditarEditar.EditarPEnumFeat = pEdEditar. pFeature é Nothing Then MsgBox ("Nothing s eleito ", vbCritical) Sair Sub End If pFeatCnt = pEd.SelectionCount - 1 ReDim pFeatFrom (pFeatCnt) ReDim pFeatOID (pFeatCnt) pFeatCnt = 0 fFeatureList.Items.Clear () Faça até que pFeatFrom seja pFeatCnt (pFeatCnt) pFeatFeatClass = pFeatCnt) pFeatCnt = 0 fFeatureList.Items.Clear. = pFeatClass.AliasName pFeatOID (pFeatCnt) = pFeature.OID fFeatureList.Items.Add (pFeatFrom (pFeatCnt) & "-" & pFeatOID (pFeatCnt)) pFeatCnt = pFeatCnt. fFeatureList.SelectedIndex = 0 pNow = Now () pLoadTime = (Hour (pNow) * 3600) + (Minute (pNow) * 60) + Second (pNow) End Sub Private Sub fFeatureList_SelectedIndexChanged (ByVal remetente como System.Object, ByVal e As System.EventArgs) Handles fFeatureList.SelectedIndexChanged fFeatureList_Change () End Sub Private Sub fFeatureList_Change () Dim pFeatClass Como IFeatureClass Dim pFeature Como iFeature Dim pSelection Como ISelection Dim jogador como ilayer Dim pEnumLayer Como IEnumLayer Dim pEditLayers Como IEditLayers Dim pFeatLayer Como IFeatureLayer Dim pENV Como IEnvel ope2 Dim pDispTran As IDisplayTransformation Dim pThisTime As Long Dim pAvVis As Single Dim pTotTime As Long Dim pDeltaVis As Long Dim pLeft As Long Dim pTPF As Long Dim pAvVisStr As String Dim pETAstr As String Dim pPoint As ESRI.ArcGIS.Geometry.IP Asoint. Long If pInRefresh Then Exit Sub If fFeatureList.SelectedIndex <0 Then Exit Sub If pEd.EditState = esriEditState.esriStateNotEditing Then MsgBox ("Esta ferramenta só funciona em recursos EDIT" & vbNewLine & "Por favor, comece a editar", vbCritical) Sair Sub End If pFeatWS = pEd.EditWorkspace pFeatClass = pFeatWS.OpenFeatureClass (pFeatFrom (fFeatureList.SelectedIndex)) Em caso de erro Resume Next pFeature = pFeatClass.GetFeature (pFeatOID (fFeatureList.SelectedIndex) 'comente se não quiser ver os erros End If pEd.Map.ClearSelection () pID.Value = "{6CA416B1-E160-11D2-9F4E-00C04F6BC78E}" pEnumLayer = pEd.Map.Layers (pID, True ) pEditLayers = pEd pLayer = pEnumLayer.Next Do until pLayer Is Nothing If TypeOf pLayer Is IFeatureLayer Then If pEditLayers.IsEditable (pLayer) And pLayer.Visible = True Then pFeatLayer = pLayer If pFeatLayer.Selectable Then If pFeatLayers.IsEditable (pLayer) And pLayer.Visible = True Then pFeatLayer = pLayer If pFeatLayer.Selectable Then If pFeatLayers.IsEditable (pLayer) E pLayer.Visible = True Then pFeatLayer = pLayer If pFeatLayer.Selectable Then If pFeatLayer.FeatureClass.Alias.AliasName .SelectFeature (pLayer, pFeature) If pFeatLayer.FeatureClass.ShapeType = esriGeometryType.esriGeometryEntão pEnv = Novo envelope pEnv.PutCoords (pDoc.ActiveView.Extent.XMin, pDoc.ActiveView.XMin, pDoc.ActiveView.axent.ExtMent.ActiveMent. pDoc.ActiveView.Extent.YMax) pEnv.SpatialReference = pFeature.Shape.SpatialReference If pEnv.SpatialReference.FactoryCode <> pDoc.FocusMap.SpatialReference.FactoryCode Then pEnv.Project (pDoc.FocusMap.SpatialReference) pDoc.FocusMap.SpatialGeference (pDoc.FocusMap.SpatialGeference) pDoc.FocusMap.SpatialGeference. Geometry.PointClass pPoint = pFeature.ShapeCopy pEnv.CenterAt (pPoint) pDoc.ActiveView.Extent = pEnv pDispTran = pDoc.ActiveView.ScreenDisplay.DisplayTransformation If Len (fPointScale.Text)> 0 Then pDispTran.ScaleRatio = 0 Então pDispTran.ScaleRatio Else pDis pTran.ScaleRatio = 1000 End If If fSaveOnNext.Checked Then pSaveEdits.Execute () fSaveButton_Click () End If 'If fSaveOnNext.Checked Then pDoc.ActiveView.Refresh () Else Se Não pFeature.Shape.Envelope ThenEmpty = New Envelope. pEnv.PutCoords (pFeature.Extent.XMin, pFeature.Extent.YMin, pFeature.Extent.XMax, pFeature.Extent.YMax) pEnv.SpatialReference = pFeature.Shape.SpatialReference Se pEnv.SpatialReference. .FactoryCode Then pEnv.Project (pDoc.FocusMap.SpatialReference) If Len (fZoomPercent.Text)> 0 Then pEnv.Expand (Int (fZoomPercent.Text) / 100, Int (fZoomPercent.Text) / 100, True) End If pDoc .ActiveView.Extent = pEnv If fPointScale.Text.Length> 0 Then If pDoc.ActiveView.ScreenDisplay.DisplayTransformation.ScaleRatio  0 Then pLongTime = pLongTime - pHour pRemainder = pLongTime Mod 60 pMin = pLongTime - pRemainder If pMin> 0 Then pLongTime = pLongTime - pMin pSec = pLongTime pHour = pHLongTime "pH_Strime": & pMin & ":" & pSec End Function End Class

Por mais que eu não goste de compartilhar código compilado, aqui está o link. Leia o documento da Esri sobre 'Compartilhando e adicionando suplementos'.


Aqui está a versão arcpy do zoom para o próximo recurso. Você pode executá-lo na janela python do ArcMap:

mxd = arcpy.mapping.MapDocument ("CURRENT") # mapa atualmente aberto doc df = arcpy.mapping.ListDataFrames (mxd, "Layers") [0] # define a camada que deseja iterar e ampliar para lyr em arcpy.mapping .ListLayers (mxd): if lyr.name == 'myTOCLayerNameHere': fc = lyr # obtém a contagem total de registros de fc com arcpy.da.SearchCursor (fc, ["FID"]) como cursor: para linha no cursor: totalCount + = 1 def selectZoomNext (fc, campo, registro): se registro> totalCount: registro = 0 # redefinir para a primeira expressão de recurso = '{} = {}'. Formato (campo, registro) arcpy.SelectLayerByAttribute_management (fc, "NEW_SELECTION" , expressão) df.zoomToSelectedFeatures () nextRecord = registro + 1 return nextRecord registro = 0 registro = selectZoomNext (fc, 'FID', registro) # segundo argumento é o nome do campo, também pode ser OBJECTID

Você pode continuar executando oregistro = selectZoomNext (fc, 'FID', registro)declaração para continuar selecionando o próximo recurso na tabela e ampliando-o. Você também pode incluir este snippet em um suplemento python ou ferramenta de script python. Além disso, para tornar as coisas mais fáceis durante a edição, você pode desativar os campos desnecessários (nas propriedades da camada) e também abrir o painel Atributos para acesso rápido aos atributos.


Você tem a extensão Data Reviewer? O Data Reviewer permite que você "navegue" por todos os recursos com um simples clique no botão "Avançar" (amplia tanto a localização espacial quanto o registro da tabela de atributos). Além disso, há muito mais funcionalidade no Data Reviewer (como sinalizar erros como "corrigido", "marcado" etc. e executar trabalhos em lote). Apenas uma ferramenta de prateleira, embora eu tenha certeza que sua ferramenta @Michael é muito fantástica também!