c-将Belge 1972/Belgian Lambert 72(EPSG:31370)坐标转换为WGS 84(EPSG



我正试图找到一个代码,可以将Lambert72坐标转换为WGS84,这样我就可以获得与在这个网站上相同的结果,转到菜单应用程序->变换坐标。

https://mygeodata.cloud/cs2cs/

例如,我在这个网站上尝试了以下坐标对,在左边选择代码31370(Lambert72(,在右边选择WGS84149334.41 167411

结果是:4.35930680453;50.817136997

为了在谷歌地图上使用这个结果,必须切换值,所以我需要的结果是:50.817136997;4.35930680453

我在类似的帖子中尝试了这个答案的代码,但我转换成了C而不是C++/C#:

https://stackoverflow.com/a/40589076/1911497

所以,我的代码,修改为C是这样的:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
static void Lambert72toWGS84latlong(double X, double Y);
int main(){
double x, y;

x = 149334.41, y = 167411.0;

Lambert72toWGS84latlong(x, y);
return 0;
}

static void Lambert72toWGS84latlong(double X, double Y){
double LongRef = 0.076042943;
double nLamb = 0.7716421928;
double aCarre = pow(6378388.0,2.0);
double bLamb  = 6378388.0 * (1.0 - (1.0 / 297.0));
double eCarre = (aCarre - pow(bLamb,  2.0)) / aCarre;
double KLamb = 11565915.812935;
double eLamb = sqrt(eCarre);
double eSur2 = eLamb / 2.0;
double Tan1 = (X - 150000.012) / (5400088.437 - Y);
double Lambda = LongRef + (1.0 / nLamb) * (0.000142043 + atan(Tan1));
double RLamb = sqrt(pow((X - 150000.012) , 2.0) + pow   ((5400088.437 - Y) ,2.0));
double TanZDemi = pow((RLamb / KLamb),(1.0 / nLamb));
double Lati1 = 2.0 * atan(TanZDemi);
double eSin;
double Mult1, Mult2, Mult;
double LatiN, Diff;
double lat, lng ;
int i=0; 
do{
eSin = eLamb * sin(Lati1);
Mult1 = 1.0 - eSin;
Mult2 = 1.0 + eSin;
Mult = pow((Mult1 / Mult2) , (eLamb / 2.0));
LatiN = (M_PI / 2.0) - (2.0 * (atan(TanZDemi * Mult)));
Diff = LatiN - Lati1;
printf("Diff: %dn", abs(Diff));
//Lati1 = LatiN;
printf("Iterations: %dn", i++);
}while (abs(Diff)> 0.0000000277777);

lat=LatiN;
lng=Lambda;
double SinLat = sin(lat);
double SinLng = sin(lng);
double CoSinLat = cos(lat);
double CoSinLng = cos(lng);
double dx = -125.8;
double dy = 79.9;
double dz = -100.5;
double da = -251.0;
double df = -0.000014192702;
double LWf = 1.0 / 297.0;
double LWa = 6378388.0;
double LWb = (1 - LWf) * LWa;
double LWe2 = (2.0 * LWf) - (LWf * LWf);
double Adb = 1.0 / (1.0 - LWf);
double Rn = LWa / sqrt(1.0 - LWe2 * SinLat * SinLat);    
double Rm = LWa * (1 - LWe2) /pow((1.0 - LWe2 * lat * lat) ,1.5); 
double DLat = -dx * SinLat * CoSinLng - dy * SinLat * SinLng + dz * CoSinLat;
DLat = DLat + da * (Rn * LWe2 * SinLat * CoSinLat) / LWa;
DLat = DLat + df * (Rm * Adb + Rn / Adb) * SinLat * CoSinLat;
DLat = DLat / (Rm + 0.0);
double DLng = (-dx * SinLng + dy * CoSinLng) / ((Rn + 0.0) * CoSinLat);
double Dh = dx * CoSinLat * CoSinLng + dy * CoSinLat * SinLng + dz * SinLat;
Dh = Dh - da * LWa / Rn + df * Rn * lat * lat / Adb;
double LatWGS84 = ((lat + DLat) * 180.0) / M_PI;
double LngWGS84 = ((lng + DLng) * 180.0) / M_PI;
printf("Latitude: %.8ft Longitude: %.8fn", LatWGS84, LngWGS84);
}

然而,我没有得到同样的结果。我得到的结果是:纬度:50.78247464经度:4.35930689

我需要更改什么才能获得与上述网站返回的结果相同的结果?

谢谢PsySc0rpi0n

do {
// stuff
} while (abs(Diff)> 0.0000000277777);
//     **int abs(int);**

您可能想要

do {
// stuff
} while (fabs(Diff) > 0.0000000277777);
//     **double fabs(double);**

最新更新