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

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

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

任何人都有一些指示让我开始?

编辑:Eastings和Northings特别是OS Grid Reference Eastings和Northings, 这里讨论的问题和惯例。

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

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

此转换将使您的坐标转换为ETRS89( 大约相当于欧洲的WGS84 ),并且比@codeulike的答案中提到的OSTN97 / 7参数helmert转换更准确。

为了回答我自己的问题,Eastings和Northings被certificate是条例调查(OS),为此,转换到纬度和经度是非常明确的。

Chris Veness这个非常好的页面讨论了主要的算法和常见的陷阱。 他提出了一个Javascript算法,但我在这个论坛中找到了一个C#等价物。

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

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

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

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

我知道这是一个老问题,但我一直在寻找如何在C#中做到这一点,并在这里发现了这篇最近发表的文章 。

作者在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; } } 

这适用于我并产生结果 。

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

查看Nuget上的CoordinateSharp。 它使转换变得简单。

  UniversalTransverseMercator utm = new UniversalTransverseMercator("T", 32, 233434, 234234); Coordinate c = UniversalTransverseMercator.ConvertUTMtoLatLong(utm); 

您的纬度/经度值存储在Coordinate对象中,适用于所有纬度/经度格式(即分钟,小数分钟,秒等)。