Desarrollando un transformador universal de coordenadas

Transformador Universal de Coordenadas

Hemos incorporado a Digi3D.NET un programa que permite transformar coordenadas de cualquier sistema de referencia de coordenadas a cualquier sistema de referencia de coordenadas utilizando los objetos .NET proporcionados por Digi3D.NET.

Puedes localizar el programa en Inicio/Todos los programas/Digi21.net/Digi3D.NET/Transformador universal de coordenadas.
Puedes descargar el código fuente del programa para estudiarlo y manipularlo a tu antojo de nuestro repositorio de código fuente en GitHub, en https://github.com/digi21/TransformadorUniversalCoordenadas

Aquí te voy a explicar a grandes rasgos los pasos que he seguido para desarrollar este programa:

  1. He creado un proyecto con Visual Studio 2010 denominado TransformadorUniversalCoordenadas. Es un proyecto desarrollado en el lenguaje C#, para Windows y de tipo WPF (Windows Presentation Foundation).
  2. He creado el interfaz de usuario, que es muy muy sencillo, tan solo tiene unos controles para solicitar el sistema de coordenadas de referencia origen, el destino, unos botones para seleccionarlos, y por último dos TextBlock, uno a la izquierda en el que el usuario podrá teclear o pegar coordenadas y otro a la derecha que es de solo lectura y que mostrará el resultado de la transformación.
  3. He añadido una nueva ventana para mostrar los posibles mensajes de error que pueden suceder al intentar localizar una transformación entre dos sistemas de referencia de coordenadas.
  4. He añadido una referencia al ensamblado Digi21.Epsg. Este ensamblado básicamente proporciona métodos para mostrar cuadros de diálogo para que el usuario seleccione un sistema de referencia de coordenadas.
  5. He añadido una referencia al ensamblado Digi21.OpenGis. Este ensamblado proporciona la implementación de Open Geospatial Consortium Coordinate Transformation Service.
  6. He añadido un archivo de configuración al proyecto (App.config) para añadir la cadena de conexión a la base de datos EPSG y para especificar el directorio donde ubicar los archivos necesarios para hacer transformaciones (rejillas, …).
  7. Y por último he añadido la lógica del programa que es muy sencilla. Tan solo hay que instanciar sistemas de referencia de coordenadas, instanciar una transformación y transformar coordenadas al pegar el usuario un listado de coordenadas en la parte izquierda del programa.

    El ensamblado Digi21.OpenGis implementa dos fábricas, una para instanciar sistemas de referencia de coordenadas y otra para instanciar transformaciones.

    El programa almacena en dos campos las dos fábricas tal y como puedes ver a continuación:

    private CoordinateSystemFactory fábricaSrc = new CoordinateSystemFactory();
    private CoordinateTransformationFactory fábricaTransformaciones = new CoordinateTransformationFactory();
    

    Solicitar al usuario que seleccione un sistema de referencia de coordenadas es muy sencillo, tan solo tienes que llamar a EpsgManager.DialogSelectCrs.
    Luego puedes instanciar un sistema de referencia de coordenadas mediante una llamada al método CreateFromWkt de la fábrica de sistemas de referencia de coordenadas.

    
            private void BotonLocalizarSrcOrigen_Click(object sender, RoutedEventArgs e)
            {
                var wktOrigen = EpsgManager.DialogSelectCrs("Selecciona el sistema de referencia de coordenadas origen", origen);
    
                var nuevoOrigen = fábricaSrc.CreateFromWkt(wktOrigen);
    
                if (AsignaTransformación(nuevoOrigen, destino))
                {
                    origen = nuevoOrigen;
                    TransformaPuntos();
                }
            }
    

    Una vez que tienes los dos sistemas de referencia de coordenadas, tan solo tienes que localizar una transformación entre ambos mediante el método CreateFromCoordinateSystems de la fábrica de transformaciones:

            private bool AsignaTransformación(CoordinateSystem origen, CoordinateSystem destino)
            {
                try
                {
                    transformación = fábricaTransformaciones.CreateFromCoordinateSystems(
                        origen,
                        destino,
                        SelectTransformationHelper.DialogSelectTransformation,
                        CreateVerticalTransformationHelper.DialogCreateVerticalTransformation);
                    return true;
                }
                catch (Exception e)
                {
                    MostrarExcepción dlg = new MostrarExcepción
                    {
                        Origen = origen.Name,
                        Destino = destino.Name,
                        Mensaje = e.Message
                    };
    
                    dlg.ShowDialog();
                    return false;
                }
            }
    

    Y por último sólo tienes que transformar las coordenadas llamando al método Transform de la transformación matemática obtenida en el punto anterior:

    var transformado = transformación.MathTransform.Transform(coordenadas);

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s