Transformación del GPS a ED 1950 UTM 31N

Topics: Español
Apr 1, 2008 at 7:13 PM
Buenas,

No consigo hacer esta transformación ni por asomo.
Tengo los datos que me vienen del GPS (WGS84) pero no consigo transformarlos a ED 1950 31N.
Sólo quiero transformar los puntos de forma individual. ¿Me podríais ayudar?
Las líneas de código que actualmente pongo son las siguientes:

SharpMap.CoordinateSystems.CoordinateSystemFactory cFac = new SharpMap.CoordinateSystems.CoordinateSystemFactory();
GeoAPI.CoordinateSystems.IGeographicCoordinateSystem gcs = SharpMap.CoordinateSystems.GeographicCoordinateSystem.WGS84;
GeoAPI.CoordinateSystems.IProjectedCoordinateSystem coordsys = CreateUtmProjection(31);
GeoAPI.CoordinateSystems.Transformations.ICoordinateTransformation trans = new SharpMap.CoordinateSystems.Transformations.CoordinateTransformationFactory().CreateFromCoordinateSystems(coordsys, gcs);
GeoAPI.Geometries.IPoint pnt1 = SharpMap.CoordinateSystems.Transformations.GeometryTransform.TransformPoint(SharpMap.Converters.Geometries.GeometryFactory.CreatePoint(dcLon, dcLat), trans.MathTransform);


donde:
private IProjectedCoordinateSystem CreateUtmProjection(int utmZone)
{
CoordinateSystemFactory cFac = new SharpMap.CoordinateSystems.CoordinateSystemFactory();

//Create geographic coordinate system based on the WGS84 datum
IEllipsoid ellipsoid = cFac.CreateFlattenedSphere("WGS 84", 6378137, 298.257223563, LinearUnit.Metre);
IHorizontalDatum datum = cFac.CreateHorizontalDatum("WGS1984", DatumType.HDGeocentric, ellipsoid, null);
IGeographicCoordinateSystem gcs = cFac.CreateGeographicCoordinateSystem("WGS 84", AngularUnit.Degrees, datum, PrimeMeridian.Greenwich, new AxisInfo("Lon", AxisOrientationEnum.East),
new AxisInfo("Lat", AxisOrientationEnum.North));

//Create UTM projection
List<ProjectionParameter> parameters = new List<ProjectionParameter>(5);
parameters.Add(new ProjectionParameter("latitudeoforigin", 0));
parameters.Add(new ProjectionParameter("central_meridian", -183 + 6 * utmZone));
parameters.Add(new ProjectionParameter("scale_factor", 0.9996));
parameters.Add(new ProjectionParameter("false_easting", 500000));
parameters.Add(new ProjectionParameter("false_northing", 0.0));
IProjection projection = cFac.CreateProjection("Transverse Mercator", "Transverse_Mercator", parameters);

return cFac.CreateProjectedCoordinateSystem("WGS 84 / UTM zone " + utmZone.ToString() + "N", gcs, projection, LinearUnit.Metre, new AxisInfo("East", AxisOrientationEnum.East), new AxisInfo("North", AxisOrientationEnum.North));
}

Gracias por adelantado
Apr 2, 2008 at 7:18 AM
Hola, todavía te faltan cosas por hacer. En este caso, como se trata de un cambio de datum (WGS84 -> ED50) y, supongo, que las coordenadas del gps son geográficas (lat/lon), tienes que hacer estas transformaciones:

WGS84geografica(lat/lon/alt) -> WGS84geocentrica(x,y,z) -> ED50geocentrica(x,y,x) -> ED50geografica(lat/lon/alt) -> ED50utm (x,y)

La altitud (alt/z) es opcional, puedes dejarla a 0 siempre que no necesites mucha precisión en el resultado.

Aún hay una cosa más: cuando definas el datum para ED50 has de suministrar los parámetros del desplazamiento del datum (Wgs84ConversionInfo). Estos parámetros son dependientes de la zona geográfica, en la web del IGN/CNIG http://www.cnig.es/ tienes mucha información y utilidades, pero para tu caso concreto, huso 31, estos parámetros pueden servirte:
ed50Datum.Wgs84Parameters = new Wgs84ConversionInfo(-181.5, -90.3, -187.2, 0.144, 0.492, -0.394, 17.57)

Si buscas un poco no tendrás dificultad en encontrar ejemplos, usando Sharpmap, de transformación de coordenadas y proyecciones con cambio de datum. Echa un vistazo en http://www.codeplex.com/ProjNET/Wiki/View.aspx?title=FAQ&referringTitle=Home

Ánimo, no es tan difícil como parece
Apr 2, 2008 at 8:14 AM
Pues así a simple vista casi que acojona... ;-)

Voy a pelearme un rato a ver si lo consigo sacar. Ya os comento. Gracias