Archivos Mensuales: enero 2016

Truco: Elimina una orden de la ventana de dibujo en Digi3D.NET

En Digi3D.NET podemos anular órdenes para que no se puedan utilizar. Hoy te voy a explicar cómo eliminar órdenes de la ventana de dibujo.

Los motivos pueden ser varios: quizás estemos haciendo un trabajo en el que no queremos que se pueda ejecutar la orden COMPRIMIR, quizás queremos que se anule SALIR, o cualquier motivo.

Digi3D.NET no implementa la órdenes que ejecutas a diario, sino que estas están implementadas en distintas extensiones. A continuación te muestro las extensiones que instala el instalador de Digi3D.NET y el tipo de órdenes que implementa cada extensión:

Extensión Tipos de órdenes
DigiNG.OrdenesStandard Órdenes habituales como LINEA, ARCO, COMPRIMIR, etc.
DigiNG.OrdenesBaseDatos Órdenes relacionadas con bases de datos.
DigiNG.OrdenesMDT Órdenes relacionadas con Modelos Digitales del Terreno.
DigiNG.OrdenesRaster Órdenes relacionadas con imágenes.
DigiNG.OrdenesTopologia Órdenes relacionadas con topología.

La mayoría de órdenes que conoces están implementadas en la extensión DigiNG.OrdenesStandard. Puedes ver dónde está implementadas las órdenes en la ayuda, pues la referencia de cada orden muestra al final en una tabla en la que se indica la extensión en la que se implementa esa orden en particular (en el vídeo de al final de esta entrada te lo muestro).

Bien, pues todas estas extensiones publican los nombres de las órdenes en un archivo .XML que puedes encontrar en %ProgramFiles%\Digi21.net\Digi3D.NET\es-ES.

La última carpeta se llama es-ES pues es donde están las cosas de Español. Podrás comprobar que también hay una carpeta llamada en-US. Ahí tienes los mismos archivos que en la es-ES, pero todo el contenido que encuentres en esa carpeta es para el idioma inglés.

En esa carpeta te encontrarás unos archivos que se llaman igual que las extensiones enumeradas en la tabla anterior con extensión .xml.

Si abres una de ellas con tu editor de texto favorito, te encontrarás con todas las órdenes que implementa la extensión.

Ahora tan solo nos queda comentar o eliminar el nodo que representa a la orden que queremos eliminar. Para ello tenemos que buscar lo siguiente:

name=”orden”

Por ejemplo:

name=”salir”

Nuestro editor nos llevará al nodo XML en el que se publica la orden.

Podemos hacer dos cosas: o eliminamos el nodo completamente o lo comentamos mediante un comentario XML.

En el vídeo de a continuación te muestro como hacerlo.

Truco: Haz que Digi3D.NET consuma menos memoria y arranque más deprisa

Cuando instalas Digi3D.NET en tu equipo el instalador activa el 100% de las funcionalidades de éste activando todas las extensiones disponibles. Esto hace que el programa cargue muchas DLLs que posiblemente nunca has utilizado y que jamás vas a utilizar, y repercute en el tiempo de carga de la aplicación y en el consumo de memoria de éste.

Afortunadamente podemos deshabilitar los componentes que no utilizamos y configurar el programa a nuestra medida para hacer que éste cargue más rápido y que consuma menos memoria.

Digi3D.NET al arrancar busca en el registro de Windows las extensiones a cargar y carga todas las que estén habilitadas.

Vamos a ver las distintas familias de extensiones disponibles y cómo podemos indicar en el registro que no se cargue una extensión en particular.

Extensiones para la ventana fotogramétrica:

Cuando carga el módulo de Digi3D, éste se pone a cargar extensiones, y sus extensiones son los distintos sensores. Algunos sensores a su vez pueden tener sus propias extensiones.

Veamos en la siguiente tabla la ubicación de cada una de estas extensiones:

Extensión Clave del registro ¿Tiene extensiones propias?
Sensor ADS HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\Digi3D\Extensiones\Digi3D.ADS40Sensor No
Sensor cónico HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\Digi3D\Extensiones\Digi3D.ConicSensor Si
Sensor Ortofoto HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\Digi3D\Extensiones\Digi3D.Orthophoto  No
Sensor satelital HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\Digi3D\Extensiones\Digi3D.Rpc Si
Sensor VM Quasi Panoramic HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\Digi3D\Extensiones\Digi3D.VMQuasiPanoramic  No
Web Map Service HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\Digi3D\Extensiones\Digi3D.WMS No
Web Map Tile Service HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\Digi3D\Extensiones\Digi3D.WMTS No

Los sensores Cónico y Satelital tienen sus propias extensiones, que son las extensiones encargadas de importar orientaciones de distintos formatos de archivo.

Veamos la ubicación de las extensiones del sensor cónico:

Extensión Clave del registro
AeroOffice HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\Digi3D\Extensiones\Digi3D.ConicSensor\Extensiones\Camaras\AeroOffic
Digi3D HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\Digi3D\Extensiones\Digi3D.ConicSensor\Extensiones\Camaras\Digi3D
Dvp HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\Digi3D\Extensiones\Digi3D.ConicSensor\Extensiones\Camaras\Dvp
EspaKernel HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\Digi3D\Extensiones\Digi3D.ConicSensor\Extensiones\Camaras\EspaKernel
Imu HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\Digi3D\Extensiones\Digi3D.ConicSensor\Extensiones\Camaras\Imu
Lps HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\Digi3D\Extensiones\Digi3D.ConicSensor\Extensiones\Camaras\Lps
PatB HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\Digi3D\Extensiones\Digi3D.ConicSensor\Extensiones\Camaras\PatB
Pix4D HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\Digi3D\Extensiones\Digi3D.ConicSensor\Extensiones\Camaras\Pix4D
RapidCal HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\Digi3D\Extensiones\Digi3D.ConicSensor\Extensiones\Camaras\RapidCal
Summit Evolution HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\Digi3D\Extensiones\Digi3D.ConicSensor\Extensiones\Camaras\Summit

y a continuación las extensiones del sensor satelital:

Extensión Clave del registro
Ikonos HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\Digi3D\Extensiones\Digi3D.Rpc\Extensions\Digi3D.Rpc.Ikonos
Inpho HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\Digi3D\Extensiones\Digi3D.Rpc\Extensions\Digi3D.Rpc.Inpho
Isd HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\Digi3D\Extensiones\Digi3D.Rpc\Extensions\Digi3D.Rpc.Isd
Lps HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\Digi3D\Extensiones\Digi3D.Rpc\Extensions\Digi3D.Rpc.Lps
Nitf HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\Digi3D\Extensiones\Digi3D.Rpc\Extensions\Digi3D.Rpc.Nitf
Pleyades HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\Digi3D\Extensiones\Digi3D.Rpc\Extensions\Digi3D.Rpc.Pleyades
Socet Set HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\Digi3D\Extensiones\Digi3D.Rpc\Extensions\Digi3D.Rpc.SocetSet
Summit Evolution HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\Digi3D\Extensiones\Digi3D.Rpc\Extensions\Digi3D.Rpc.SummitEvolution

Extensiones para la ventana de dibujo:

DigiNG tiene dos familias de extensiones:

  • Proveedores de órdenes.
  • Importadores/exportadores de archivos de dibujo.

Veamos la ubicación para los distintos proveedores de órdenes:

Extensión Clave del registro
Motor de órdenes .NET HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\DigiNG\Extensiones\DigiNG.Interop
Bases de datos HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\DigiNG\Extensiones\DigiNG.OrdenesBaseDatos
Modelos digitales del terreno HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\DigiNG\Extensiones\DigiNG.OrdenesMDT
Raster HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\DigiNG\Extensiones\DigiNG.OrdenesRaster
Topologia HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\DigiNG\Extensiones\DigiNG.OrdenesTopologia
Pleyades HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\Digi3D\Extensiones\Digi3D.Rpc\Extensions\Digi3D.Rpc.Pleyades
Socet Set HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\Digi3D\

y a continuación la ubicación de los distintos importadores de archivos de dibujo:

Extensión Clave del registro
DEMS de ArcGis HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\DigiNG\IO\Digi21.Io.ArcGis.Dem
Archivos ASCII clásicos de Digi HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\DigiNG\IO\Digi21.Io.AsciiDigi
Archivos binarios clásicos de Digi HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\DigiNG\IO\Digi21.Io.Bin
Archivos binarios de doble precisión HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\DigiNG\IO\Digi21.Io.BinDouble
Archivos separados por comas HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\DigiNG\IO\Digi21.Io.Csv
Archivos DGN HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\DigiNG\IO\Digi21.Io.DGN
Archivos DWG HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\DigiNG\IO\Digi21.Io.DWG
Archivos Geo JSON HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\DigiNG\IO\Digi21.Io.GeoJSON
Archivos KML HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\DigiNG\IO\Digi21.Io.KML
Archivos Kork HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\DigiNG\IO\Digi21.Io.Kork
Archivos LAS HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\DigiNG\IO\Digi21.Io.Las
Archivos MDTopX HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\DigiNG\IO\Digi21.Io.Mdt
Imágenes (ortofotos, etc) HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\DigiNG\IO\Digi21.Io.Raster
Archivos Shapefile HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\DigiNG\IO\Digi21.Io.Shp
Archivos Scalable Vector Graphics HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\DigiNG\IO\Digi21.Io.Svg
Conexiones con Web Map Service HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\DigiNG\IO\Digi21.Io.Wms
Archivos XYZ HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\DigiNG\IO\Digi21.Io.Xyz

¿Cómo deshabilitar la carga de una extensión?

Todas las claves enumeradas en las tablas anteriores tienen un valor denominado Activated. Si este valor tiene asignado un 0 la extensión en particular no se carga, de manera que para hacer que Digi3D.NET no cargue el sensor VM Quasi Panoramic, lo único que tenemos que hacer es asignar el valor 0 al valor: HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NET\Digi3D\Extensiones\Digi3D.VMQuasiPanoramic\Activated.

Puedes ver cómo deshabilito casi todas las extensiones de Digi3D.NET en el siguiente vídeo:

Truco: Haz que el formato de archivo por defecto en Digi3D.NET sea .bin en vez de .bind

El formato de archivo de dibujo .bind incorporado en Digi3D.NET tiene muchas ventajas con respecto al clásico .bin como por ejemplo:

  • Identificación dentro del propio archivo del Sistema de Referencia de Coordenadas de las entidades.
  • Doble precisión en las coordenadas.
  • Sistema nativo para multi-codificación.
  • Admite tipos de entidades de terceros.
  • Versionable.
El problema es que aún hay mucha base de usuarios que utiliza versiones antiguas del programa que no reconocen este formato.

Por defecto Digi3D.NET muestra archivos .bind en los cuadros de diálogo que solicitan archivos de dibujo, y esto puede ser una molestia si colaboramos con usuarios de versiones anteriores, pues tenemos que cambiar el tipo de archivo en el desplegable de los cuadros de diálogo.

Digi3D.NET dispone de un truco que nos va a permitir cambiar el orden de los archivos por defecto, y nos va a permitir hacer que el formato por defecto sea el formato .bin.
El truco va a involucrar tocar el registro, pero siempre que lo hagas con cuidado, no vas a encontrarte con ningún problema.
Cuando ejecutas Digi3D.NET, éste en el proceso de inicialización se pone a cargar extensiones.
¿Cómo sabe Digi3D.NET el nombre de las extensiones que debe cargar?
Hay varias familias de extensiones, una de las cuales son las extensiones de importadores/exportadores de archivos de dibujo. En caso de ser extensiones de importadores/exportadores de archivos de dibujo, extrae los nombres de las extensiones a cargar de las sub-claves de la calve del registro:
HKEY_LOCAL_MACHINE\SOFTWARE\Digi21\Digi3D.NETBeta2016\DigiNG\IO
Cada una de las sub-claves de esta clave representa una extensión de importadores de archivos de dibujo.
Entre ellas están las claves:
  • Digi21.Io.BinDouble
  • Digi21.Io.Bin
Que como te podrás imaginar representan la primera al importador de archivos .bind y la segunda al importador de archivos .bin.
Bien, pues todas estas claves tienen un valor denominado Order.
Por defecto el valor de Order para Digi21.Io.BinDouble es 0, y el valor de Order para Digi21.Io.Bin es 1.
El truco consiste en cambiar estos valores, y hacer que el valor de Order para Digi21.Io.BinDouble sea 1 y para Digi21.Io.Bin sea 0.
Puedes verlo en el siguiente vídeo:

Carga nativa de archivos JPEG en la ventana fotogramétrica

Digi3D.NET siempre ha podido cargar archivos JPEG en la ventana de dibujo, nunca en la ventana fotogramétrica. La causas de no añadir esa posibilidad eran las siguientes:

  • Las cámaras fotogramétricas clásicas (las de avión, no las de drone) guardan las imágenes en formato TIFF de forma nativa. Ninguna guarda archivos JPEG.
  • La velocidad de descompresión del formato JPEG no es muy rápida.
  • JPEG no está pensado para imágenes enormes (más de 10000×10000 píxeles, que es lo habitual en imágenes fotogramétricas), para este tipo de imágenes hay otros formatos que sí que soporta Digi3D.NET en la ventana fotogramétrica, como ECW, MrSID, etc. que son muy rápidos y tienen un ratio de compresión mucho mejor y con menos pérdida que JPEG.
  • JPEG no admite niveles piramidales mas allá del 16, y con imágenes tan grandes, ese nivel piramidal es muy corto, no podrías llegar a ver la imagen completa al hacer un zoom extendido.

Pero nos guste o no estamos en la era de los drones y todo ha cambiado.

  • Ahora se vuela con cámaras “de juguete” que de forma nativa almacenan archivos .JPG.
  • Las imágenes ya no son tan grandes y si que podemos verlas completas en el nivel piramidal 16.

Así que hemos decidido añadir carga de archivos JPEG en la ventana fotogramétrica, de manera que ahora la ventana fotogramétrica admite los siguientes formatos de imagen:

Formato Extensiones
TIFF *.tif, *.smti, *.pyr
Earth Resource Mapping *.ecw
MrSID *.sid
JPEG 2000 *.jp2
National Imagery Transmission Format *.ntf
JPEG *.jpg

Puedes verlo en acción en el siguiente vídeo:

Modificando archivos .PRJ satelitales de Inpho para que Digi3D.NET no solicite el SRC vertical

Ayer mismo publicamos una entrada en la que se anunciaba la posibilidad de cargar archivos .PRJ de Inpho con parámetros RPC de satélites, pero el vídeo tenía un truco para evitar que Digi3D.NET solicite el Sistema de Referencia de Coordenadas (SRC a partir de ahora) vertical.

El sensor satelital de Digi3D.NET es un sensor 3D, de modo que requiere que le proporcionemos tres coordenadas: X, Y, Z o Longitud, Latitud, Altitud. Además, Digi3D.NET necesita saber el SRC de estas coordenadas.

Si los parámetros RPC se han obtenido de cualquiera de los formatos que soportaba la extensión hasta ayer (antes de añadir la posibilidad de obtenerlos de archivos .PRJ de Inpho), se suponía que el SRC era el EPSG:4979, que el SRC geográfico 3D (lo que significa que la coordenada Z es elipsoidal) con nombre WGS 84. No lo confundas son el mucho más famoso EPSG:4326 con el que comparte nombre: este otro es 2D, y únicamente puede formar parte de un SRC compuesto, y en los SRC compuestos no podemos especificar una coordenada Z elipsoidal, tiene que ser ortométrica si o si.

Cuando ayer implementamos la posibilidad de cargar archivos .PRJ hicimos que el SRC asociado al sensor satelital ya no sea siempre el EPSG:4979, sino que sea el que viene indicado en el archivo .PRJ. El problema es que los SRC que aparecen en los archivos .PRJ son 2D y no 3D.

A continuación tienes un recorte de un archivo .PRJ con las orientaciones en geográficas:

$PROJECT 7.0.0
# generated using Version 7.0.1.49528 (64bit), build #36 of 2015-10-13 09:38
  $PROJECT_NAME : new_project
  $USER_ID : Jose Manuel
  $STARTING_DATE : mar ene 12 12:44:00 2016
  $LAST_CHANGE : Tue Jan 12 13:22:21 2016
  $IMAGE_TYPE : Satellite
  $REFRACT_CORR_DEFAULT : off
  $CURV_CORR_DEFAULT : off
  $COORDINATE_SYSTEM :
     GEOGCS["WGS 84",
         DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG",
                     "7030"]],
             AUTHORITY["EPSG","6326"]],
         PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],
         UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],
         AUTHORITY["EPSG","4326"]]
  $LINEAR_UNITS_OF_OBJECT : m
  $LINEAR_UNITS_OF_IMAGE : pixel
  $ANGULAR_UNITS : deg
  $REPORT_LOGFILE : C:\Users\Jose Manuel\new_report.log
$END

Como puedes ver, el SRC proporcionado es el EPSG:4326. A simple vista se ve que es 2D, porque los SRC que se definen como GEOGCS son 2D, así de sencillo.

Lo mismo ocurre con un archivo .PRJ con las coordenadas en UTM como puedes ver a continuación:

$PROJECT 7.0.0
# generated using Version 7.0.1.49528 (64bit), build #36 of 2015-10-13 09:43
  $PROJECT_NAME : new_project
  $USER_ID : Jose Manuel
  $STARTING_DATE : mié nov 18 14:03:18 2015
  $LAST_CHANGE : Tue Dec 15 14:09:15 2015
  $IMAGE_TYPE : Satellite
  $STD_DEV_OBJECT_POINTS : 0.200000
  $STD_DEV_OBJECT_Z_POINTS : 0.400000
  $STD_DEV_IMAGE_POINTS : 0.500000
  $STD_DEV_IMAGE_GC_POINTS : 0.500000
  $SDS_OBJ_GROUP_XY :  -1.000000 -1.000000 -1.000000 -1.000000
  $SDS_OBJ_GROUP_Z :  -1.000000 -1.000000 -1.000000 -1.000000
  $REFRACT_CORR_DEFAULT : off
  $CURV_CORR_DEFAULT : off
  $COORDINATE_SYSTEM :
     PROJCS["WGS 84 / UTM zone 18S",
         GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,
                     AUTHORITY["EPSG","7030"]],
                 AUTHORITY["EPSG","6326"]],
             PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],
             UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],
             AUTHORITY["EPSG","4326"]],
         UNIT["metre",1,AUTHORITY["EPSG","9001"]],
         PROJECTION["Transverse_Mercator"],
         PARAMETER["latitude_of_origin",0],
         PARAMETER["central_meridian",-75],18S
         PARAMETER["scale_factor",0.9996],
         PARAMETER["false_easting",500000],
         PARAMETER["false_northing",10000000],
         AUTHORITY["EPSG","32718"],
         AXIS["Easting",EAST],
         AXIS["Northing",NORTH]]
  $LINEAR_UNITS_OF_OBJECT : m
  $LINEAR_UNITS_OF_IMAGE : pixel
  $ANGULAR_UNITS : deg
  $REPORT_LOGFILE : C:\Users\Jose Manuel\new_report.log
$END

Este sistema también es 2D, porque los proyectados son siempre 2D.

Si intentamos cargar un archivo de estos, Digi3D.NET va a preguntarnos por el SRC de la componente vertical mostrando el siguiente cuadro de diálogo:

Selecciona SRC vertical

y esto lo va a hacer cada vez que carguemos el modelo.

Si queremos evitar que suceda esto, podemos modificar las cadenas WKT que aparecen en los archivos .PRJ y poner una que proporcione información del SRC vertical.

Para ello seguiremos los siguientes pasos:

  1. Seleccionamos la opción del menú Herramientas/Sistema de referencia de coordenadas…
  2. Seleccionamos el SRC que nos interese.
  3. Pulsamos el botón Copiar para que se copie la cadena WKT al portapapeles.
  4. Abrimos el archivo .PRJ con nuestro editor de textos favorito y modificamos la cadena WKT que aparece ahí por la que tenemos en el portapapeles.
Con esto habremos conseguido que Digi3D.NET no nos pregunte cada vez por el SRC vertical del modelo.
Además esto es fundamental si queremos trabajar con coordenadas Z elipsoidales, en cuyo caso tendremos que seleccionar como el SRC Geográfico 3D WGS 84, porque como he indicado antes, no podemos asignar un SRC elipsoidal a un SRC compuesto.
Puedes ver un vídeo en el que explico todo esto a continuación:

Mejoras en el cuadro de diálogo de selección de Sistema de Referencia de Coordenadas en Digi3D.NET

Ejes y copiar al portapapeles en el cuadro de diálogo de selección de sistema de referencia de coordenadas

Hemos realizado dos mejoras en el cuadro de diálogo de selección de Sistema de Referencia de Coordenadas en Digi3D.NET:

  • A partir de ahora, podemos seleccionar el orden de los ejes en los sistemas de coordenadas horizontales que forman parte de los sistema de referencia de coordenadas compuestos Proyectado + Vertical.
  • Ahora podemos almacenar los sistemas de referencia de coordenadas en el portapapeles de Windows.

Hasta ahora únicamente podíamos seleccionar el orden de los ejes en los sistemas Geográfico 3D y en Geográfico + Vertical. Ahora podemos también seleccionar el orden de los ejes en Proyectado + Vertical.

Podemos seleccionar una de las siguientes opciones:

  • Estándar (se obtendrá el orden de los ejes de la base de datos EPSG).
  • Este, Norte (se forzará a que el primer eje sea el que apunte a Este y el segundo el que apunta a Norte).
  • Norte, Este (se forzará a que el primer eje sea el que apunta a Norte y el segundo el que apunta a Este).

Para hacer que se copie la cadena WKT al portapapeles, tan solo tenemos que pulsar el botón Copiar que aparece en las distintas páginas del cuadro de diálogo.

 

Carga nativa de orientaciones satelitales de archivos de proyecto de Inpho

Acabamos de añadir a Digi3D.NET la carga nativa de archivos de proyecto de Inpho (*.prj) con polinomios RPC para imágenes satelitales.

De esta manera, Digi3D.NET puede trabajar con aerotriangulaciones calculadas con Inpho de forma completamente transparente para el usuario.

Este importador de orientaciones se une a los ya existentes en Digi3D.NET, de modo que ya se pueden cargar sin necesidad de tener que utilizar ningún importador orientaciones de los siguientes programas:

Extensión del archivo Software/Satélite
 *_rpc.txt Iconos/GeoEye
*.xml QuickBird/WorldView I/WorldView II
RPC* Alos
*.blk Leica Photogrammetric Suite (LPS)
*.sup Socet Set
*.smtxml Summit Evolution
*.prj Inpho

Cambios en el sistema de cámaras

Debido a la incorporación del modelo de corrección de distorsiones en cámaras calibradas con Pix4D, PhotoScan y con OpenCV, hemos realizado una serie de cambios en el concepto de cámara en Digi3D.NET.

Los cambios realizados son internos y hemos mantenido compatibilidad hacia atrás, de manera que las cámaras creadas a día de hoy se seguirán comportando de la misma manera.

Un restituidor digital como Digi3D.NET básicamente muestra imágenes centrando un determinado pixel de estas imágenes en el centro de la ventana fotogramétrica. Cuando mueves el dispositivo de entrada (manivelas, topomouse, ratón, etc.) se incrementan o decrementan valores a las Coordenadas Terreno y el sensor correspondiente se encarga de transformar dichas Coordenadas Terreno a Coordenadas Pixel en las que se tendrá que centrar cada imagen mostrada en la Ventana Fotogramétrica, de modo que la responsabilidad de transformar de Coordenadas Terreno a Coordenadas Pixel recae en los sensores (que en Digi3D.NET están implementados como extensiones).

Cada sensor (ADS, Satelital, Cámaras Cónicas, etc.) pasa por una serie de cálculos (específicos del modelo matemático del sensor) para cumplir esa misión: Transformar de Coordenadas Terreno a Coordenadas Pixel.

Los cambios que hemos introducido aquí se aplican al Sensor Cónico (el de cámaras pinhole), el resto de sensores no se han tocado.

Veamos cómo se comportaba hasta hoy este sensor para transformar de Coordenadas Terreno a Coordenadas Pixel:

Cámaras antiguo

La Orientación Exterior tenía como parámetros de entrada Coordenadas Terreno (Xt, Yt, Zt) y como salida proporcionaba Coordenadas Foto (Xfo, Yfo). Para conseguir esto, la Orientación Exterior tenía que conocer con qué cámara estamos trabajando, pues en el cálculo para obtener Coordenadas Foto interviene la Focal de la cámara. Esto como verás más adelante lo hemos cambiado: ahora la Orientación Exterior es agnóstica en lo referente a la cámara con la que se está trabajando y por lo tanto no tiene conocimiento de que existe una cámara.

La misión de la Cámara era transformar las Coordenadas Foto en Coordenadas Fiducial  (Xfi, Yfi) corrigiendo las distorsiones de la lente si era necesario.

La misión de la Orientación Interna era transformar de Coordenadas Fiducial a Coordenadas Pixel (Xp, Yp).

Las correcciones de distorsión se realizaban en  el paso de Coordenadas Foto a Coordenadas Fiducial únicamente. Además, puedes ver que teníamos que tener si o si una orientación interna.

Resulta que las distorsiones en Pix4D, PhotoScan y las calibraciones obtenidas mediante cualquier programa que utilice la librería de visión artificial OpenCV no corrigen las distorsiones en el sistema foto, sino que se corrigen en el Sistema Cámara Proyectado. Además, no es necesaria una orientación interna pues el modelo matemático para estas cámaras transforma directamente a coordenadas pixel.

Veamos cómo se comporta el sensor cónico de Digi3D.NET para transformar de Coordenadas Terreno a Coordenadas Pixel una vez realizados los cambios que presentamos hoy:

Cámaras nuevo global

Ahora la orientación exterior no devuelve Coordenadas Foto (Xfo, Yfo), sino que devuelve Coordenadas en el Sistema Cámara (Xcam, Ycam, Zcam). La misión de las Cámaras ahora es convertir esas Coordenadas en el Sistema Cámara a Coordenadas Pixel (Xp, Yp).

Estudiemos ahora cómo transforma la cámara de Coordenadas en el Sistema Cámara a Coordenadas Pixel:

Cámaras nuevo detallado.PNG

Lo primero que hacemos es convertir de Coordenadas en el Sistema Cámara a Coordenadas Proyectadas en el Sistema Cámara (dividiendo tanto la componente X como la Y por la Z).

Luego transformamos de Coordenadas Proyectadas en el Sistema Cámara a Coordenadas Foto. Las implementaciones de Pix4D, PhotoScan y OpenCV corrigen las distorsiones en este paso. En esta fase se tiene en cuenta la focal (o mejor dicho, las focales de la cámara, porque ahora se pueden introducir dos focales si es necesario (si la cámara está calibrada en píxeles y el sensor es barato, es posible que el ancho del pixel no coincida con el alto del pixel, por lo tanto obtenemos dos focales distintas).

Continuamos transformando de Foto a Fiducial. Es en esta fase donde Digi3D.NET calculaba las distorsiones. Las cámaras Pix4D, PhotoScan y OpenCV básicamente suman aquí las coordenadas del punto principal.

Y por último se transforman las Coordenadas Fiducial a Coordenadas Pixel. Si la cámara es analógica, aquí es donde se tiene en cuenta la orientación interna, y si no, pues básicamente se multiplican las Coordenadas Fiducial por el tamaño del pixel y se les suma la coordenada del pixel central de la imagen (que es el 0,0 en el sistema fiducial).

Digi3D.NET ahora carga de forma nativa archivos de Pix4D (en breve de PhotoScan y de OpenCV si es que existe algún formato estandarizado para OpenCV, lo tengo que estudiar), de modo que no tienes que hacer nada más que cargar el archivo de cámara correspondiente y Digi3D.NET se encarga de todo, tal y como puedes ver en la entrada del blog Carga nativa de archivos de calibración de cámaras de Pix4D, sin embargo, hemos modificado también los archivos de cámara de Digi3D.NET para que puedas crear un archivo de cámara en formato Digi3D.NET y que funcione igual que el de Pix4D por ejemplo.

Veamos a continuación cómo han quedado esos parámetros:

Variable Valor Valor por defecto Descripción
Focal
  • Si la focal tiene las mismas dimensiones en X y en Y, un único valor con el valor de la focal.
  • Si la focal tiene distintas dimensiones en X y en Y, dos valores: uno para la focal en X y otro para la focal en Y.
N/A Focal calibrada de la cámara. Las unidades de este valor definen las unidades del resto de valores en el archivo de cámara, lo que quiere indicar que si ponemos este valor en milímetros, las unidades del resto de variables deberán estar en milímetros. De puede introducir aquí un valor en cualquier unidad, con la condición de que el resto de variables utilicen la misma unidad.
TipoCorreccion
  • CamaraAFoto
  • FotoAFiducial
FotoAFiducial Indica en que paso se va a realizar la corrección de distorsiones de la cámara. Por defecto este valor es CamaraAFoto para mantener compatibilidad hacia atrás.
TipoDistorsionTangencial
  • No.
    Si no se quiere aplicar distorsión tangencial.
  • Brown.
    Si se quiere aplicar la siguiente fórmula:∆x = P1*(r2 + 2*x2)+2*P2*x*y
    ∆y = 2*P1*x*y + P2*
    (r2 + 2*y2)
  • OpenCV.
    Si se quiere aplicar la siguiente fórmula:∆x = 2*P1*x*y + P2*(r2 + 2*x2)

    ∆y = 2*P2*x*y + P1*(r2 + 2*y2)
  • Si no se especifica esta variable ni las variables P1 y P2, el valor por defecto es No.
  • Si no se especifica esta variable y en el archivo de cámara aparecen valores para las variables P1 y P2, por compatibilidad hacia atrás el valor por defecto es Brown.
Indica el tipo de corrección tangencial a aplicar. Estas distorsiones aparecen por una mala alineación entre la lente y el sensor.
TipoDesortogonalidad
  • No.
    Si no se desea aplicar desortogonalidad.
  • Fraser.
    Si se desea aplicar desortogonalidad en el eje de la X mediante la fórmula:∆x = B1*x + B2*y
  • Si no se especifica
  • esta variable ni las variables B1 y B2, el valor por defecto es No.
  • Si no se especifica esta variable pero si se especifican las variables B1 y B2, el valor por defecto es Fraser
Indica el tipo de desortogonalidad (por una mala fabricación del sensor CCD en el que puede que los píxeles no tengan el mismo ancho que alto o que la matriz de píxeles no esté perfectamente alineada.

Te muestro a continuación el código fuente de la función que calcula la corrección por distorsión para que quede claro cómo se calculan las distorsiones en Digi3D.NET (está programado en C++, pero aunque no entiendas de programación creo que haces un mínimo esfuerzo por entenderlo lo vas a ver claro):

CódigoCalculaCorreccionDistorsion

De esta manera puedes ver cómo intervienen todos los parámetros del archivo de cámara.

Vemos ahora un caso práctico: Vamos a crear un archivo de cámara en formato Digi3D.NET que simule el siguiente archivo de cámara de Pix4D:

Pix4D camera calibration file 0
#Focal Length mm assuming a sensor width of 23.64864599999999938973x15.76576400000000077739mm
F 25.21219253120580461314
#Principal Point mm
Px 11.78574296804639587322
Py 7.57715224585386515344
#Symmetrical Lens Distortion Coeffs
K1 0.00086121816472929343
K2 0.02791840536682562574
K3 -0.03806069473095977096
#Tangential Lens Distortion Coeffs
T1 -0.00621590311996760014
T2 -0.00051873958437360630

Puedes comprobar que aparece (como comentario) el tamaño del sensor en milímetros. No aparece por ningún sitio el tamaño del pixel, ni el tamaño de las imágenes.

Si te fijas en el archivo de calibración se indica que el ancho del sensor es mayor que el alto del sensor, lo que significa que la cámara se ha calibrado en horizontal y las fotos obtenidas con esta cámara deberían ir siempre en horizontal (desactivar la opción de rotado automático), y así habría que cargarlas en Digi3D.NET.

Esta cámara en particular crea imágenes de 6000×4000 píxeles, de modo que el tamaño de píxel en horizontal y en vertical se puede deducir fácilmente dividiendo el ancho del sensor por el número de píxeles en horizontal por un lado y el alto del sensor por el número de píxeles en vertical de la imagen dando los siguientes resultados

23.648646 / 6000 = 0.003941441
15.765764 / 4000 = 0.003941441

Por lo tanto el tamaño de píxel en horizontal es igual que en vertical. Comencemos a crear nuestro archivo de cámara:

[Camara]
TamanoPixel=0.003941441

La focal se indica claramente que va en milímetros también, así que la copiamos tal cual

[Camara]
TamanoPixel=0.003941441
Focal=25.21219253120580461314

Continuamos con el punto principal. El punto principal en Pix4D se da con respecto a la esquina superior izquierda de la imagen, y no con respecto al centro fiducial como estamos acostumbrados, de modo que tenemos que hacer una simple resta (coordenadas que aparecen en el archivo de Pix4D menos coordenadas del centro fiducial de la cámara) para transformar ese punto principal a un punto principal con respecto al centro fiducial que es como lo requiere Digi3D.NET. Los ejes X e Y crecen de forma distinta, por lo tanto verás que en la Y la operación se hace al revés.

PuntoPrincipalXConRecpectoAlCentroFiducial = PuntoPrincipalXConRecpectoEsquinaSuperiorIzquierda - CentroFiducialX

PuntoPrincipalYConRecpectoAlCentroFiducial = CentroFiducialY - PuntoPrincipalYConRecpectoEsquinaSuperiorIzquierdaY

Y el centro fiducial es muy sencillo: o dividimos entre dos el ancho y alto del sensor por un lado, o dividimos entre dos el tamaño de la imagen (el resultado nos dará en píxeles obviamente) y multiplicamos el valor por el tamaño de pixel calculado anteriormente. Voy a utilizar una fórmula para la X y otra para la Y, así las tienes las dos:

CentroFiducialX = 23.64864599999999938973 / 2 = 11.824323
CentroFiducialY = 4000 / 2 * 0.003941441 = 7.882882

Perfecto, ahora a restar y tenemos las coordenadas del punto principal con respecto al centro fiducial:

PuntoPrincipalXConRecpectoAlCentroFiducial  = 11.78574296804639587322 - 11.824323 = -0.038580032
PuntoPrincipalYConRecpectoAlCentroFiducial  = 7.882882 - 7.57715224585386515344 = 0.3057297541462

Continuamos pues con nuestro archivo de cámara:

[Camara]
TamanoPixel=0.003941441
Focal=25.21219253120580461314
PuntoPrincipal=-0.038580032 0.3057297541462

Si estudiamos las fórmulas utilizadas por Pix4D  comprobaremos que éste realiza la corrección de distorsión en el paso de Coordenadas Cámara Proyectadas a Coordenadas Focal, y que además el polinomio utilizado para las distorsiones radiales es K1_R2_K2_R4, además se utiliza como tipo de distorsión tangencial el método de OpenCV y que no se tiene en cuenta la desortogonalidad, de modo que el archivo de cámara queda de la siguiente manera:

[Camara]
TamanoPixel=0.003941441
Focal=25.21219253120580461314
PuntoPrincipal=-0.038580032 0.3057297541462
TipoCorreccion=CamaraAFoto
Pol=K1_R2_K2_R4
TipoDistorsionTangencial=OpenCV
TipoDesortogonalidad=No
K1=0.00086121816472929343
K2=0.02791840536682562574
K3=-0.03806069473095977096
P1=-0.00621590311996760014
P2=-0.00051873958437360630

Y a continuación tienes un vídeo en el que se demuestra que con este archivo de cámara los resultados son idénticos que con la cámara nativa de Pix4D.