Trasformare Coordinate in Latitudine Longitudine

Topics: General Topics, Italiano, SharpMap v2.0
Nov 9, 2007 at 10:19 AM
Ciao a tutti, è da poco che utilizzo sharpmap per un progetto universitario e ho un problema. Ho le coordinate di un punto x, y sulla mappa aventi come unità di misura i metri, e vorrei trasformare queste coordinate in coordinate latitudine e longitudine sessagesimali o anche sessadecimali, ho trovato un piccolo tutorial a questo link: corsiadistanza.polito.it/corsi/pdf/9705S/es7_trasformazione.pdf. Volevo sapere se secondo voi è utile oppure esiste un metodo molto più veloce di questo? Grazie a tutti anticipatamente.
Developer
Nov 9, 2007 at 3:06 PM
http://www.codeplex.com/projnet
Nov 9, 2007 at 4:40 PM
Scusami se insisto, ho dato un'occhiata ma mi sembra che non ci sia la parte che trasforma una coordinata da gauss-boaga a latitudine e longitudine.
Developer
Nov 10, 2007 at 9:30 AM
Se dai una occhiata ai test vedrai degli esempi che recuperano i parametri di conversione da un file SRID.csv, che non è altro che il db EPSG in forma leggibile da Proj.NET.
Ti basta usare i codici EPSG 3003 (Gauss Boaga Est) o 3004 (Gauss Boaga Ovest) per l'imput delle coordinate e 4326 per l'output ed il gioco è fatto.
Se hai altri dubbi usa il forum di Proj.NET
Nov 12, 2007 at 10:27 AM
Ho dato un'occhiata ma purtroppo sto incontrando molte difficoltà nel capire. Siccome sto aggiornando un sistema non sviluppato da me su questa parte sto incontrando molte difficoltà. Di seguito ti scrivo la parte di codice che mi trasforma le coordinate in formato sessadecimale (nella forma Latitudine= 45.484542312313 e longitudine = 16.456113) in coordinate gauss-boaga espresse in metri:

public static IProjectedCoordinateSystem CreateCoordSys()
{
// Costruisco un sistema di coordinate
CoordinateSystemFactory csf = new CoordinateSystemFactory();
// IEllipsoid definisce le informazioni standard memorizzate in un oggetto Ellipsoid
// CreateFlattenedSphere crea un elissoide a partire dal semiasse maggiore e dall'inverso dello schiacciamento.
IEllipsoid ellipsoid = csf.CreateFlattenedSphere("International 1924", 6378388, 297, LinearUnit.Metre);
// IHorizontalDatum è una procedura utilizzata per misurare la posizione sulla superficie della terra
// CreateHorizontalDatum crea un HorizontalDatum a partire da un elissoide e dai parametri Bursa-World
IHorizontalDatum datum = csf.CreateHorizontalDatum("MonteMarioRome", DatumType.HD_Classic, ellipsoid, null);
// IGeographicCoordinateSystem definisce le informazioni standard memorizzate
// in un oggeto con sistema di coordinate geografiche
IGeographicCoordinateSystem gcs = csf.CreateGeographicCoordinateSystem("Monte Mario (Rome)", AngularUnit.Degrees, datum, PrimeMeridian.Rome, new AxisInfo("Lon", AxisOrientationEnum.East), new AxisInfo("Lat", AxisOrientationEnum.North));

List<ProjectionParameter> parameters = new List<ProjectionParameter>(5);
parameters.Add(new ProjectionParameter("latitudeoforigin", 0));
parameters.Add(new ProjectionParameter("central_meridian", 15));
parameters.Add(new ProjectionParameter("scale_factor", 0.9996));
parameters.Add(new ProjectionParameter("false_easting", 2520000));
parameters.Add(new ProjectionParameter("false_northing", 0));
IProjection projection = csf.CreateProjection("TransverseMercator", "TransverseMercator", parameters);

return csf.CreateProjectedCoordinateSystem("Monte Mario (Rome) / Italy zone 2", gcs, projection, LinearUnit.Metre, new AxisInfo("Est", AxisOrientationEnum.East), new AxisInfo("North", AxisOrientationEnum.North));
}

/// <summary>
/// Effettua la conversione di un punto al sistema di coordinate GaussBoaga - Roma40
/// </summary>
/// <param name="geoPoint">Punto in gradi decimali</param>
/// <returns>Punto in GaussBoaga - Roma40</returns>
public static SharpMap.Geometries.Point CreatePointRoma40(SharpMap.Geometries.Point geoPoint)
{
IProjectedCoordinateSystem coordSys = CreateCoordSys();
IGeographicCoordinateSystem gcs = coordSys.GeographicCoordinateSystem;
ICoordinateTransformation trans = new CoordinateTransformationFactory().CreateFromCoordinateSystems(gcs, coordSys);

SharpMap.Geometries.Point pGaussBoaga = trans.MathTransform.Transform(geoPoint);

return pGaussBoaga;
}

Adesso però non riesco a capire come faccio a fare il contrario, cioè da gauss-boaga a sessadecimali. Se per favore mi aiuti a capire te ne sarei grato infinitamente. Grazie.
Developer
Nov 12, 2007 at 12:59 PM
Hai guardato la classe SRIDReader dentro il progetto con i test?
C'è il metodo ICoordinateSystem GetCSbyID(int id), e puoi ottenere i sistemi di riferimento GaussBoaga e WGS84LatLon passandogli gli oppurtuni codici EPSG (3003-3004 e 4326)
Nov 12, 2007 at 2:59 PM
Adesso si, prima non l'avevo vista. In poche parole il metodo ICoordinateSystem GetCSbyID(int id) della classe SRIDReader mi da i sistemi di riferimento WGS84LatLon, quinidi posso salvare da qualche parte questo e posso usare il metodo:

ICoordinateTransformation trans = new CoordinateTransformationFactory().CreateFromCoordinateSystems(gcs, coordSys);

SharpMap.Geometries.Point pGaussBoaga = trans.MathTransform.Transform(geoPoint);

per avere i punti in wgs84. Ho capito bene oppure sono proprio fuori strada? Grazie.
Developer
Nov 12, 2007 at 4:13 PM
direi che ci sei, ma io userei lo SridReader anche per recuperare i valori relativi a GaussBoaga
Developer
Nov 12, 2007 at 4:13 PM
ah giusto un appunto... Proj.Net ha un suo forum e li andrebbero postate le domande...
Nov 12, 2007 at 5:02 PM
si, hai perfettamente ragione, da adesso in poi posterò lì le mie domande. Comunque grazie mille per l'aiuto.