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.