Pantalla de macros para arcmap

Recursos: Macro ArcMap para mover una entidad por coordenada

ArcMap se ha vuelto una pesadilla. Es una herramienta muy útil, pero usarlo requiere muchísimo trabajo manual y repetitivo, así que voy a investigar como ir automatizando algunas tareas, sea mediante programar por mi cuenta o usando inteligencia artificial. Para empezar, traigo un pequeño código para una tarea que ya estaba dando como imposible de forma programática: Mover una entidad de un punto a otro mediante escribir las coordenadas.


Nota: Si estas leyendo esto y sabes muchísimo sobre este tema y te escandaliza algo tan básico, he de advertirte que no tengo ninguna capacitación excepto conocimientos heredados de compañeros anteriores, que repito ceremonialmente sin conocer los fundamentos del programa. Si para ti esto es super básico y de sentido común, deja en comentarios tus sugerencias, me serán muy útiles.

Introducción a ArcMap

ArcMap es un software de Sistemas de Información Geográfica (GIS) desarrollado por Esri. Se utiliza principalmente para ver, editar, crear y analizar datos geoespaciales. ArcMap permite al usuario explorar los datos dentro de un conjunto de datos, simbolizar las características correspondientes y crear mapas. Esto se hace a través de dos secciones distintas del programa, la tabla de contenidos y el marco de datos.

En cuanto a la historia de ArcMap, Esri desarrolló ARC/INFO en 1981, el primer producto comercial de GIS. Desde entonces, Esri ha evolucionado en una empresa de software y ha lanzado varias versiones de ArcMap.

En cuanto a los usos de ArcMap, se utiliza en una variedad de campos, como la planificación urbana, la gestión de recursos naturales, la cartografía y la ingeniería civil. ArcMap también se utiliza en la investigación científica, la gestión de emergencias y la planificación de rutas de transporte.

Es posible encontrar notas de la versión que estoy usando en este enlace:

https://enterprise.arcgis.com/es/inspire/10.3/get-started/release-notes-10-2-1-for-inspire.htm

Mover una entidad por coordenada

La tarea mas básica del trabajo consiste en mover una entidad del punto A al punto B. esto se consigue mediante dar clic en el programa sobre la entidad y luego dar clic y arrastrar al punto deseado. Esta tarea no es demasiado complicada, excepto por las inmensas escalas que se manejan, siendo que hay que mover puntos que pueden estar tan lejos como en otra calle como en otro país. Pienso que para ir mejorando mi comprensión de una hipotética automatización de algunos procesos, debo comenzar desde lo básico. Por supuesto, tengo a mi disposición ArcPy y VBS Macros.

Este código permite seleccionar una entidad del mapa y desplazarlo a una coordenada especifica, separada por comas y sin decimales, ingresado por un input box.

Sub MoveEntity()
    'Obtener la coordenada ingresada en el campo de texto
    Dim coord As String
    coord = InputBox("Ingrese la coordenada en el formato X,Y", "Mover entidad")
    
    'Dividir la coordenada en X e Y
    Dim coords() As String
    coords = Split(coord, ",")
    Dim x As Double
    Dim y As Double
    x = CDbl(coords(0))
    y = CDbl(coords(1))
    
    'Obtener la entidad seleccionada
    Dim pMxDoc As IMxDocument
    Set pMxDoc = ThisDocument
    Dim pMap As IMap
    Set pMap = pMxDoc.FocusMap
    Dim pEnumFeat As IEnumFeature
    Set pEnumFeat = pMap.FeatureSelection
    pEnumFeat.Reset
    Dim pFeat As IFeature
    Set pFeat = pEnumFeat.Next
    
    'Mover la entidad a la nueva ubicación
    Do While Not pFeat Is Nothing
        Dim pPoint As IPoint
        Set pPoint = New Point
        pPoint.X = x
        pPoint.Y = y
        Set pFeat.Shape = pPoint
        pFeat.Store
        Set pFeat = pEnumFeat.Next
    Loop
End Sub

Este otro código es una prueba para intentar seleccionar una capa desde donde tomar las coordenadas de destino, pero no funciona apropiadamente.

Sub MoveEntity()
    'Obtener la capa seleccionada
    Dim pMxDoc As IMxDocument
    Set pMxDoc = ThisDocument
    Dim pMap As IMap
    Set pMap = pMxDoc.FocusMap
    Dim pLayer As ILayer
    Set pLayer = Nothing
    Dim pLayerName As String
    pLayerName = InputBox("Ingrese el nombre de la capa", "Mover entidad")
    For i = 0 To pMap.LayerCount - 1
        If pMap.Layer(i).Name = pLayerName Then
            Set pLayer = pMap.Layer(i)
            Exit For
        End If
    Next i
    If pLayer Is Nothing Then
        MsgBox "No se encontró la capa especificada"
        Exit Sub
    End If
    
    'Obtener el punto seleccionado
    Dim pFeatSel As IFeatureSelection
    Set pFeatSel = pLayer
    Dim pEnumFeat As IEnumFeature
    Set pEnumFeat = pFeatSel.SelectionSet
    pEnumFeat.Reset
    Dim pFeat As IFeature
    Set pFeat = pEnumFeat.Next
    Dim pPoint As IPoint
    Set pPoint = pFeat.ShapeCopy
    
    'Agregar un desplazamiento de 10 metros a las coordenadas
    Dim pMetersPerUnit As Double
    pMetersPerUnit = 10 'cambiar a la cantidad de metros que desee
    pPoint.X = pPoint.X + (pMetersPerUnit / 111319.9)
    pPoint.Y = pPoint.Y + (pMetersPerUnit / 111319.9 / Cos(pPoint.Y * 3.14159265358979 / 180))
    
    'Obtener la entidad seleccionada
    Dim pEnumFeat2 As IEnumFeature
    Set pEnumFeat2 = pMap.FeatureSelection
    pEnumFeat2.Reset
    Dim pFeat2 As IFeature
    Set pFeat2 = pEnumFeat2.Next
    
    'Mover la entidad a la nueva ubicación
    Do While Not pFeat2 Is Nothing
        Dim pPoint2 As IPoint
        Set pPoint2 = New Point
        pPoint2.X = pPoint.X
        pPoint2.Y = pPoint.Y
        Set pFeat2.Shape = pPoint2
        pFeat2.Store
        Set pFeat2 = pEnumFeat2.Next
    Loop
End Sub

Conclusiones

Seguro habrán algunos que piensen que es raro que no use un programa mas moderno y si por mi fuera, ni siquiera me interesaría en esta plataforma. pero hay que hacer lo que se pueda con lo que se tiene. Así sea un viejo programa de hace mas de 10 años usando tecnología de hace mas de 20 años. Que se le va a hacer.

Publicado por

Drk0027

Soy Drk0027, un desarrollador web con diversas capacidades como Administración de servidores web, Gestión de sitios web WordPress, Creación de plantillas HTML+CSS responsivo y otros. Puedes hablar conmigo en mi perfil de Telegram o seguir mis proyectos en mi canal https://t.me/drk0072

Deja un comentario

Interlan