FAQ |
Kalender |
2008-04-20, 18:56 | #1 | ||
|
|||
Nykomling
|
Hej!
Efter ett antal sök-försök på google så måste jag nu ta hjälp på annat sätt. Håller just nu på med ett projekt där jag ska placera ut ett antal punkter i google maps. Koordinaterna till dessa punkter hämtas från ett tredjepartssystem och kommer i formatet RT90. Google maps använder det decimala formatet av WGS84. Med andra ord så måste jag konvertera mellan dessa format. Detta i kombination med att jag inte är ett mattesnille innebär problem. Finns det någon som har gjort detta och kanske t.o.m har något kodexempel? |
||
Svara med citat |
2008-04-20, 19:48 | #2 | ||
|
|||
Har WN som tidsfördriv
|
|||
Svara med citat |
2008-04-21, 11:02 | #3 | ||
|
|||
Nykomling
|
Tack för den informationen men den har jag redan sett.
Jag söker mer något verkligt kodexempel, någon? |
||
Svara med citat |
2008-04-22, 21:39 | #4 | ||
|
|||
Medlem
|
Har inte själv någon direkt erfarenhet av gps eller google maps, men behöver du hjälp att omvandla formeln på wikipedia-länken i KarlRoos inlägg till kod, kanske jag kan hjälpa till...
|
||
Svara med citat |
2008-04-25, 15:17 | #5 | ||
|
|||
Nykomling
|
Skulle du fixa det vore jag evigt tacksam.
Länken till wikipedia beskriver ju formeln för att konvertera från WGS84 till RT90 och det jag behöver är det motsatta dvs från RT90 till WGS84(i decimalt format). Kanske en enkel grej att vända på steken? Med andra skulle jag vilja skicka in RT90 i formatet x : 6580626, y : 1629015 och få ut WGS84 i formatet x : 12.123XXX, y : 12.123XXX. Applikationen detta ska in i är en .NET-sajt i C# men skriver du uträkningen i ett annat språk kan jag nog översätta det. Tack på förhand. |
||
Svara med citat |
2008-04-30, 08:09 | #6 | ||
|
|||
Medlem
|
Har haft mycket annat att göra, så det tog några dagar. Hoppas du i alla fall kan ha någon nytta av detta.
Jag har inga testdata så jag har inte kontrollerat att konverteringen stämmer, men jag får i alla fall tillbaka samma värden om jag konverterar godtyckliga värden RT90 -> Sweref99 -> RT90. Jag har bara utgått från formeln på wikipedia, och de siffervärden som finns där har jag satt som konstanter. Behöver de ändras i programmet får du ju göra om det på något sätt, kanske genom att skicka in aktuella värden till konstruktorn eller nåt. Så här använder du min lilla konverterare: Kod:
double x_RT90= 123; double y_RT90 = 456; double z_RT90 = 789; double x_Sweref99; double y_Sweref99; double z_Sweref99; Converter c = new Converter(); c.FromRT90ToSweref99(x_RT90, y_RT90, z_RT90, out x_Sweref99, out y_Sweref99, out z_Sweref99); Kod:
using System; public class Converter { public const double deltaX = -414.0978567149; public const double deltaY = -41.3381489658; public const double deltaZ = -603.0627177516; public const double omegaX = -0.8550434314; public const double omegaY = 2.1413465185; public const double omegaZ = -7.0227209516; public const double smallDelta = 0d; public Vector Delta { get { Vector delta = new Vector(); delta.SetElement(0, deltaX); delta.SetElement(1, deltaY); delta.SetElement(2, deltaZ); return delta; } } public Matrix R { get { double sx = Math.Sin(omegaX); double cx = Math.Cos(omegaX); double sy = Math.Sin(omegaY); double cy = Math.Cos(omegaY); double sz = Math.Sin(omegaZ); double cz = Math.Cos(omegaZ); Matrix r = new Matrix(); r.SetElement(0, 0, cy * cz); r.SetElement(0, 1, cz * sx * sy + cx * sz); r.SetElement(0, 2, -cx * cz * sy + sx * sz); r.SetElement(1, 0, -cy * sz); r.SetElement(1, 1, cx * cz - sx * sy * sz); r.SetElement(1, 2, cz * sx + cx * sy * sz); r.SetElement(2, 0, sy); r.SetElement(2, 1, -cy * sx); r.SetElement(2, 2, cx * cy); return r; } } public Matrix InverseR { get { double sx = Math.Sin(omegaX); double cx = Math.Cos(omegaX); double sy = Math.Sin(omegaY); double cy = Math.Cos(omegaY); double sz = Math.Sin(omegaZ); double cz = Math.Cos(omegaZ); Matrix r = new Matrix(); r.SetElement(0, 0, cy * cz); r.SetElement(0, 1, -cy * sz); r.SetElement(0, 2, sy); r.SetElement(1, 0, cz * sx * sy + cx * sz); r.SetElement(1, 1, cx * cz - sx * sy * sz); r.SetElement(1, 2, -cy * sx); r.SetElement(2, 0, -cx * cz * sy + sx * sz); r.SetElement(2, 1, cz * sx + cx * sy * sz); r.SetElement(2, 2, cx * cy); return r; } } public void FromSweref99ToRT90(double x_Sweref99, double y_Sweref99, double z_Sweref99, out double x_RT90, out double y_RT90, out double z_RT90) { Vector Sweref99 = new Vector(); Sweref99.SetElement(0, x_Sweref99); Sweref99.SetElement(1, y_Sweref99); Sweref99.SetElement(2, z_Sweref99); Vector RT90 = MatrixMath.VectorAddition( Delta, MatrixMath.ScalarVectorMultiplication( 1 + smallDelta, MatrixMath.MatrixVectorMultiplication( R, Sweref99))); x_RT90 = RT90.GetElement(0); y_RT90 = RT90.GetElement(1); z_RT90 = RT90.GetElement(2); } public void FromRT90ToSweref99(double x_RT90, double y_RT90, double z_RT90, out double x_Sweref99, out double y_Sweref99, out double z_Sweref99) { Vector RT90 = new Vector(); RT90.SetElement(0, x_RT90); RT90.SetElement(1, y_RT90); RT90.SetElement(2, z_RT90); Vector Sweref99 = MatrixMath.ScalarVectorMultiplication( 1 / (1 + smallDelta), MatrixMath.MatrixVectorMultiplication( InverseR, MatrixMath.VectorAddition( RT90, MatrixMath.ScalarVectorMultiplication( -1, Delta)))); x_Sweref99 = Sweref99.GetElement(0); y_Sweref99 = Sweref99.GetElement(1); z_Sweref99 = Sweref99.GetElement(2); } } Kod:
public class Matrix { private static readonly int Dim = 3; private readonly double[,] m_elements; public Matrix() { m_elements = new double[Dim, Dim]; } public static int Dimension { get { return Dim; } } public void SetElement(int i, int j, double value) { m_elements[i, j] = value; } public double GetElement(int i, int j) { return m_elements[i, j]; } } Kod:
public class Vector { private static readonly int Dim = 3; private readonly double[] m_elements; public Vector() { m_elements = new double[Dim]; } public static int Dimension { get { return Dim; } } public void SetElement(int i, double value) { m_elements[i] = value; } public double GetElement(int i) { return m_elements[i]; } } Kod:
public class MatrixMath { public static Matrix MatrixMultiplication(Matrix m1, Matrix m2) { Matrix m = new Matrix(); for (int i = 0; i < Matrix.Dimension; i++) { for (int j = 0; j < Matrix.Dimension; j++) { double value = 0.0; for (int k = 0; k < Matrix.Dimension; k++) { value += m1.GetElement(i, k) * m2.GetElement(k, j); } m.SetElement(i, j, value); } } return m; } public static Vector MatrixVectorMultiplication(Matrix m, Vector v) { Vector v2 = new Vector(); for (int i = 0; i < Vector.Dimension; i++) { double value = 0.0; for (int j = 0; j < Vector.Dimension; j++) { value += m.GetElement(i, j) * v.GetElement(j); } v2.SetElement(i, value); } return v2; } public static Vector ScalarVectorMultiplication(double scalar, Vector v) { Vector v2 = new Vector(); for (int i = 0; i < Vector.Dimension; i++) { v2.SetElement(i, scalar * v.GetElement(i)); } return v2; } public static Vector VectorAddition(Vector v1, Vector v2) { Vector v = new Vector(); for (int i = 0; i < Vector.Dimension; i++) { v.SetElement(i, v1.GetElement(i) + v2.GetElement(i)); } return v; } } |
||
Svara med citat |
2008-05-07, 15:28 | #7 | ||
|
|||
Nykomling
|
Oj, det var som f*n!
Trodde inte riktigt att någon skulle ta sig an detta men se där. Har inte testat koden än men återkommer när jag gjort det. Tusen tack och bock! |
||
Svara med citat |
2008-05-07, 18:52 | #8 | ||
|
|||
Medlem
|
Det blev en del rader, men är egentligen inte särskilt komplicerat kodmässigt. Slängde ihop några enkla klasser för linjär algebra (finns säkerligen en hel del betydligt effektivare bibliotek att använda, men jag hittade inget som var gratis...). Den klurigaste grejen är att invertera matrisen R, men där hade jag god hjälp av Mathematica
Säg till om det är något som verkar skumt när du har provat! |
||
Svara med citat |
2009-02-04, 19:25 | #9 | ||
|
|||
Nykomling
|
Hej!
jag undrar hur man går från RT90 till WGS84 med hjälp av koden ovan? Jag vill gå till grader enligt nedan: X= 6166951 Y= 1323214 N 55º 35' 59.43" Long: E 13º 0' 1.24" Tack på förhand |
||
Svara med citat |
2009-05-31, 21:02 | #10 | ||
|
|||
Hej, jag är ny här.
|
etanders, testade din kod och resultatet av konverteringarna stämde inte alls. Jag har själv kodat ihop ett .NET bibliotek och publicerat det på min blog under Creative Commons licens. Mitt bibliotek kan konvertera koordinater mellan RT90, WGS84 och SWEREF99. Läs mer och ladda ner koden:
http://blog.sallarp.com/translate-co...f99-using-net/ Lycka till! My Webpage |
||
Svara med citat |
Svara |
|
|