Archivo de la etiqueta: OpenGis

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);

Implementando EGM08_REDNAP en Digi3D.NET

Introducción

Digi3D.NET se basa en la base de datos del EPSG para implementar todos sus cálculos geodésicos.

El problema de la base de datos EPSG es que no contempla ningún sistema de coordenadas vertical para la rejilla EGM08_REDNAP proporcionada por el Instituto Geográfico Nacional de España.

Aquí te voy a contar las modificaciones que he realizado en la base de datos para añadir el sistema de coordenadas vertical EGM08_REDNAP a Digi3D.NET.

El instalador de Digi3D.NET instala una copia (transformada a formato .sdf) de la base de datos del EPSG en la carpeta %ProgramData%\Digi3D.NET\OpenGis.

Conectándonos a la base de datos

Podemos conectarnos a esta base de datos con herramientas como Microsoft Visual Studio, WebMatrix o Microsoft SQL Server Management Studio. Yo lo he hecho con Visual Studio 2010.

He seguido los siguientes pasos:

  1. En el panel Server Explorer he pulsado el botón Connect to database. Aparece el cuadro de diálogo Choose Data Source.
  2. Selecciono la opción Microsoft SQL Server Compact 3.5
  3. Pulso el botón Continue. Aparece el cuadro de diálogo Add Connection.
  4. Pulso el botón Browse… Aparece el cuadro de diálogo Select SQL Server Compact 3.5 Database File.
  5. Localizo la base de datos y acepto el cuadro de diálogo Select SQL Server Compact 3.5 Database File.
  6. Pulso Ok en el cuadro de diálogo Add Connection. Aparece la base de datos como una rama de Data Connections en el panel Server Explorer.
  7. Pulso con el botón derecho del ratón en el nombre de la base de datos y aparece un menú contextual. Selecciono la opción New Query para crear una nueva consulta en la base de datos. Se abre una ventana para introducir la consulta y aparece un cuadro de diálogo Add Table. Lo cancelo.
  8. A partir de ahora podemos hacer consultas tecleándolas en la tercera fila. Para ejecutarlas pulsamos Ctrl+R

Añadiendo los sistemas de coordenadas de referencia verticales

El objetivo es añadir dos sistemas de coordenadas de referencia verticales: Uno para península (que denominaremos EGM08_REDNAP Península) y otro para Canarias (que denominaremos EGM08_REDNAP Canarias) para que el usuario de Digi3D.NET pueda seleccionar ese sistema de coordenadas.

Los sistemas de coordenadas de referencia se extraen de la tabla Coordinate Reference System.
Hago la siguiente consulta para averiguar los parámetros que rellenan todos los sistemas de coordenadas de referencia verticales que aparecen en la base de datos:

SELECT *
FROM [Coordinate Reference System]
WHERE COORD_REF_SYS_KIND = 'vertical'

Y compruebo que todos ellos rellenan únicamente los siguientes campos: COORD_REF_SYS_CODE, COORD_REF_SYS_NAME, AREA_OF_USE_CODE, COORD_REF_SYS_KIND, COORD_REF_SYS_CODE, DATUM_CODE, CRS_SCOPE, algunos rellenan REMARKS, INFORMATION_SOURCE, DATA_SOURCE, REVISION_DATE, SHOW_CRS y por último DEPRECATED.

Vamos a averiguar qué valores poner en cada campo.

COORD_REF_SYS_CODE:

Aquí tenemos que poner un código único para nuestro sistema de coordenadas. En el documento G7-1 del EPSG Users who wish to augment the EPSG, en el tema 5.9.1, podemos leer el siguiente párrafo: data with their own information should utilise codes greater than 32767, por lo tanto vamos a localizar el sistema de coordenadas de referencia cuyo código sea mayor de entre los mayores de 32767 con la siguiente consulta:

SELECT MAX(COORD_REF_SYS_CODE) AS Expr1
FROM [Coordinate Reference System]
WHERE (COORD_REF_SYS_CODE > 32767)

Nos sale el número 69036405, de modo que voy a añadir un sistema nuevo cuyo código va a ser 69036406 para el sistema de coordenadas a aplicar en la península y 69036407 para el de Canarias.

COORD_REF_SYS_NAME:

Aquí vamos a poner EGM08_REDNAP Península para el caso de península y EGM08_REDNAP Canarias para el caso de Canarias.

AREA_OF_USE_CODE:

Si hacemos la siguiente consulta:

SELECT *
FROM Area
WHERE (AREA_NAME LIKE '%spain%')

Nos encontramos con que el código a utilizar para la península es: 2366 y el de Canarias: 3199

COORD_REF_SYS_KIND:

Aquí vamos a poner vertical

COORD_REF_SYS_CODE:

Si realizamos la siguiente consulta:

SELECT *
FROM [Coordinate System]
WHERE (COORD_SYS_TYPE = 'vertical')

Comprobamos rápidamente que tendremos que introducir el código 6499 (ya que mide alturas, con orientación hacia arriba y con metros como unidad de medida).

DATUM_CODE:

Si ejecutamos la siguiente consulta:

SELECT *
FROM Datum
WHERE (DATUM_NAME LIKE '%EGM2008%')

Comprobamos que el valor a introducir en este campo es 1027.

CRS_SCOPE:

Aquí vamos a basarnos en el de EGM2008, que si lo consultamos con la siguiente consulta:

SELECT *
FROM [Coordinate Reference System]
WHERE (COORD_REF_SYS_NAME LIKE '%egm2008%')

comprobamos que tenemos que almacenar el valor Geodesy.

REMARKS:

Aquí vamos a poner:

Height Surface resulting from the application of the EGM08_REDNAP geoid model to the WGS 84 ellipsoid. Replaces EGM2008 geoid height (CRS code 3855) in Spain mainland

para el sistema de coordenadas de referencia vertical para la península y:

Height Surface resulting from the application of the EGM08_REDNAP geoid model to the WGS 84 ellipsoid. Replaces EGM2008 geoid height (CRS code 3855) in Spain – Canary islands

para el de Canarias.

INFORMATION_SOURCE:

Aquí vamos a poner la url del Instituto Geográfico Nacional España: http://www.ign.es/ign/layoutIn/actividadesGeodesiaRedn.do

DATA_SOURCE:

Aquí si hacemos la siguiente consulta:

SELECT DISTINCT DATA_SOURCE
FROM [Coordinate Reference System]

Resulta que únicamente existe un Data Source oficial, que es OGP, así que vamos a poner OGP (podríamos poner IGN pero como desconozco el valor a poner...).

REVISION_DATE:

Aquí vamos a poner la fecha de hoy: 26/11/2013

SHOW_CRS

Aquí vamos a poner True

DEPRECATED:

Aquí vamos a poner False

De modo que las consultas que debemos añadir para nuestros dos sistemas de coordenadas de referencia verticales son a la base de datos EPSG son:

INSERT INTO [Coordinate Reference System] (COORD_REF_SYS_CODE, COORD_REF_SYS_NAME, AREA_OF_USE_CODE, COORD_REF_SYS_KIND, COORD_SYS_CODE, DATUM_CODE, CRS_SCOPE, REMARKS, INFORMATION_SOURCE, DATA_SOURCE, 
                         REVISION_DATE, SHOW_CRS, DEPRECATED)
VALUES (69036406, 'EGM08_REDNAP Península', 2366, 'vertical', 6499, 1027, 'Geodesy', 'Height Surface resulting from the application of the EGM08_REDNAP geoid model to the WGS 84 ellipsoid. Replaces EGM2008 geoid height (CRS code 3855) in Spain mainland', 'http://www.ign.es/ign/layoutIn/actividadesGeodesiaRedn.do', 'OGP', GETDATE(), 1, 0)

y

INSERT INTO [Coordinate Reference System] (COORD_REF_SYS_CODE, COORD_REF_SYS_NAME, AREA_OF_USE_CODE, COORD_REF_SYS_KIND, COORD_SYS_CODE, DATUM_CODE, CRS_SCOPE, REMARKS, INFORMATION_SOURCE, DATA_SOURCE, REVISION_DATE, SHOW_CRS, DEPRECATED)
VALUES (69036407, 'EGM08_REDNAP Canarias', 3199, 'vertical', 6499, 1027, 'Geodesy', 'Height Surface resulting from the application of the EGM08_REDNAP geoid model to the WGS 84 ellipsoid. Replaces EGM2008 geoid height (CRS code 3855) in Spain - Canary islands', 'http://www.ign.es/ign/layoutIn/actividadesGeodesiaRedn.do', 'OGP', GETDATE(), 1, 0)

Con estos cambios ya podemos seleccionar el sistema de coordenadas de referencia vertical EGM08_REDNAP Península en Digi3D.NET tal y como se puede ver en la siguiente captura de pantalla:

Digi3D mostrando sistema vertical EGM08_REDNAP Península

A continuación la cadena Well Known Text generada automáticamente por Digi3D.NET al seleccionar el sistema de coordenadas de referencia que hemos creado para la península:

VERT_CS["EGM08_REDNAP Península",VERT_DATUM["EGM2008 geoid",2005,AUTHORITY["EPSG","1027"]],UNIT["metros",1,AUTHORITY["EPSG","9001"]],AXIS["H",Up],AUTHORITY["EPSG","69036406"]]

y a continuación el de Baleares:

VERT_CS["EGM08_REDNAP Baleares",VERT_DATUM["EGM2008 geoid",2005,AUTHORITY["EPSG","1027"]],UNIT["metros",1,AUTHORITY["EPSG","9001"]],AXIS["H",Up],AUTHORITY["EPSG","69036407"]]

Ahora nos quedan añadir entradas a la base de datos para indicar a Digi3D.NET la operación matemática a realizar para transformar coordenadas elipsoidales WGS 84 a ortométricas EGM08_REDNAP.

Para ello vamos a basarnos en la información que aparece en la base de datos EPGS para el sistema de coordenadas de referencia vertical EGM2008, pues EGM08_REDNAP no es más que una especialización de EGM2008:

Si realizamos la siguiente consulta:

SELECT *
FROM Coordinate_Operation
WHERE (SOURCE_CRS_CODE=4979 AND TARGET_CRS_CODE = 3855)

Comprobamos que hay dos variantes de la misma transformación. Vamos a introducir pues en esta tabla dos transformaciones, una cuyo destino será el sistema de coordenada de referencia 69036406 y otra el 69036407 y el resto de valores vamos a copiarlos de la consulta anterior.

Los números de operaciones serán también números mayores que 32767, así que vamos a averiguar primero el número mayor de entre los mayores de 32767 en esta tabla:

SELECT MAX(COORD_OP_CODE) AS Expr1
FROM Coordinate_Operation
WHERE (COORD_OP_CODE > 32767)

La respuesta es 32769, de modo que utilizaremos 32770 y 32771:

INSERT INTO Coordinate_Operation (COORD_OP_CODE, COORD_OP_NAME, COORD_OP_TYPE, SOURCE_CRS_CODE, TARGET_CRS_CODE, COORD_TFM_VERSION, COORD_OP_VARIANT, AREA_OF_USE_CODE, COORD_OP_SCOPE, COORD_OP_ACCURACY, COORD_OP_METHOD_CODE, REMARKS, DATA_SOURCE, REVISION_DATE, SHOW_OPERATION, DEPRECATED)
VALUES (32770, 'WGS 84 to EGM08_REDNAP Península Geoid height', 'transformation', 4979, 69036406, 'IGN-Spain mainland', 1, 2366, 'Derivation of gravity-related heights from GPS observations.', 0.5, 1025, 'Replaces WGS 84 to EGM2008 geoid height (2) (tfm code 3859) in Spain - mainland. This tfm uses a grid with node spacing of 1 arc-minute.', 'OGP', GETDATE(), 1, 0)

y este otro:

INSERT INTO Coordinate_Operation (COORD_OP_CODE, COORD_OP_NAME, COORD_OP_TYPE, SOURCE_CRS_CODE, TARGET_CRS_CODE, COORD_TFM_VERSION, COORD_OP_VARIANT, AREA_OF_USE_CODE, COORD_OP_SCOPE, COORD_OP_ACCURACY, COORD_OP_METHOD_CODE, REMARKS, DATA_SOURCE, REVISION_DATE, SHOW_OPERATION, DEPRECATED)
VALUES (32771, 'WGS 84 to EGM08_REDNAP Canary islands geoid height', 'transformation', 4979, 69036407, 'IGN-Spain Balearic', 1, 3199, 'Derivation of gravity-related heights from GPS observations.', 0.5, 1025, 'Replaces WGS 84 to EGM2008 geoid height (2) (tfm code 3859) in Spain - Balearic islands. This tfm uses a grid with node spacing of 1 arc-minute.', 'OGP', GETDATE(), 1, 0)

Añadiendo los parámetros a las transformaciones

Por último sólo nos queda por añadir los parámetros de nuestras transformaciones (que básicamente consisten en indicar el nombre del archivo a cargar).
Los parámetros de las transformaciones se almacenan en la tabla Coordinate_Operation Parameter Value.

Podemos ver los parámetros de la transformación EGM2008:

SELECT *
FROM [Coordinate_Operation Parameter Value]
WHERE (COORD_OP_CODE = 3858)

Comprobamos que únicamente tendremos que añadir dos entradas a esta tabla: una con el COORD_OP_CODE 32769, con el COORD_OP_METHOD_CODE 1025, con el PARAMETER_CODE 8666 y con PARAM_VALUE_FILE_REF EGM08_REDNAP.txt para península y COORD_OP_CODE 32770, con el COORD_OP_METHOD_CODE 1025, con el PARAMETER_CODE 8666 y con PARAM_VALUE_FILE_REF EGM08_REDNAP_Canarias.txt para Canarias:

INSERT INTO [Coordinate_Operation Parameter Value] (COORD_OP_CODE, COORD_OP_METHOD_CODE, PARAMETER_CODE, PARAM_VALUE_FILE_REF)
VALUES (32770, 1025, 8666, 'EGM08_REDNAP.txt')

y

INSERT INTO [Coordinate_Operation Parameter Value] (COORD_OP_CODE, COORD_OP_METHOD_CODE, PARAMETER_CODE, PARAM_VALUE_FILE_REF)
VALUES (32771, 1025, 8666, 'EGM08_REDNAP_Canarias.txt')

Por último he tenido que modificar el algoritmo Geographic3DToGravityRelatedHeightEGM2008 para que pueda cargar archivos .txt en el formato en el que lo publica el IGN que no tiene nada que ver con el que se publica el EGM2008 y ya está, Digi3D.NET es compatible con estos sistemas de coordenadas de referencia verticales.

Actualizando la base de datos Epsg v7.9 para añadir transformaciones de cambio de datum ED50 -> ETRS89 y ED50 -> WGS84

Este post es avanzado, y supone que acabas de descargar una versión nueva de la base de datos EPSG y la has exportado al formato Microsoft SQL Server Compact tal y como se explica en el post Cómo se ha creado la base de datos geográfica EPSG en formato SQL Server Compact que se instala con Digi3D 2011.

La última versión de los archivos de rejilla de mínima curvatura NTv2 suministrados por el Instituto Geográfico Nacional data del 2009, sin embargo no existe ninguna transformación en la base de datos EPSG v7.9 (la mas moderna a día de hoy 17/04/2012) que utilice este archivo de mínima curvatura.

En este post te explico cómo modificar la base de datos para añadir una transformación que utilice el archivo de mínima curvatura actualizado.

La base de datos EPSG define 12 transformaciones para transformar entre los sistemas de coordenadas geográficos ED50 y ETRS89 y 40 transformaciones para transformar entre ED50 y WGS 84.

Puedes comprobarlo mediante las siguientes consultas SQL:

SELECT COUNT(*)
FROM Coordinate_Operation
WHERE SOURCE_CRS_CODE=4230 and TARGET_CRS_CODE=4258 and COORD_OP_TYPE='transformation';

SELECT COUNT(*)
FROM [Coordinate_Operation]
WHERE SOURCE_CRS_CODE=4230 and TARGET_CRS_CODE=4326 AND COORD_OP_TYPE='transformation';

Muchas de ellas consisten simplemente en desplazamientos geográficos (es decir, transformar de coordenadas geográficas a geocéntricas y realizar un desplazamiento en geocéntricas para luego volver a transformar a geográficas), por lo que tienen poca precisión.

De entre todos los algoritmos para transformar entre sistemas geográficos, el más preciso es el método interpolación mediante una rejilla de mínima curvatura. Esta rejilla le indica al programa: “Para este par de coordenadas latitud, longitud en el sistema de coordenadas de referencia ED50, le corresponde este otro par de coordenadas latitud, longitud en el sistema de coordenadas de referencia ETRS89”. Luego el programa tan solo tiene que interpolar mediante una interpolación bilineal. El resultado es muy preciso (20 cm para el caso de España).

Es responsabilidad de cada país/organismo crear su archivo de rejilla y de publicarlo. Cualquiera podría inventarse su propio formato de rejilla (lo que obligaría a que los desarrolladores de programas de cartografía y sistemas de información geográfica tuvieran que implementar un importador específico para cada formato de rejilla) pero existe uno estandarizado denominado NTv2.

En el caso de España, el organismo encargado de crear y actualizar ese archivo de rejilla es el Instituto Geográfico Nacional que publica este archivo a través de su página en internet: www.ign.es.

Descarga los archivos de rejilla entrando en www.ign.es: en el menú Herramientas de la página web, puedes seleccionar la opción: Rejilla para cambio de Datum entre ED50 y ETRS89 (en formato NTV2). Verás que puedes descargar dos rejillas: una para Península y otra para Baleares. Descarga el archivo Península, comprobarás que el nombre del archivo descargado es PENR2009.gsb.

Como la creación y mantenimiento de los archivos NTv2 depende del centro geográfico nacional de cada país, la base de datos EPSG no distribuye estos datos, sin embargo, Digi3D 2011 incorpora una copia de estos archivos en la carpeta %ProgramData%Digi3D 2011OpenGis, de modo que en ese directorio encontrarás el archivo PENR2009.gsb.

El único inconveniente es que la base de datos original EPSG (la que acabas de descargar de http://www.epsg.org/Geodetic.html no dispone de ninguna transformación que utilice este archivo, únicamente tiene transformaciones que utilizan versiones anteriores de ese archivo.

Vamos a comprobarlo:

La base de datos EPSG dispone de una tabla denominada ‘Coordinate_Operation Method’ que registra los códigos, nombres y descripciones de las distintas transformaciones.

Consultemos el código asociado al algoritmo NTv2 mediante la siguiente consulta SQL:

SELECT * FROM [Coordinate_Operation Method]
WHERE COORD_OP_METHOD_NAME='NTv2';

Puedes comprobar que el algoritmo NTv2 tiene asociado el código 9615.

Podemos consultar también los parámetros que recibe un determinado algoritmo. Comprobemos los parámetros que recibe el algoritmo 9615:

La base de datos EPSG dispone de una tabla ‘Coordinate_Operation Parameter Usage’ que nos indica los parámetros de cada algoritmo. Estos parámetros (como todo en la base de datos EPSG) tienen asignado un código. Disponemos de otra tabla ‘Coordinate_Operation Parameter’ que nos muestra una descripción de cada tipo de parámetro.

Para averiguar los parámetros que recibe la transformación con código 9615 podemos ejecutar la siguiente consulta SQL:

SELECT *
FROM [Coordinate_Operation Parameter Usage]
WHERE COORD_OP_METHOD_CODE=9615;

Eso nos devolverá un único registro indicando que el único parámetro que recibe el algoritmo 9615 es el parámetro cuyo código es el 8656.

Podemos consultar el significado de ese parámetro con la siguiente consulta SQL:

SELECT *
FROM [Coordinate_Operation Parameter]
WHERE PARAMETER_CODE=8656;

Por último, si quieres hacerlo bien, puedes hacerlo con una consulta JOIN de la siguiente manera:

SELECT *
FROM [Coordinate_Operation Parameter Usage] AS A
JOIN [Coordinate_Operation Parameter] AS B
ON A.PARAMETER_CODE = B.PARAMETER_CODE
WHERE A.COORD_OP_METHOD_CODE=9615;

De entre todas las posibles transformaciones (te recuerdo que había 12) entre ED50 y ETRS89 que define la base de datos EPSG, únicamente hay dos que utilicen el algoritmo 9615: La transformación 15895: ED50 to ETRS89 (11) y la operación 15932: ED50 to ETRS89 (12).

Puedes comprobarlo mediante la siguiente consulta SQL:

SELECT *
FROM Coordinate_Operation
WHERE SOURCE_CRS_CODE=4230 and TARGET_CRS_CODE=4258 and COORD_OP_TYPE='transformation' AND COORD_OP_METHOD_CODE=9615;

Si nos leemos los comentarios de estas dos transformaciones, rápidamente averiguamos que la transformación 15895 ha sido sustituida por la 15932, de modo que la que nos interesará utilizar es la 15932, pero tal y como vamos a comprobar muy pronto, esta transformación no nos sirve, pues el archivo de rejilla a que utiliza esta transformación no es “PENR2009.gsb”.

Los parámetros de las transformaciones se almacenan en la tabla ‘Coordinate_Operation Parameter Value’.

Esta tabla almacena los parámetros de todos los algoritmos utilizados en todas las posibles transformaciones especificadas en la base de datos EPSG. Actualmente tiene 15743 registros.

Cada registro tiene varios campos:

COORD_OP_CODE COORD_OP_METHOD_CODE PARAMETER_CODE PARAMETER_VALUE PARAM_VALUE_FILE_REF UOM_CODE

Si comprobamos los registros de esta tabla para el código de operación 15932, comprobaremos que el nombre del archivo de rejilla asignado para esa operación es “SPED2ETV2.gsb”.

SELECT * FROM [Coordinate_Operation Parameter Value] WHERE COORD_OP_CODE=15932;

Por lo tanto esta operación no nos sirve. El archivo “SPED2ETV2.gsb” es el nombre que tenía la versión antigua de los archivos de rejilla, de hecho, la operación 15932 se añadió a la base de datos EPSG con fecha 27-03-2007, y el nombre de archivo “PENR2009” nos hace pensar que este archivo se creó en el año 2009.

Podrías pensar que una solución sería modificar este registro de la base de datos y cambiar la palabra “SPED2ETV2.gsb” por “PENR2009.gsb”, pero esto no se puede hacer porque la base de datos EPSG es inmutable. No se permiten cambios. Podemos añadir información, transformaciones, sistemas de coordenadas, pero nunca cambiar nada.

Así que no nos queda más remedio que crear una transformación nueva.

En la documentación de EPSG te indican que si quieres añadir información, utilices siempre códigos con valores superiores a 32767, por lo tanto vamos a crear una transformación con código 32768 que nos servirá para transformar entre los sistemas de coordenadas geográficos ED50 (4230) y ETRS89 (4326), para la zona de España con el algoritmo 9615 y utilizando como archivo de rejilla NTv2 el archivo “PENR2009.gsb”.

Para ello ejecutaremos la consulta:

INSERT INTO Coordinate_Operation (COORD_OP_CODE, COORD_OP_NAME, COORD_OP_TYPE, SOURCE_CRS_CODE, TARGET_CRS_CODE, COORD_TFM_VERSION, COORD_OP_VARIANT, AREA_OF_USE_CODE, COORD_OP_SCOPE, COORD_OP_ACCURACY, COORD_OP_METHOD_CODE, REMARKS, INFORMATION_SOURCE, DATA_SOURCE, REVISION_DATE, SHOW_OPERATION, DEPRECATED)
VALUES (32768, 'ED50 a ETRS89 (14)', 'transformation', 4230, 4258, 'IGN-Esp v3', 14, 3429, 'For applications to an accuracy of 10-15cm (95% confidence) for Spain mainland and about 4cm (95%) for Balearic Islands.',0.2,9615,'Reemplaza a ED50 to ETRS89(12)','Instituto Geográfico Nacional, www.ign.es', 'OGP', 2009-01-01, 1, 0);

Y ya puestos, y considerando que el sistema de coordenadas geográfico ETRS89 es idéntico al WGS84, vamos a crear una transformación para transformar entre los sistemas de coordenadas geográficos ED50 (4230) y WGS84 (4326), esta vez con código 32769 con la siguiente consulta:

INSERT INTO Coordinate_Operation (COORD_OP_CODE, COORD_OP_NAME, COORD_OP_TYPE, SOURCE_CRS_CODE, TARGET_CRS_CODE, COORD_TFM_VERSION, COORD_OP_VARIANT, AREA_OF_USE_CODE, COORD_OP_SCOPE, COORD_OP_ACCURACY, COORD_OP_METHOD_CODE, REMARKS, INFORMATION_SOURCE, DATA_SOURCE, REVISION_DATE, SHOW_OPERATION, DEPRECATED)
VALUES (32769, 'ED50 a WGS84 (43)', 'transformation', 4230, 4326, 'IGN-Esp v3', 43, 3429, 'For applications to an accuracy of 10-15cm (95% confidence) for Spain mainland and about 4cm (95%) for Balearic Islands.',0.2,9615,'Valor de los parámetros de la transformación ED50 a ETRS89 (14). Asume que ETRS89 y WGS 84 se consideran iguales dentro de la precisión de la transformación. Reemplaza ED50 to WGS 84 (41)','Instituto Geográfico Nacional, www.ign.es', 'OGP', 2009-01-01, 1, 0);

Tan solo nos queda añadir en la tabla ‘Coordinate_Operation Parameter Value’ los parámetros para estas dos transformaciones.

Para ello tan solo tenemos que ejecutar las consultas:

INSERT INTO [Coordinate_Operation Parameter Value]
VALUES (32768, 9615, 8656, NULL, 'PENR2009.gsb', NULL);

INSERT INTO [Coordinate_Operation Parameter Value]
VALUES (32769, 9615, 8656, NULL, 'PENR2009.gsb', NULL);

y ya lo tenemos. Ahora cuando Digi3D detecte que tiene que transformar entre los sistemas de coordenadas de referencia ED50 y ETRS89 o ED50 y WGS 84 nos mostrará esta transformacion en el cuadro de diálogo de posibles transformaciones.