如何将经纬度转换为印度网格参考

时间:2018-12-13 09:34:17

标签: c#

我想将印度1A区和0区的经纬度长转换为印度网格参考(GR)。

示例:对于印度1A区
lat = 77.79669和
长= 31.53081
我知道gr会 X = 3671296,Y = 08497759

另一个例子:印度1A区
lat = 78.60744和
长= 32.06581
而这个gr将是 X = 3741976,Y = 0916068

但是我不知道公式以及将使用什么参数,所以我可以获得此GR。

以下我使用的以下代码,但答案不匹配。

double Lts = Convert.ToDouble(lat);
double Los = Convert.ToDouble(long);
double inverse_flattening = 300.8017255;
double num5 = 6377276.345;
double scale_factor = 1.0;
double central_meridian = 68.0;
double latt_of_origin = 32.50;
double num10 = 2743285.8;//False Easting
double num11 = 914395.5;//False northing
double flattening = 1 / inverse_flattening;
double num8 = 0.40648718;//1st st. parallel
double num9 = 0.50073496;//2nd st. parallel
double num7 = central_meridian * Math.PI / 180.0;
double a2 = latt_of_origin * Math.PI / 180.0;
double num6 = Math.Sqrt((2.0 * flattening) - (flattening * flattening));

double a1 = Lts * Math.PI / 180.0;
double num4 = Los * Math.PI / 180.0;
double a3 = Math.Cos(num8) / Math.Sqrt(1.0 - num6 * num6 * Math.Sin(num8) * Math.Sin(num8));
double a4 = Math.Cos(num9) / Math.Sqrt(1.0 - num6 * num6 * Math.Sin(num9) * Math.Sin(num9));
double num12 = Math.Tan(Math.PI / 4.0 - num8 / 2.0) / Math.Pow((1.0 - num6 * Math.Sin(num8)) / (1.0 + num6 * Math.Sin(num8)), num6 / 2.0);
double a5 = Math.Tan(Math.PI / 4.0 - num9 / 2.0) / Math.Pow((1.0 - num6 * Math.Sin(num9)) / (1.0 + num6 * Math.Sin(num9)), num6 / 2.0);
double x1 = Math.Tan(Math.PI / 4.0 - a1 / 2.0) / Math.Pow((1.0 - num6 * Math.Sin(a1)) / (1.0 + num6 * Math.Sin(a1)), num6 / 2.0);
double x2 = Math.Tan(Math.PI / 4.0 - a2 / 2.0) / Math.Pow((1.0 - num6 * Math.Sin(a2)) / (1.0 + num6 * Math.Sin(a2)), num6 / 2.0);
double y = (Math.Log(a3) - Math.Log(a4)) / (Math.Log(num12) - Math.Log(a5));
double num13 = a3 / (y * Math.Pow(num12, y));
double num14 = num5 * num13 * Math.Pow(x1, y);
double num15 = num5 * num13 * Math.Pow(x2, y);
double num16 = y * (num4 - num7);
Int64 temp_gr_x = Convert.ToInt64(num10 + (num14 * Math.Sin(num16)));
Int64 temp_gr_y = Convert.ToInt64(num11 + num15 - (num14 * Math.Cos(num16)));
temp_gr_x = Convert.ToInt64(temp_gr_x * scale_factor);
temp_gr_y = Convert.ToInt64(temp_gr_y * scale_factor);

1 个答案:

答案 0 :(得分:0)

我发现您的代码存在许多问题。

首先,您的经纬度错误。使用https://deeppradhan.heliohost.org/gis/indian-grid/conversion.htm处的计算器,我可以看到,如果使用提供的纬度31.53081和经度77.79669,您将获得作为问题示例提供的网格参考。使用这些参数,您的代码所得出的结果与Deep Pradhan的结果相近得多,但仍然存在一些令人惊讶的巨大差异(尤其是Y值)。

我不知道您从何处获得示例代码,但看起来它并没有为您想要的投影获得正确的参数集。它们与我found online for the Indian Grid I region的值接近,但不相同。你在哪里找到的?

我为印度网格找到的已发布数据说,它使用具有一个标准平行线的Lambert圆锥形保形投影,但是您的代码似乎具有两个标准平行线。我合理地确信,我上面使用的Deep Pradhan计算器所使用的代码使用的是单个标准平行投影(而且我很确定georepository计算器也可以这样做),因此结果永远不会相当可比。

最后,您应注意表示坐标的原点。 Deep Pradhan的计算器采用WGS84坐标,但是我为印度网格系统找到的投影公式希望使用Everest 1830(1975年定义)椭球体进行坐标计算。在两个椭球之间有一个直接的转换,但是我不相信您的代码可以做到。这可能是您的结果与其他计算器返回的结果之间差异的一个来源。有一个coordinate converter in the kalianpur datum here可能对您有用。

我本人试图根据地理存储库中可用的参数和EPSG Geomatics Guidance Note 7, part 2(第22页第1.3.1.2节)中描述的投影算法编写转换算法,但并不完全 >获得与georepository自己的计算器匹配的结果,但是如果您愿意,我可以共享我的代码,您可以自己进行调试;-)

注意: 关于原始问题(目前已删除)有一条评论,建议OP使用ProjNet4GeoApi。该库当前仅提供具有两个标准平行线的兰伯特圆锥形保形投影,而印度地图网格的在线可用数据仅使用投影的 one 标准平行线。如果OP具有投影参数的合法来源(尽管它们尚未共享此参数),这将不是问题。