Kom ihåg mig?
Home Menu

Menu


RT90 till WGS84

 
Ämnesverktyg Visningsalternativ
Oläst 2008-04-20, 18:56 #1
Raskelof Raskelof är inte uppkopplad
Nykomling
 
Reg.datum: May 2005
Inlägg: 10
Raskelof Raskelof är inte uppkopplad
Nykomling
 
Reg.datum: May 2005
Inlägg: 10
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?
Raskelof är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-04-20, 19:48 #2
KarlRoos KarlRoos är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Jul 2007
Inlägg: 1 416
KarlRoos KarlRoos är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Jul 2007
Inlägg: 1 416
Här finns formeln för detta.
Eftersom att du inte var ett matte snille så finns dock detta.

Lycka till
KarlRoos är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-04-21, 11:02 #3
Raskelof Raskelof är inte uppkopplad
Nykomling
 
Reg.datum: May 2005
Inlägg: 10
Raskelof Raskelof är inte uppkopplad
Nykomling
 
Reg.datum: May 2005
Inlägg: 10
Tack för den informationen men den har jag redan sett.
Jag söker mer något verkligt kodexempel, någon?
Raskelof är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-04-22, 21:39 #4
etanders etanders är inte uppkopplad
Medlem
 
Reg.datum: Dec 2004
Inlägg: 160
etanders etanders är inte uppkopplad
Medlem
 
Reg.datum: Dec 2004
Inlägg: 160
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...
etanders är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-04-25, 15:17 #5
Raskelof Raskelof är inte uppkopplad
Nykomling
 
Reg.datum: May 2005
Inlägg: 10
Raskelof Raskelof är inte uppkopplad
Nykomling
 
Reg.datum: May 2005
Inlägg: 10
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.
Raskelof är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-04-30, 08:09 #6
etanders etanders är inte uppkopplad
Medlem
 
Reg.datum: Dec 2004
Inlägg: 160
etanders etanders är inte uppkopplad
Medlem
 
Reg.datum: Dec 2004
Inlägg: 160
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);
Och så själva koden:

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;
	}
}
etanders är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-05-07, 15:28 #7
Raskelof Raskelof är inte uppkopplad
Nykomling
 
Reg.datum: May 2005
Inlägg: 10
Raskelof Raskelof är inte uppkopplad
Nykomling
 
Reg.datum: May 2005
Inlägg: 10
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!
Raskelof är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-05-07, 18:52 #8
etanders etanders är inte uppkopplad
Medlem
 
Reg.datum: Dec 2004
Inlägg: 160
etanders etanders är inte uppkopplad
Medlem
 
Reg.datum: Dec 2004
Inlägg: 160
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!
etanders är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-02-04, 19:25 #9
laplace laplace är inte uppkopplad
Nykomling
 
Reg.datum: Feb 2009
Inlägg: 2
laplace laplace är inte uppkopplad
Nykomling
 
Reg.datum: Feb 2009
Inlägg: 2
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
laplace är inte uppkopplad   Svara med citatSvara med citat
Oläst 2009-05-31, 21:02 #10
Merrimack Merrimack är inte uppkopplad
Hej, jag är ny här.
 
Reg.datum: May 2009
Inlägg: 1
Merrimack Merrimack är inte uppkopplad
Hej, jag är ny här.
 
Reg.datum: May 2009
Inlägg: 1
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
Merrimack är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 2 (0 medlemmar och 2 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 04:26.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017