如何将Javascript中的地理坐标转换为C#中的地理坐标

时间:2009-12-10 15:10:24

标签: c# javascript standards

我有一些javascript代码,我想将其转换为C#。我不知道构造它的最佳方法,或者是否有一种简单的方法来转换代码。

此代码的示例如下所示。

// 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;
}

完整代码可以从以下网址下载: Javascript Grid Code

编辑:谢谢大家的帮助;我想第二个要求是可以转换链接中代码的提醒。该片段的重点是匿名类型。

9 个答案:

答案 0 :(得分:9)

您的JavaScript代码段正在创建匿名类型。您可以在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
    }
};

答案 1 :(得分:7)

javascript使用匿名类型。您可以在C#中执行相同操作,但使用命名类型会更清楚。

例如,像这样的javascript:

// 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   } };

..表示省略号。你可以在C#中这样做:

// 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   }
};

但是代替Ellipses类,你可能需要一个字典方法,如下所示:

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   });

您将采用与helmert转换类相同的方法。

答案 2 :(得分:1)

我认为没有任何真正简单的方法来转换代码,因为javascript是一种更宽松的语言。您的代码中有更多内容,您正在使用javascript的即时对象生成,而您无法在C#中使用。

您可能需要声明在JS中使用的相同类(但不是强制这样做)并重写代码,我认为没有一种简单的方法。

从我个人的角度来看,在C#中从头开始重写代码可能会有所帮助。如果您是一位经验丰富的C#开发人员,您可能会为代码找到更好的算法或更简单的设计,如果您是新手,虽然它可以帮助您学习该语言。

答案 3 :(得分:1)

最好的希望是使用Dictionary结合新的类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;

以下是如何使用它:

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 } };

答案 4 :(得分:1)

有人编写了一个c#类来将WGS84转换为OSGB36并将lat lon转换为NE,你可以下载它here 我已经检查了它,似乎工作正常。

答案 5 :(得分:0)

我工作的公司刚刚开源了一个库来完成这个:http://code.google.com/p/geocoordconversion/

答案 6 :(得分:0)

我使用M2H的在线转换器。

http://www.m2h.nl/files/js_to_c.php

答案 7 :(得分:0)

function Update () {

    GetComponent.<Renderer>().material.color.r = red; 
    GetComponent.<Renderer>().material.color.b = blue; 
    GetComponent.<Renderer>().material.color.g = green; 
    GetComponent.<Renderer>().material.color.a = alpha; 
    GetComponent.<Renderer>().material.mainTextureOffset = Vector2(parseFloat(xOffset),parseFloat(yOffset));mipazirad 

    GetComponent.<Renderer>().material.mainTextureScale = Vector2(parseFloat(xTiling),parseFloat(yTiling));
     moshkhas mikonim
    if(selectedShader == 0)
        GetComponent.<Renderer>().material.shader = Shader.Find("Diffuse");
    else if(selectedShader == 1)
        GetComponent.<Renderer>().material.shader = Shader.Find("Bumped Diffuse");
    else if(selectedShader == 2)
        GetComponent.<Renderer>().material.shader = Shader.Find("Bumped Specular");

}

答案 8 :(得分:0)

function Start()  {
    var theMesh : Mesh;

    theMesh = this.transform.GetComponent(MeshFilter).mesh as Mesh;
    var theUVs : Vector2[] = new Vector2[theMesh.uv.Length];

    theUVs = theMesh.uv;
    theUVs[4] = Vector2( 0.5, 1.0 );
    theUVs[5] = Vector2( 1.0, 1.0 );
    theUVs[8] = Vector2( 0.5, 0.5 );
    theUVs[9] = Vector2( 1.0, 0.5 );
    theMesh.uv = theUVs;
}