Προς το περιεχόμενο
  • 0
Συνδεθείτε  
georginos1989

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

Ερώτηση

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

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

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

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

 

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

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

11 απαντήσεις σε αυτή την ερώτηση

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

  • 0

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

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

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

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

χρησιμοποιείς κάποιο πρόγραμμα όπως το 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

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

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

 

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

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

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

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

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

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

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

 

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

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

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

 

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

 

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

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

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Μετατροπή από 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

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

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

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες
  • 0

Ναι, χρειάζεται μετασχηματισμό. Το Link.png Site: GDAL τα κάνει πολύ ωραία όλα αυτά που αφορούν raster.

Κοινοποιήστε αυτήν την ανάρτηση


Σύνδεσμος στην ανάρτηση
Κοινοποίηση σε άλλες σελίδες

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

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

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

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

Εγγραφείτε για έναν νέο λογαριασμό

Σύνδεση

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

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

Χρήσιμες πληροφορίες

Με την περιήγησή σας στο insomnia.gr, αποδέχεστε τη χρήση cookies που ενισχύουν σημαντικά την εμπειρία χρήσης.