Προς το περιεχόμενο

Μετατροπή συντεταγμένων σε ΕΓΣΑ 87


georginos1989

Προτεινόμενες αναρτήσεις

Έχω ένα πρόγραμμα στο οποίο κρατάω για διάφορα σημεία τις συντεταγμένες τους από το Google maps σε WGS84 (Δεκαδικές Μοίρες). Το πρόγραμμα είναι σε android.

Αυτό που θέλω να κάνω είναι να κρατάω και τις συντεταγμένες των σημείων σε ΕΓΣΑ 87.

Εχω ψαξει για τυπους για την μετατροπη αλλά δεν έχω βγάλει άκρη.

Μήπως μπορείτε να βοηθήσετε;

 

Δε ζητάω τον κώδικα σε android πως θα γίνει έτοιμο απλά θέλω να μου πείτε κανέναν τύπο για την μετατροπή γιατί έχω χαθεί

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

μπορείς να κατεβάσεις αυτήν την εφαρμογή (https://play.google.com/store/apps/details?id=gr.stasta.egsa) που με βάση το gps του κινητού χτυπάς σημεία και στα βγάζει σε ΕΓΣΑ 87. Εκτός αν κατάλαβα λάθος και θες κάτι άλλο

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ναι δε θέλω έτοιμη εφαρμογή. θέλω στο προγραμμα που φτιάχνω εγώ να κάνω την μετατροπή κάθε φορά, Και τα σήμεια δε χρησιμοποιώ gps για να τα βρω αλλά τα βρίσκω από το χαρτη

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

χρησιμοποιείς κάποιο πρόγραμμα όπως το arcgis?

 

βασικά δοκίμασε κάποιο από τα παρακάτω σιτε

 

http://www.miniwind.gr/metatropi-geografikon-syntetagmenon/

 

http://getahome.gr/iCoord.htm

 

http://itia.ntua.gr/~soulman/icoordstrans/

 

http://coordtrans.com/coordtrans/index.asp?platform=winxp&v=2.30&ref=app

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ρε σεις δε θέλω κάποιο εξωτερικό πρόγραμμα. θέλω στο δικό μου προγραμμα να γίνονται αυτά και όχι δεν χρησιμοποιώ arcgis. To google maps εχω για χαρτη και απο εκει παιρνω συντεταγμένες τις οποίες κάθε φορά θέλω μετατρέπονται στο πρόγραμμα μόνες τους σε EΓΣΑ 87

 

Αυτό το λινκ το ειχα δει αλλα δεν εβγαλα ακρη

http://itia.ntua.gr/~soulman/icoordstrans/

αν μπορεις να δωσεις κανα hint

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

hint δεν έχω να δώσω αλλά φαντάζομαι στο excel που δίνει κάτι θα φαίνεται από καμιά μετατροπή

 

αλλιώς μπορείς να χρησιμοποιήσεις arcgis sdk που σου είπανε

 

θα κάνεις point

 

Link.png Site: http://developers.arcgis.com/en/android/api-reference/reference/com/esri/core/geometry/Point.html#Point%28double,%20double%29">point

 

και μετά project

 

Link.png Site: http://developers.arcgis.com/en/android/api-reference/reference/com/esri/core/geometry/GeometryEngine.html#project%28com.esri.core.geometry.Geometry,%20com.esri.core.geometry.SpatialReference,%20com.esri.core.geometry.SpatialReference%29">project



επίσης αν θες να το ψάξεις παραπάνω το εγσα87 λέγεται και ggrs87 και epsg2100

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Tο Link που σου έδωσε ο Warlock έχει κώδικα και συνοπτική θεωρία. Επίσης σου έχει (πολλά) έτοιμα εργαλεία για να τεστάρεις αν αυτό που έκανες είναι σωστό. Ο κώδικας είναι σε C και είναι αρκετά straight-forward. Τίποτα που να μη διαβάζεται. Δεν πρέπει να έχεις προβλημα να το μετατρέψεις σε Java.

 

ps. Το xls απλά καλεί το dll.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

αυτό είναι πιο κοντά στη java

 

http://studentguru.gr/b/kokyri/archive/2012/02/21/convert-coordinates-from-greek-grid-ggrs87-87-espg-2100-to-latitude-longitude-wsg84.aspx

 

αλλά δεν ξέρω αν είναι σωστό

δεν τα έχω κάνει ποτέ με το χέρι

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Μετατροπή από WGS84 decimal degrees σε ΕΓΣΑ87 και το ανάποδο σε C#:

 

public class WGS84ToEGSA87
{
	public static Vector GetEGSA(Vector wgsVector)
	{
		double phi = wgsVector.Y, lambda = wgsVector.X;

		double[] d = displace_geodetic_system(DegToRad(phi), DegToRad(lambda), 199.72, -74.03, -246.02);
		d = gr87_philambda_to_xy(d[0], d[1]);

		return new Vector(d[0], d[1], 0);
	}

	public static Vector GetWGS84(Vector egsa87Vector)
	{
		double t, n2, f0, N0, P, P2;
		double[] phi_lambda = new double[2];

		double phi = 0, lambda = 0;

		egsa87Vector.X = egsa87Vector.X - x0;
		f0 = fit(egsa87Vector.Y);
		N0 = ellipsoid_main_normal_section_radius(f0);
		t = System.Math.Tan(f0);
		n2 = et2 * System.Math.Cos(f0) * System.Math.Cos(f0);
		P = egsa87Vector.X / (kappa0 * N0);
		P2 = P * P;
		phi = ((-(61 + 90 * t * t + 45 * t * t * t * t) * P2 / 720 + (5 + 3 * t * t + 6 * n2 - 3 * n2 * n2 - 6 * t * t * n2 - 9 * t * t * n2 * n2) / 24) * P2 - (1 + n2) / 2) * P2 * t + f0;
		lambda = (((5 + 6 * n2 + 28 * t * t + 8 * t * t * n2 + 24 * t * t * t * t) * P2 / 120 - (1 + 2 * t * t + n2) / 6) * P2 + 1) * P / System.Math.Cos(f0) + lambda0;
		double gamma = egsa87Vector.X * t / (kappa0 * N0) - t * (1 + t * t - n2 - 2 * n2 * n2) * egsa87Vector.X * egsa87Vector.X * egsa87Vector.X / (3 * kappa0 * kappa0 * kappa0 * N0 * N0 * N0) + t * (2 + 5 * t * t + 3 * t * t * t * t) * System.Math.Pow(egsa87Vector.X / (kappa0 * N0), 5) / 15;
		phi_lambda[0] = phi;
		phi_lambda[1] = lambda;

		double denominator = 180.0 / System.Math.PI;
		return new Vector(phi_lambda[1] * denominator, phi_lambda[0] * denominator, 0);
	}

	private static double[] displace_geodetic_system(double phi, double lambda, double dx, double dy, double dz)
	{
		double[] myphi_lambda = new double[2];
		double x = ellipsoid_main_normal_section_radius(phi) * System.Math.Cos(phi) * System.Math.Cos(lambda);
		double y = ellipsoid_main_normal_section_radius(phi) * System.Math.Cos(phi) * System.Math.Sin(lambda);
		double z = ellipsoid_main_normal_section_radius(phi) * (1 - e2) * System.Math.Sin(phi);
		x = x + dx;
		y = y + dy;
		z = z + dz;
		double radius;
		double radius_old;
		double acount;
		radius = BigSemiaxis;
		if (System.Math.Abs(z) < radius)
		{
			phi = System.Math.Asin(z / radius);
		}
		else if (z > 0)
		{
			phi = 1.5707963267948966;
		}
		else
		{
			phi = -1.5707963267948966;
		}
		if (System.Math.Abs(x) > 0.001)
		{
			lambda = System.Math.Atan(y / x);
		}
		else if (y > 0)
		{
			lambda = 1.5707963267948966;
		}
		else
		{
			lambda = -1.5707963267948966;
		}
		if (x < 0)
		{
			lambda = 3.141592653589793 - lambda;
		}
		phi = System.Math.Atan(z * (1 + et2) / System.Math.Sqrt(x * x + y * y));
		acount = 0;

		do
		{
			acount++;
			radius_old = radius;
			radius = ellipsoid_main_normal_section_radius(phi);
			phi = System.Math.Atan((z + e2 * radius * System.Math.Sin(phi)) / System.Math.Sqrt(x * x + y * y));
		}
		while (System.Math.Abs(radius - radius_old) > 0.00005 && acount < 100);
		myphi_lambda[0] = phi;
		myphi_lambda[1] = lambda;
		return myphi_lambda;
	}

	private static double DegToRad(double deg)
	{
		return deg / 180 * System.Math.PI;
	}

	static double BigSemiaxis = 6378137;
	static double kappa0 = 0.9996,
		lambda0 = 0.418879020478639098,
		x0 = 500000,
		f = 1 / 298.257223563,
		e2 = 1 - (1 - f) * (1 - f),
		et2 = 1 / ((1 - f) * (1 - f)) * e2;

	private static double[] gr87_philambda_to_xy(double phi, double lambda)
	{
		double t, n2, L, dl, Ni, Mi;
		double[] myxy = new double[2];
		double x = 0;
		double y = 0;
		dl = lambda - lambda0;
		t = System.Math.Tan(phi);
		n2 = e2 * System.Math.Cos(phi) * System.Math.Cos(phi) / (1 - e2);
		L = dl * System.Math.Cos(phi);
		Ni = ellipsoid_main_normal_section_radius(phi);
		Mi = ellipsoid_arc(phi);
		x = (((5 - 18 * t * t + t * t * t * t + 14 * n2 - 58 * t * t * n2) * L * L / 120 + (1 - t * t + n2) / 6) * L * L + 1) * L * kappa0 * Ni + x0;
		y = Mi + (Ni * t / 2) * L * L + (Ni * t / 24) * (5 - t * t + 9 * n2 + 4 * n2 * n2) * L * L * L * L + (Ni * t / 720) * (61 - 58 * t * t) * L * L * L * L * L * L;
		y = y * kappa0;
		double gamma = t * L + t * L * L * L * (1 + 3 * n2 + 4 * n2 * n2) / 3 + t * (2 - t * t) * L * L * L * L * L / 15;
		myxy[0] = x;
		myxy[1] = y;
		return myxy;
	}

	static double ellipsoid_main_normal_section_radius(double phi)
	{
		double ellipsoid;
		ellipsoid = BigSemiaxis / System.Math.Sqrt(1 - e2 * System.Math.Sin(phi) * System.Math.Sin(phi));
		return ellipsoid;
	}

	static double ellipsoid_arc(double phi)
	{
		double M0, M2, M4, M6, M8, e4, e6, e8;
		double returnvalue;
		e4 = e2 * e2;
		e6 = e4 * e2;
		e8 = e6 * e2;
		M0 = 1 + 0.75 * e2 + 0.703125 * e4 + 0.68359375 * e6 + 0.67291259765625 * e8;
		M2 = 0.375 * e2 + 0.46875 * e4 + 0.5126953125 * e6 + 0.538330078125 * e8;
		M4 = 0.05859375 * e4 + 0.1025390625 * e6 + 0.25 * e8;
		M6 = 0.01139322916666667 * e6 + 0.025634765625 * e8;
		M8 = 0.002408551504771226 * e8;
		returnvalue = BigSemiaxis * (1 - e2) * (M0 * phi - M2 * System.Math.Sin(2 * phi) + M4 * System.Math.Sin(4 * phi) - M6 * System.Math.Sin(6 * phi) + M8 * System.Math.Sin(8 * phi));
		return returnvalue;
	}

	static double fit(double aphi)
	{
		double l, phi0, phi0_old;
		int acount;
		l = aphi / kappa0;
		phi0 = l / BigSemiaxis;
		acount = 0;
		do
		{
			acount++;
			phi0_old = phi0;
			phi0 = phi0 + (l - ellipsoid_arc(phi0)) / ellipsoid_main_normal_section_radius(phi0);
		}
		while (System.Math.Abs(phi0 - phi0_old) > 1e-17 && acount < 100);
		return phi0;
	}
}

Vector είναι ένα απλό struct το οποίο έχει X & Y. Οι μέθοδοι είναι:
public static Vector GetEGSA(Vector wgsVector)

και

public static Vector GetWGS84(Vector egsa87Vector)



Μετατροπή από WGS84 decimal degrees σε Link.png Site: http://spatialreference.org/ref/sr-org/6864/">Spherical Mercator (προβολικό Google Maps, Bing Maps, Yahoo Maps κλπ.) σε C#:

 

public class Mercator
{
    public static Vector GetMercator(Vector wgs84)
    {
        double x = wgs84.X * 20037508.34 / 180;
        double y = System.Math.Log(System.Math.Tan((90 + wgs84.Y) * System.Math.PI / 360.0)) / (System.Math.PI / 180.0);
        y = y * 20037508.34 / 180;

        return new Vector(x, y, 0);
    }

    public static Vector GetInverseMercator(Vector mercator)
    {
        double lon = (mercator.X / 20037508.34) * 180;
        double lat = (mercator.Y / 20037508.34) * 180;

        lat = 180 / System.Math.PI * (2 * System.Math.Atan(System.Math.Exp(lat * System.Math.PI / 180)) - System.Math.PI / 2);

        return new Vector(lon, lat, 0);
    }
}


Έχω δοκιμάσει τον παραπάνω κώδικα και με επιτυχία έχω μετατρέψει χάρτες από ΕΓΣΑ87 σε WGS84 και στη συνέχεια σε Spherical Mercator και κάθονται ακριβώς σε Google Maps υπόβαθρο.



Btw για μετασχηματισμούς μεταξύ προβολικών συστημάτων να κοιτάξεις το Link.png Site: http://trac.osgeo.org/proj/">Proj4

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 1 χρόνο αργότερα...

Οι φώτο απο satellite επηρεάζονται απο το projection ;Δηλαδη αν θελουμε να βαλουμε μια φωτογραφία και να δουλέψει σε αλλο συστημα συντεταγμένων θα πρέπει να αλλάξει ;

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...