地理坐标系介绍

主流地理坐标系、投影坐标系和投影方法的区别和联系_ 一只博客-CSDN博客https://blog.csdn.net/qq_42276781/article/details/122597363关于坐标系的转换,可以参考如下两个开源项目gcoord和coordtransform

GitHub - hujiulong/gcoord: 地理坐标系转换工具https://github.com/hujiulong/gcoordGitHub - wandergis/coordtransform: 提供了百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换https://github.com/wandergis/coordtransform我将gcoord中的BD09和WGS84互转的代码改写成了C语言的形式,便于大家理解。

通过BD09和GCJ02的互转GCJ02和WGS84的互转来实现BD09和WGS84的互转,即

1)BD09 => GCJ02 => WGS84

2)WGS84 => GCJ02 => BD09

下面的代码结合了我之前的两篇博客(核心思想均参考自Gcoord)

地理坐标系:GCJ02和BD09互转_ 一只博客-CSDN博客https://blog.csdn.net/qq_42276781/article/details/122596686地理坐标系:GCJ02和WGS84互转_ 一只博客-CSDN博客_wgs84坐标系https://blog.csdn.net/qq_42276781/article/details/121388429BD09和WGS84的互转代码

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#define PI 3.1415926535897932384626
double* BD09ToWGS84(double, double);
double* WGS84ToBD09(double, double);
double* BD09ToGCJ02(double, double);
double* GCJ02ToBD09(double, double);
double* GCJ02ToWGS84(double, double);
double* WGS84ToGCJ02(double, double);int main(){double lon = 116.403988;double lat = 39.914266;double *p = WGS84ToBD09(lon, lat);printf("%.10f, %.10f", p[0], p[1]);
}
// (BD09 <=> WGS84) base on (BD09 <=> GCJ02) and (WGS84 <=> GCJ02)
double* BD09ToWGS84(double lon_BD, double lat_BD){double *GCJ = BD09ToGCJ02(lon_BD, lat_BD);return GCJ02ToWGS84(GCJ[0], GCJ[1]);
} double* WGS84ToBD09(double lon_WGS, double lat_WGS){double *GCJ = WGS84ToGCJ02(lon_WGS, lat_WGS);return GCJ02ToBD09(GCJ[0], GCJ[1]);
} // BD09 <=> GCJ02
double baiduFactor = (PI * 3000.0) / 180.0;double* BD09ToGCJ02(double lon_BD, double lat_BD){double *GCJ = (double *)malloc(2*sizeof(double));double x = lon_BD - 0.0065;double y = lat_BD - 0.006;double z = sqrt(x * x + y * y) - 0.00002 * sin(y * baiduFactor);double theta = atan2(y, x) - 0.000003 * cos(x * baiduFactor);GCJ[0] = z * cos(theta);GCJ[1] = z * sin(theta);return GCJ;
}double* GCJ02ToBD09(double lon_GCJ, double lat_GCJ){double *BD = (double *)malloc(2*sizeof(double));double z = sqrt(lon_GCJ * lon_GCJ + lat_GCJ * lat_GCJ) + 0.00002 * sin(lat_GCJ * baiduFactor);double theta = atan2(lat_GCJ, lon_GCJ) + 0.000003 * cos(lon_GCJ * baiduFactor);BD[0] = z * cos(theta) + 0.0065;BD[1] = z * sin(theta) + 0.006;return BD;
} // WGS84 <=> GCJ02
double a = 6378245;
double ee = 0.006693421622965823;// roughly check whether coordinates are in China.
int isInChinaBbox(double lon, double lat){return lon >= 72.004 && lon <= 137.8347 && lat >= 0.8293 && lat <= 55.8271;
}double transformLat(double x, double y){double ret = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * sqrt(fabs(x));ret += ((20.0 * sin(6.0 * x * PI) + 20.0 * sin(2.0 * x * PI)) * 2.0) / 3.0;ret += ((20.0 * sin(y * PI) + 40.0 * sin((y / 3.0) * PI)) * 2.0) / 3.0;ret += ((160.0 * sin((y / 12.0) * PI) + 320.0 * sin((y * PI) / 30.0)) * 2.0) / 3.0;return ret;
}double transformLon(double x, double y){double ret = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * sqrt(fabs(x));ret += ((20.0 * sin(6.0 * x * PI) + 20.0 * sin(2.0 * x * PI)) * 2.0) / 3.0;ret += ((20.0 * sin(x * PI) + 40.0 * sin((x / 3.0) * PI)) * 2.0) / 3.0;ret += ((150.0 * sin((x / 12.0) * PI) + 300.0 * sin((x / 30.0) * PI)) * 2.0) / 3.0;return ret;
}double* delta(double lon, double lat){double *d = (double *)malloc(2*sizeof(double));double dLon = transformLon(lon - 105.0, lat - 35.0);double dLat = transformLat(lon - 105.0, lat - 35.0);double radLat = (lat / 180.0) * PI;double magic = sin(radLat);magic = 1.0 - ee * magic * magic;double sqrtMagic = sqrt(magic);d[0] = (dLon * 180.0) / (a / sqrtMagic * cos(radLat) * PI);d[1] = (dLat * 180.0) / ((a * (1.0 - ee)) / (magic * sqrtMagic) * PI);return d;
}double* WGS84ToGCJ02(double lon_WGS, double lat_WGS){double *GCJ = (double *)malloc(2*sizeof(double));if (!isInChinaBbox(lon_WGS, lat_WGS)){GCJ[0] = lon_WGS;GCJ[1] = lat_WGS;return GCJ;} double *d = delta(lon_WGS, lat_WGS);GCJ[0] = lon_WGS + d[0];GCJ[1] = lat_WGS + d[1];return GCJ;
}double* GCJ02ToWGS84(double lon_GCJ, double lat_GCJ) {double *WGS = (double *)malloc(2*sizeof(double));if (!isInChinaBbox(lon_GCJ, lat_GCJ)){WGS[0] = lon_GCJ;WGS[1] = lat_GCJ;return WGS;} WGS[0] = lon_GCJ; WGS[1] = lat_GCJ;double *temp = WGS84ToGCJ02(WGS[0], WGS[1]);double dx = temp[0] - lon_GCJ;double dy = temp[1] - lat_GCJ;while (fabs(dx) > 1e-6 || fabs(dy) > 1e-6) {WGS[0] -= dx;WGS[1] -= dy;temp = WGS84ToGCJ02(WGS[0], WGS[1]);dx = temp[0] - lon_GCJ;dy = temp[1] - lat_GCJ;}return WGS;
}

地理坐标系:WGS84和BD09互转相关推荐

  1. GCJ-02和BD-09互转、GCJ-02和WGS-84互转

    主流被使用的地理坐标系并不统一,常用的有WGS84.GCJ02(火星坐标系).BD09(百度坐标系)以及百度地图中保存矢量信息的web墨卡托,本文利用C++实现几种坐标系统之间的互相转换. 一.GCJ ...

  2. 批量将postgis进行WGS84与bd-09,gcj-02坐标系转换

    WGS84与bd-09,gcj-02坐标系,百度经纬度与百度墨卡托之间互转 FreeGIS_Coordinate_Transform( in schema_name text, in table_na ...

  3. bd09转wgs84 java_各种坐标系互相转换(WGS84转换BD-09主要)

    背景:最近用百度地图加载几万个点,然后画多边形和线段,用百度API提供的方法一次转10个,超级慢,我就在后台调用转换方法,直接页面上去展示,结果7万个点画到地图用了几秒时间.分享一下,感觉有用点赞,还 ...

  4. Python3 Wgs84\gcj02\bd09\mercator\bd09mc坐标系转换与投影

    最基础的一组经纬度坐标转换,在网上找到过JavaScript和java版本的,但是没有找到python版本的,把JavaScript版本的改成了python版本的,能凑合用. "" ...

  5. iOS在地图上WGS84、GCJ-02、BD-09互转解决方案

    该项目的最新进展包括地图共享模块,android同事集团开始,使用百度地图sdk,我开始回,运用iOS SDK的mapkit做,之后,问题是,用纬度和经度坐标iOS端和Android端出现了比較大偏差 ...

  6. 【Java代码】坐标系说明+WGS84\GCJ02\BD09坐标系转换工具+Java坐标系转换及验证源代码分享(粘贴可用)

    1. 坐标系说明 开发地图应用服务时,一定会接触到各种坐标系,而保证坐标系的正确与合理是一切数据分析的前提,总的来说,坐标系可以分为两大类:地理坐标系GCS(Geographic Coordinate ...

  7. wgs-84,gcj-02,bd-09的相互转换,高德,世界测量,百度坐标系的相互转换,坐标系转换

    高德使用的是gcj-02坐标系,百度使用的是bd09坐标系,注意其间的相互转换 1.首先创建一个GPS对象类 public class Gps {private double wgLat;privat ...

  8. 地理坐标系与投影坐标系互转

    本文主要参考微信公众号"GIS前沿"文章:https://mp.weixin.qq.com/s/BhXV1O9flQUIkLJBFiAy2w:<关于投影坐标和坐标转换,这几点 ...

  9. java实现CGS2000大地坐标和WGS84经纬度坐标互转,亲测准确

    WGS84转CGS2000 中央子午线需要根据实际设置,参数为经度,纬度,输出值为经度(x),纬度(y) public static Point WGS84ToCGS2000(double longi ...

  10. ArcGIS+百度地图API:制作杭州市边界shp文件

    参考文章:百度地图API+ArcGIS软件-城市出行时空数据可视化_WenWu_Both的博客-CSDN博客 这篇博客在介绍的时候遗漏了很多关键步骤,我对此进行了必要的补充. 一.获取轮廓线的代码(g ...

最新文章

  1. 1000+个常用的Linux命令!看完通关!随手玩Linux!
  2. shell 下使用 echo 打印彩色字体及彩色背景
  3. java get key_java – KeyStore getKey()在Android中返回null
  4. P6772-[NOI2020]美食家【矩阵乘法,倍增】
  5. “DNAT+云链接+CDN”加速方案,助力出海企业落地生长
  6. java的vector是什么类_java中vector类
  7. 仓储rfid文件_RFID技术在智能制造模具管理中的应用
  8. .net pdf转图片_pdf转图片怎么转?看了就知道啦!
  9. 精通JavaScript DOM事件
  10. 软件设计模式经典书籍推荐
  11. clickhouse
  12. 奇偶校验码海明码循环冗余校验码
  13. 关于A卡和N卡对opengl驱动问题
  14. 超声波测距 c语言程序流程图,超声波测距单片机C程序+原理图+PCB源文件
  15. 隐藏文件的查看(Win/Linux/macOS)
  16. Ubuntu(乌班图)修改阿里云镜像源详细步骤及安装gcc编译器
  17. Redis性能测试工具benchmark简介
  18. ESP8266+水墨屏
  19. qq物联网 android sdk,物联网在腾讯:QQ物联
  20. ERP系统实施与企业内部控制管理实践

热门文章

  1. mysql强行关闭回滚中的进程_mysql查询正在执行的进程
  2. Android 布局优化方案
  3. vue3 effect
  4. 无线键盘RK61使用说明
  5. Python项目实战:抓取全网王者荣耀皮肤,收藏最好看的
  6. html怎么让滚动条不占位置,css怎么设置滚动条不占宽度?
  7. mongoDB 4.0 开启远程访问
  8. 阿里云存储oss依赖报错解决方法
  9. c语言获取系统时间精确到毫秒,如何获取系统流逝时间(要求精确到毫秒)
  10. 基于SDCC的工程化实践