使用NetTopologySuite将eastings / northings转换为纬度/经度

时间:2010-02-04 11:42:28

标签: c# gis

我有一堆Eastings/Northings坐标,据我所知使用UTM convention - 基本上,它们是笛卡尔坐标 - 我想将其转换为纬度和经度。

据推测,NetTopologySuite可以帮助我解决这个问题,但我找不到很多文档。

有人指点让我开始吗?

编辑:Eastings和Northings特别是OS Grid Reference Eastings和Northings,其问题和惯例是discussed here

5 个答案:

答案 0 :(得分:7)

这是一个非常古老的问题,但由于它在2年后仍然出现在搜索中,我觉得仍然值得提供可能对其他人有帮助的答案。

如果您能够使用它,Ordnance Survey现在提供DLL(和相关数据文件),或NTv2文件,可用于执行更准确的OSTN15转换。这些可在BSD许可证下获得: OSTN15 and OSGM15 for developers

此转换会将您的坐标转换为ETRS89(approximately equivalent to WGS84 in Europe),并且比@codeulike的答案中提到的OSTN97 / 7参数helmert转换更准确。

答案 1 :(得分:3)

Proj.Net library更有可能为您的需求提供更简单的工具集。

您需要从UTM(如果它确实是UTM - 那里有很多卡特尔系统)投影到地理坐标系。您很可能也需要找出数据的数据。如果您在shapefile中有数据,那么在文本编辑器中查看.prj文件 - 它将包含投影信息。否则,您需要返回数据生产者并询问他们的预测。

答案 2 :(得分:3)

为了回答我自己的问题,Eastings和Northings被证明是条例调查(OS),其中转换为纬度和经度的定义很明确。

This very good page by Chris Veness讨论了主要的算法和常见的陷阱。他提出了一个Javascript算法,但我找到了一个C#等价的in this forum

正如Chris Veness所指出的那样,该算法可以让你获得纬度和经度,但是在OSGB36数据上。通常,您会希望将其转换为更常用的WGS84 / GRS80数据(否则,对于英国地区,您最多可达120米)。为此,您需要进行Helmert转换,as described by Chris here

编辑:Chris Veness的代码是根据GNU LGPL许可证授权的。

答案 3 :(得分:1)

我知道这是一个老问题,但我一直在寻找如何在C#中执行此操作并找到this recently published article here

作者在nuget上编写了一个名为GeoUK的C#库。

Install-Package GeoUK

安装此库后,要将easting / northing转换为long / lat,您可以编写如下函数:

    static void Main(string[] args)
    {
        // downing street!
        const double easting = 530046;
        const double northing = 179914;

        var result = ConvertEastNorthToLatLong(easting, northing);

        Console.WriteLine("Lat: {0} Long: {1}", result.Latitude, result.Longitude);

        var gmaps = string.Format("https://www.google.co.uk/maps/@{0},{1},17z", Math.Round(result.Latitude,6), Math.Round(result.Longitude,6));
    }

    static LatitudeLongitude ConvertEastNorthToLatLong( double easting, double northing )
    {
        // Convert to Cartesian
        var cartesian = GeoUK.Convert.ToCartesian(new Airy1830(),
                new BritishNationalGrid(),
                new EastingNorthing(easting, northing));

        //ETRS89 is effectively WGS84   
        var wgsCartesian = Transform.Osgb36ToEtrs89(cartesian); 

        var wgsLatLong = GeoUK.Convert.ToLatitudeLongitude(new Wgs84(), wgsCartesian);

        return wgsLatLong;
    }
}

这对我有用并产生result

我之前提到的文章更深入地解释了。这可能会帮助其他人进一步发展。

答案 4 :(得分:0)

在Nuget上查看CoordinateSharp。它使转换超级容易。

Time.timeScale

您的经纬度值存储在所有经纬度格式(例如分钟,小数分钟,秒等)的坐标对象内。