5 votes

Comment convertir des géocoordonnées en Javascript en géocoordonnées en C# ?

J'ai du code javascript et j'aimerais le convertir en C#. Je n'ai aucune idée de la meilleure façon de le structurer ou s'il existe un moyen facile de convertir le code.

Un exemple de ce code est présenté ci-dessous.

// ellipse parameters
var e = { WGS84:    { a: 6378137,     b: 6356752.3142, f: 1/298.257223563 },
          Airy1830: { a: 6377563.396, b: 6356256.910,  f: 1/299.3249646   },
          Airy1849: { a: 6377340.189, b: 6356034.447,  f: 1/299.3249646   } };

// helmert transform parameters
var h = { WGS84toOSGB36: { tx: -446.448,  ty:  125.157,   tz: -542.060,   // m
                           rx:   -0.1502, ry:   -0.2470,  rz:   -0.8421,  // sec
                           s:    20.4894 },                               // ppm
          OSGB36toWGS84: { tx:  446.448,  ty: -125.157,   tz:  542.060,
                           rx:    0.1502, ry:    0.2470,  rz:    0.8421,
                           s:   -20.4894 } };

function convertOSGB36toWGS84(p1) {
  var p2 = convert(p1, e.Airy1830, h.OSGB36toWGS84, e.WGS84);
  return p2;
}

Le code complet peut être téléchargé à partir de : Code de la grille en Javascript

EDITAR: Merci à tous jusqu'à présent pour votre aide ; je suppose que la deuxième exigence est que le rappel du code dans le lien puisse être converti. L'accent du snippet était mis sur les types anonymes.

9voto

Judah Himango Points 27365

Votre extrait de JavaScript crée des types anonymes. Vous pouvez faire la même chose en C# :

var e = new
{
    WGS84 = new { a = 6378137, b = 6356752.3142, f = 1 / 298.257223563 },
    Airy1830 = new { a = 6377563.396, b = 6356256.910, f = 1 / 299.3249646 },
    Airy1849 = new { a = 6377340.189, b = 6356034.447, f = 1 / 299.3249646 }
};

var h = new
{
    WGS84toOSGB36 = new
    {
        tx = -446.448, ty = 125.157, tz = -542.060, // m
        rx = -0.1502, ry = -0.2470, rz = -0.8421,   // sec
        s = 20.4894                                 // ppm
    },                               
    OSGB36toWGS84 = new
    {
        tx = 446.448,
        ty = -125.157,
        tz = 542.060,
        rx = 0.1502,
        ry = 0.2470,
        rz = 0.8421,
        s = -20.4894
    }
};

7voto

Cheeso Points 87022

Le javascript utilise des types anonymes. Vous pourriez faire la même chose en C# mais il serait plus clair d'utiliser des types nommés.

par exemple, le javascript comme ceci :

// ellipse parameters
var e = { WGS84:    { a: 6378137,     b: 6356752.3142, f: 1/298.257223563 },
          Airy1830: { a: 6377563.396, b: 6356256.910,  f: 1/299.3249646   },
          Airy1849: { a: 6377340.189, b: 6356034.447,  f: 1/299.3249646   } };

représente des ellipses. Vous pourriez faire cela en C# comme suit :

// ellipse class
public class EllipseParameters {
    public double a {get; set;} 
    public double b {get; set;} 
    public double f {get; set;}
}

public Ellipses { 
    public EllipseParameters WGS84 {get;set;}
    public EllipseParameters Airy1830 {get;set;}
    public EllipseParameters Airy1849 {get;set;}
}

Ellipses e = new Ellipses {
    WGS84 = new EllipseParameters { a = 6378137,     b= 6356752.3142, f = 1/298.257223563 },
    Airy1830 = new EllipseParameters { a= 6377563.396, b= 6356256.910,  f= 1/299.3249646   },
    Airy1849 = new EllipseParameters { a= 6377340.189, b= 6356034.447,  f= 1/299.3249646   }
};

Mais à la place de la classe Ellipses, vous pouvez opter pour une approche par dictionnaire, quelque chose comme ceci :

var e = new Dictionary<String,EllipseParameters>();
e.Add("WGS84", new EllipseParameters { a = 6378137,     b= 6356752.3142, f = 1/298.257223563 });
e.Add("Airy1830", new EllipseParameters { a= 6377563.396, b= 6356256.910,  f= 1/299.3249646   });
e.Add("Airy1849", new EllipseParameters { a= 6377340.189, b= 6356034.447,  f= 1/299.3249646   });

Vous adopteriez la même approche avec les classes de transformation helmert.

1voto

Gergely Orosz Points 4447

Je ne pense pas qu'il y ait un moyen vraiment facile de convertir le code car javascript est un langage beaucoup plus souple. De plus, dans votre code, vous utilisez la génération d'objets à la volée de javascript, ce que vous ne pourriez pas faire en C#.

Vous devez probablement déclarer les mêmes classes que vous utilisez en JS (mais vous n'étiez pas obligé de le faire) et réécrire le code, je ne pense pas qu'il y ait un moyen simple.

Cependant, de mon point de vue personnel, il serait probablement utile de réécrire le code à partir de zéro en C#. Si vous êtes un développeur C# expérimenté, vous pourriez trouver un meilleur algorithme ou une conception plus simple pour le code, si vous êtes un débutant, cela vous aiderait à apprendre le langage.

1voto

Graviton Points 28358

Le meilleur espoir est d'utiliser Dictionary combiné avec une nouvelle classe def.

public class abf
{
   public double a
   {get;set;}
   public double b
   {get;set;}
   public double f
   {get;set;}
}

public class txtytz
{
   //repeat for tx ty tz etc
}

//

public Dictionary<string, abf> e;
public Dictionary<string, txtytz> h;

Voici comment vous pouvez l'utiliser :

abf wgs84Result=e["WGS84"];  // will yield { a: 6378137,     b: 6356752.3142, f: 1/298.257223563 }

txtytz OSGB36toWGS84Result=h["OSGB36toWGS84"];  // will yield { tx:  446.448,  ty: -125.157,   tz:  542.060,
                           rx:    0.1502, ry:    0.2470,  rz:    0.8421,
                           s:   -20.4894 } };

1voto

Andrew Hancox Points 1202

Quelqu'un a écrit une classe c# pour convertir le WGS84 en OSGB36 et le lat lon en NE, vous pouvez la télécharger. aquí Je l'ai vérifié et il semble fonctionner parfaitement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X