CoordinateTransformation
Espacio de nombres: Digi21.CoordinateSystems
Ensamblado: Digi21.CoordinateSystems
Transformación de coordenadas de un sistema de referencia de coordenadas a otro.
public sealed class CoordinateTransformation : IDisposable
La transformación sostiene memoria de la biblioteca nativa. Llama a Dispose (o usa using) cuando ya no la necesites; si no, la libera el recolector de basura.
Métodos estáticos
Create
public static CoordinateTransformation Create(CoordinateSystem source, CoordinateSystem target)
public static CoordinateTransformation Create(CoordinateSystem source, CoordinateSystem target, TransformationOptions options)
Crea la transformación de source a target. options indica cómo se elige la operación cuando la base de datos de EPSG tiene varias y cómo se crea una transformación vertical que la base de datos no tiene; sin options, o si es null, se usa TransformationOptions.BestAccuracy.
| Excepción | Cuándo |
|---|---|
ArgumentNullException |
source o target es null. |
InvalidOperationException |
options es TransformationOptions.Interactive y el hilo no es el principal de Digi3D.AI. |
TransformationNotFoundException |
No hay ninguna transformación entre los dos sistemas, o no se puede construir (por ejemplo, porque falta el archivo de una rejilla NTv2). |
CoordinateSystemException |
El usuario cancela un cuadro de diálogo, o el delegado SelectOperation devuelve un código que no está entre las operaciones que recibe. |
Una excepción que lance uno de los delegados de options sale de Create sin cambios: es la misma instancia, con su pila.
Propiedades
| Propiedad | Descripción |
|---|---|
CoordinateSystem Source |
Sistema de origen. |
CoordinateSystem Target |
Sistema de destino. |
string Name |
Nombre de la transformación, o una cadena vacía. |
string AreaOfUse |
Descripción del área de uso, o una cadena vacía. |
int SourceDimension |
Número de coordenadas que recibe la transformación. |
int TargetDimension |
Número de coordenadas que devuelve la transformación. |
bool IsIdentity |
true si la transformación no cambia las coordenadas. |
CoordinateTransformation Inverse |
Transformación inversa, de Target a Source. Se crea la primera vez que se pide y se libera con esta transformación. |
Métodos
| Método | Descripción |
|---|---|
Point2D Transform(Point2D point) |
Transforma un punto 2D. |
Point3D Transform(Point3D point) |
Transforma un punto 3D. |
void Transform(Span<Point3D> points) |
Transforma los puntos sobre el mismo bloque de memoria. |
void Transform(ReadOnlySpan<Point3D> source, Span<Point3D> destination) |
Transforma los puntos de source y los escribe en destination, que puede solaparse con source. Lanza ArgumentException si destination es más corto. |
void Transform(Span<double> coordinates, int dimension) |
Transforma coordenadas guardadas seguidas (x0, y0, x1, y1… con dimension 2, o x0, y0, z0… con dimension 3) sobre el mismo bloque de memoria. |
void Dispose() |
Libera la transformación y su inversa. Después, Transform e Inverse lanzan ObjectDisposedException. |
Los métodos Transform lanzan CoordinateSystemException si un punto no se puede transformar, por ejemplo porque está fuera del área de una rejilla. En las sobrecargas con Span que transforman sobre el mismo bloque, los puntos anteriores al que falla ya están transformados y los siguientes no; el mensaje indica el índice del punto.
Dimensiones
- Si el sistema de destino tiene dos dimensiones, la
Zde unPoint3Dtransformado es laZde entrada sin cambios. - Si el sistema de origen tiene dos dimensiones, la
Zde entrada no se usa para transformar. - Si el sistema de origen es vertical (una dimensión), solo se transforma la
Z, yTransform(Point2D)yTransform(Span<double>, 2)lanzanInvalidOperationException.
Ejemplo
using Digi21.CoordinateSystems;
using Digi21.Math;
var ed50 = CoordinateSystem.FromEpsg(23030);
var etrs89 = CoordinateSystem.FromEpsg(25830);
using var transformación = CoordinateTransformation.Create(ed50, etrs89);
Point3D[] puntos = LeePuntos();
transformación.Transform(puntos); // de ED50 a ETRS89, sobre el mismo vector
var original = transformación.Inverse.Transform(puntos[0]);