墨卡托投影c#自己编写不用库附带具体数据正反算验证实例不考虑缩放级别
时间: 2024-02-06 09:11:11 浏览: 146
下面是一个完整的墨卡托投影的C#实现,包括正反算和验证实例,代码中没有考虑缩放级别的问题,但可以进行基本的投影和反投影计算:
```csharp
using System;
public class MercatorProjection
{
private const double EarthRadius = 6378137.0;
private const double MinLatitude = -85.05112878;
private const double MaxLatitude = 85.05112878;
private const double MinLongitude = -180;
private const double MaxLongitude = 180;
public static double[] LonLat2Meters(double lon, double lat)
{
if (lat > MaxLatitude || lat < MinLatitude || lon > MaxLongitude || lon < MinLongitude)
{
throw new ArgumentException("Invalid longitude or latitude");
}
double x = lon * Math.PI * EarthRadius / 180;
double y = Math.Log(Math.Tan((90 + lat) * Math.PI / 360)) / (Math.PI / 180);
y = y * EarthRadius;
return new double[] { x, y };
}
public static double[] Meters2LonLat(double x, double y)
{
double lon = x / (Math.PI * EarthRadius / 180);
double lat = y / EarthRadius;
lat = 180 / Math.PI * (2 * Math.Atan(Math.Exp(lat * Math.PI / 180)) - Math.PI / 2);
return new double[] { lon, lat };
}
public static void Main()
{
double[] meters = LonLat2Meters(116.4074, 39.9042); // 北京市的经纬度
Console.WriteLine("北京市的墨卡托投影坐标为:({0}, {1})", meters[0], meters[1]);
double[] lonlat = Meters2LonLat(meters[0], meters[1]);
Console.WriteLine("北京市的反投影经纬度为:({0}, {1})", lonlat[0], lonlat[1]);
}
}
```
这个代码中,LonLat2Meters函数将经纬度坐标转换为墨卡托投影下的平面坐标,Meters2LonLat函数将平面坐标转换为经纬度坐标。在验证实例中,我们将北京市的经纬度转换为墨卡托投影下的平面坐标,然后再反过来将平面坐标转换为经纬度坐标,最后输出反投影的结果。
需要注意的是,这个代码中的投影和反投影计算都没有考虑缩放级别的问题,因此只适用于不需要进行缩放和平移的场合。如果需要在地图上显示不同级别的数据,需要根据缩放级别进行坐标的缩放和平移。
阅读全文