
C语言 GPS 经纬度 距离 高德地图距离计算
发布日期:2021-05-07 10:28:23
浏览次数:17
分类:精选文章
本文共 2590 字,大约阅读时间需要 8 分钟。
本文提供了WGS84坐标系到高德坐标系的转换代码以及两点间距离计算方法,适用于GPS经纬度转换及高德坐标下的距离测算。
#include#include double gcj_lng, gcj_lat;double pi = 3.1415926;double a = 6378245.0;double es = 0.00669342162296594323;double transformlat(double lng, double lat) { double ret; ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * sqrt(fabs(lng)); ret += (20.0 * sin(6.0 * lng * pi) + 20.0 * sin(2.0 * lng * pi)) * 2.0 / 3.0; ret += (20.0 * sin(lat * pi) + 40.0 * sin(lat / 3.0 * pi)) * 2.0 / 3.0; ret += (160.0 * sin(lat / 12.0 * pi) + 320 * sin(lat * pi / 30.0)) * 2.0 / 3.0; return (ret);}double transformlng(double lng, double lat) { double ret; ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * sqrt(fabs(lng)); ret += (20.0 * sin(6.0 * lng * pi) + 20.0 * sin(2.0 * lng * pi)) * 2.0 / 3.0; ret += (20.0 * sin(lng * pi) + 40.0 * sin(lng / 3.0 * pi)) * 2.0 / 3.0; ret += (150.0 * sin(lng / 12.0 * pi) + 300.0 * sin(lng / 30.0 * pi)) * 2.0 / 3.0; return (ret);}void WGS84_to_GCJ02(double lng, double lat) { double dlat, dlng, radlat, magic, sqrtmagic; dlat = transformlat(lng - 105.0, lat - 35.0); dlng = transformlng(lng - 105.0, lat - 35.0); radlat = lat / 180.0 * pi; magic = sin(radlat); magic = 1 - es * magic * magic; sqrtmagic = sqrt(magic); dlat = (dlat * 180.0) / ((a * (1 - es)) / (magic * sqrtmagic) * pi); dlng = (dlng * 180.0) / (a / sqrtmagic * cos(radlat) * pi); gcj_lng = lat + dlat; gcj_lat = lng + dlng;}double st_distance(double point_alon, double point_alat, double point_blon, double point_blat) { double radian, radius, f, h, k, d, e; radian = pi / 180.0; radius = 6378137; f = point_alat * radian; h = point_blat * radian; k = 2 * radius; d = point_blon * radian - point_alon * radian; e = (1 - cos(h - f) + (1 - cos(d)) * cos(f) * cos(h)) / 2; return k * asin(sqrt(e));}int main(void) { double distance; double lng1, lat1; double lng2, lat2; distance = st_distance(116.368904, 39.923423, 116.387271, 39.922501); // 高德坐标距离计算 printf("%f\n", distance); WGS84_to_GCJ02(116.368904, 39.923423); // 调用转换函数 lng1 = gcj_lng; lat1 = gcj_lat; // 获取转换后的高德坐标 WGS84_to_GCJ02(116.387271, 39.922501); // 再次调用转换函数 lng2 = gcj_lng; lat2 = gcj_lat; // 获取转换后的高德坐标 distance = st_distance(lng1, lat1, lng2, lat2); // 使用高德坐标计算两点距离 printf("%f\n", distance); return (0);} 结果:
D:\Users\kevin_xie\CLionProjects\untitled\cmake-build-debug\untitled.exe
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2025年04月06日 22时23分22秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!