踩到的坑: 不同于POJ,GCJ有两个测试用例的文档,供你在本地得到输出,我开始的时候下载文档之后直接把文档中的数据复制出来,运行代码时贴上去,也就是,从标准输入流里读了数据。
1) 支持火星坐标系(GCJ02)、百度坐标系(BD09)、WGS84(4326)间相互转换 2) 支持多个表格同时进行坐标转换,能够自动识别表格中的经纬度数据列,转换后写入原数据表格(xls表格)或另存为
(gcj_lon * gcj_lon + gcj_lat * gcj_lat) + 0.00002 * Math.sin(gcj_lat * x_PI); double theta = Math.atan2(gcj_lat, gcj_lon) + 0.000003 * Math.cos(gcj_lon * x_PI); double bd_lon = z * Math.cos [] gcj02towgs84(double gcj_lon, double gcj_lat){ if (out_of_china(gcj_lon, gcj_lat)) { return new double[]{gcj_lon, gcj_lat}; } else { double dlat = transformlat(gcj_lon gcj02tobd09(wgs84_gcj02[0], wgs84_gcj02[1]); } /** * 判断是否中国境内 * @param lon *
(BD-09) 转换成 中国国測局地理坐标(GCJ-02)<火星坐标> * * @param location 百度地理坐标(BD-09) * * @return 中国国測局地理坐标(GCJ )wgs84ToBd09:(CLLocationCoordinate2D)location { CLLocationCoordinate2D gcj02Pt = [self gcj02Encrypt bdLon:gcj02Pt.longitude] ; } + (CLLocationCoordinate2D)gcj02ToBd09:(CLLocationCoordinate2D)location = [self bd09ToGcj02:location]; return [self gcj02Decrypt:gcj02.latitude gjLon:gcj02.longitude]; ); CLLocationCoordinate2D bd09 = [JZLocationConverter gcj02ToBd09:gcj02]; NSLog(@"%f,%f", bd09
_to_BD09(self, gcj_lng, gcj_lat): """ 实现GCJ02向BD09坐标系的转换 :param lng: GCJ02坐标系下的经度 * gcj_lng + gcj_lat * gcj_lat) + 0.00002 * math.sin(gcj_lat * self.x_pi) theta = math.atan2( gcj_lat, gcj_lng) + 0.000003 * math.cos(gcj_lng * self.x_pi) bd_lng = z * math.cos(theta) + 0.0065 = lat + dlat gcj_lat = lng + dlng return gcj_lng, gcj_lat def GCJ02_to_WGS84(self , gcj_lng, gcj_lat): ''' 实现GCJ02坐标系向WGS84坐标系的转换 :param gcj_lng: GCJ02坐标系下的经度
阅读更多 用GCJ编译Java源文件成脱离JRE的exe可执行文件 一、下载GCJ 到 http://www.thisiscool.com/gcc_mingw.htm 可以看到你有个版本 GCC/GCJ 3.4 GCC/GCJ 4.02 不管三七四十八,都下载下来先:) 二、解压检测,先来测试高版本的GCJ4.02 比如:E:\OpenSource\GCC4,可以看到有个gcc-4.0的目录 把 E: \OpenSource\GCC4\gcc-4.0\bin 这个目录加入到你的系统环境变量PATH当中 然后运行 gcj --help 可以看到帮助 再运行 gcj -v 可以看到当前的版本,如: Thread ; } } 四、新建一个批处理文件J2E.bat,内容如下,放在bin目录下,或系统目录下 gcj -c %1.java -o %1.o gcj --main=%1 -o %1 %1.o %1 --help 可以看到帮助 再运行 gcj -v 可以看到当前的版本 出现版本信息说明你的准备环境没有问题了。
GCJ02:中国国家测绘局制定的坐标系,即“火星坐标系”,对WGS84坐标进行加密。 BD09:百度地图使用的坐标系,在GCJ02基础上进行了二次加密。 它支持多种坐标系(如WGS84、GCJ02、BD09等)之间的转换。 首先,我们需要安装gcoord: npm install gcoord 然后,我们可以在代码中引入并使用它。 , 39.90923]; // 将WGS84坐标转换为GCJ02坐标 const gcj02Point = transform(wgs84Point, 'WGS84', 'GCJ02'); console.log (gcj02Point); // [116.403663, 39.914546] 同样,我们也可以将GCJ02坐标转换为BD09坐标: const gcj02Point = [116.403663, 39.914546 ]; const bd09Point = transform(gcj02Point, 'GCJ02', 'BD09'); console.log(bd09Point); // [116.410369,
我的操作 原始坐标 -> (BD09 to GCJ02 API) -> GCJ02坐标 -> (地图隐式转换) -> BD09坐标,这一来一回的转换恰好修正了问题,但这并不能确定原始坐标系的真实身份。 验证 A (对标 GCJ-02) :将 2021 年 1 月 1 日的原始坐标直接加载到高德地图(公认的 GCJ-02 标准)上。 原始坐标在QGIS中与高德地图(GCJ-02)底图完美贴合 验证 B (对标 WGS-84) :将 2021 年 1 月 1 日的原始坐标,通过第三方坐标转换库执行 GCJ02_to_WGS84 转换 原始坐标经GCJ02->WGS84转换后,与谷歌卫星影像(WGS-84)底图完美贴合 实测原始坐标当做 gcj02 使用第三方工具转为 wgs1984、叠加谷歌影像(上图)和叠加天地图(下图)都是完美对齐的 结论:数据不说谎,它就是 GCJ-02 上述测试形成了一条完整的证据链: 2021 年 1 月 1 日的共享单车数据,其真实坐标系是 GCJ-02,而非官方文档所声称的 BD-09。
WGS-84、GCJ-02、BD-09 坐标系 先了解一下WGS-84、GCJ-02、BD-09 坐标系分别是什么 WGS84(World Geodetic System 1984):是 GPS GCJ-02(国家测量局02号标准):GCJ-02 是由中国国家测绘局(G表示Guojia国家,C表示Cehui测绘,J表示Ju局)制订的地理信息系统的坐标系统,是在WGS84经纬度的基础上执行加密算法而成 因为GPS得到的经纬度直接在 GCJ-02 坐标系下会定位到错误的地点,有种到了火星的感觉,因此在坊间也将 GCJ-02 戏称为火星坐标系。 国内的高德地图就是用的 GCJ-02 坐标系 BD-09(Baidu, BD):是百度地图使用的地理坐标系,其在GCJ-02上多增加了一次变换,用来保护用户隐私。 WGS-84、GCJ-02、BD-09 坐标系之间的转换 新建一个 js 文件,直接把下面的代码copy进去。
其中地理坐标系又可分为参心坐标系和地心坐标系,常见的参心坐标系北京54、西安80,常见的地心坐标系有WGS84、GCJ02、BD09、GCS2000。 1.2 GCJ02(国家测量局02号标准)GCJ02 是由中国国家测绘局制订的地理信息系统的坐标系统,是在 WGS84 经纬度的基础上执行加密算法而成。 因为 GPS 得到的经纬度直接在 GCJ02 坐标系下会定位到错误的地点,有种到了火星的感觉,因此在坊间也将 GCJ-02 戏称为火星坐标系。 国测局规定,国内出版的各种地图系统(包括电子形式),必须至少采用 GCJ02 对地理位置进行首次加密的坐标系,腾讯(搜搜)地图、阿里云地图、Google和高德(国内)都是使用 GCJ02 坐标系,可以说 GCJ02 是国内最广泛使用的坐标系。
GCJ02:由中国国家测绘局制订的地理信息系统的坐标系统,是由WGS84坐标系经过加密后的坐标系。 BD09:百度坐标系,在GCJ02坐标系基础上再次加密。 更多的坐标知识介绍 百度使用的自家BD09LL坐标系,高德和腾讯都是GCJ02即火星坐标系,所以相互之间是需要转换的,不然会有位置偏移。 转换方法: /** * BD-09 坐标转换成 GCJ-02 坐标 */ public static LatLng BD2GCJ(LatLng bd) { double lat = z * Math.sin(theta); return new LatLng(lat, lng); } /** * GCJ -02 坐标转换成 BD-09 坐标 */ public static LatLng GCJ2BD(LatLng bd) { double x = bd.longitude
GCJ02坐标系 火星坐标系,是由中国国家测绘局制订的地理信息系统的坐标系统。由WGS84坐标系经加密后的坐标系。 BD09坐标系 百度地图使用坐标系,GCJ02坐标系经加密后的坐标系。 300.0 * sin(x / 30.0 * pi)) * 2.0 / 3.0; return ret; } /*参数 wgLat:WGS-84纬度wgLon:WGS-84经度 返回值: mgLat:GCJ -02纬度mgLon:GCJ-02经度*/ void gps_transform( double wgLat, double wgLon, double& mgLat, double& mgLon) dLon; } 百度地图 #include <math.h> const double x_pi = 3.14159265358979324 * 3000.0 / 180.0; //将 GCJ gg_lat = z * sin(theta); } 借用其他博客的图片做个简要说明: 国际做法: 百度做法: 总结 经过上述过程后,车载GPS在地图上绘制后即可不会偏移 规划车辆路线时,同理需要将GCJ02
因为GPS得到的经纬度直接在 GCJ-02 坐标系下会定位到错误的地点,有种到了⽕星的感觉,因此在坊间也将 GCJ-02 戏称为火星坐标系。 BD09:只有百度地图没有使用这种加密算法,而是使用的是BD09,从名字上可以看出,GCJ02是2002年提出来的算法,BD09则是2009年提出来的,虽然百度地图没有使用GCJ02加密算法,但是他却是在 GCJ02基础上做了一个二次加密,所以说,从WGS84坐标系不能直接转BD09,中间需要跨越一个GCJ02,反过来,需要将GCJ02或者BD09转为WGS84就是纠偏算法,相当于逆向解密,同样的DB09 : gcj02tobd09, wgs84togcj02: wgs84togcj02, gcj02towgs84: gcj02towgs84 } })); 使用方法: //国测局坐标( (bd09togcj02); console.log(gcj02tobd09); console.log(wgs84togcj02); console.log(gcj02towgs84); //result
-02坐标系 GCJ-02坐标系又名“火星坐标系”,是我国国测局独创的坐标体系,由WGS-84加密而成,在国内,必须至少使用GCJ-02坐标系,或者使用在GCJ-02加密后再进行加密的坐标系,如百度坐标系 高德和Google在国内都是使用GCJ-02坐标系,可以说,GCJ-02是国内最广泛使用的坐标系; 3.百度坐标系:bd-09 百度坐标系是在GCJ-02坐标系的基础上再次加密偏移后形成的坐标系,只适用于百度地图 = gps84_To_Gcj02(lat,lon); double[] bd09 = gcj02_To_Bd09(gcj02[0],gcj02[1]); return bd09 ; } public static double[] bd09_To_gps84(double lat,double lon){ double[] gcj02 = bd09_To_Gcj02 (lat, lon); double[] gps84 = gcj02_To_Gps84(gcj02[0], gcj02[1]); //保留小数点后六位 gps84[0
,lat) row['经度'],row['纬度']=latlng except: pass return row dictTransform={'gcj02 _to_bd09':gcj02_to_bd09,'bd09_to_gcj02':bd09_to_gcj02, 'wgs84_to_gcj02':wgs84_to_gcj02,'gcj02_to_wgs84 ':gcj02_to_wgs84, 'bd09_to_wgs84':bd09_to_wgs84,'wgs84_to_bd09':wgs84_to_bd09, } class coordTransformHandler
Server VM (build 1.6.0-b09, mixed mode) 1 卸载openjdk1.6.0 先查看 rpm -qa | grep java 显示如下信息: java-1.4.2-gcj-compat -1.4.2.0-40jpp.115 java-1.6.0-openjdk-1.6.0.0-1.7.b09.el5 卸载: rpm -e --nodeps java-1.4.2-gcj-compat-1.4.2.0 -40jpp.115 rpm -e --nodeps java-1.6.0-openjdk-1.6.0.0-1.7.b09.el5 还有一些其他的命令 rpm -qa | grep gcj rpm -qa | grep jdk 如果出现找不到openjdk source的话,那么还可以这样卸载 yum -y remove java java-1.4.2-gcj-compat-1.4.2.0-40jpp
一、WGS 84 坐标系和 GCJ-02 坐标加密偏移 1、大地坐标系 和 加密坐标系 大地坐标系 大地坐标系(Geodetic Coordinate System)是一种用于 表示地球上位置的坐标系统 以下是一些国家常见的加密坐标系的示例: GCJ-02(国测局加密坐标): 中国采用的加密坐标系,也称为火星坐标系,对WGS 84坐标进行加密偏移。 BD-09(百度坐标): 百度地图使用的加密坐标系,对GCJ-02坐标进行加密偏移。 Kartverket GK(挪威国家地理信息系统): 挪威采用的加密坐标系,对WGS 84坐标进行加密和转换。 3、GCJ-02 坐标加密偏移 GCJ-02 是 " 中国国家测绘局加密坐标 " , 又称为 火星坐标系 , 由 中国国家测绘局 制定的 地理坐标系统 , 在中国境内进行定位 和 地图制作 , 必须使用 -02 国测局加密坐标 , 才能准确的显示到地图上 ; 上述 将 WGS 84 坐标 转为 GCJ-02 国测局加密坐标 需要通过 高德地图 / 百度地图 / 腾讯地图 的 API 完成 ;
_to_bd09(self, lng, lat): """ 火星坐标系(GCJ-02)转百度坐标系(BD-09) 谷歌、高德——>百度 : (self, lng, lat): """ WGS84转GCJ02(火星坐标系) :param lng:WGS84坐标系的经度 :param _to_wgs84(self, lng, lat): """ GCJ02(火星坐标系)转GPS84 :param lng:火星坐标系的经度 (bd_lon, bd_lat) return self.gcj02_to_wgs84(lon, lat) def wgs84_to_bd09(self, lon, lat) : lon, lat = self.wgs84_to_gcj02(lon, lat) return self.gcj02_to_bd09(lon, lat)
坐标系 谷歌地图采用的是WGS84地理坐标系(中国范围除外) 谷歌中国地图、搜搜中国地图、高德地图采用的是GCJ02地理坐标系 百度采用的是BD09坐标系。 为什么不统一用WGS84地理坐标系这就是国家地理测绘总局对于出版地图的要求,出版地图必须符合GCJ02坐标系标准,也就是国家规定不能直接使用WGS84地理坐标系。 GCJ02:又称火星坐标系,是由中国国家测绘局制定的地理坐标系统,是由WGS84加密后得到的坐标系。 BD09:为百度坐标系,在GCJ02坐标系基础上再次加密。 _to_gcj02(lon, lat) return gcj02_to_bd09(lon, lat) def _transformlat(lng, lat): ret = -100.0 _to_bd09(lng, lat) # result2 = bd09_to_gcj02(lng, lat) # result3 = wgs84_to_gcj02(lng, lat)
* @param lon 经度 * @param lat 纬度 * @return */ public static String gps84_To_Gcj02 = bdToGaoDe(lon, lat).split(","); return gcj02_To_Gps84(Double.parseDouble(gcj02[0]), Double.parseDouble (gcj02[1])); } /** * 高德 == 》 百度 * * @param lon 经度 * @param lat 纬度 * = gps84_To_Gcj02(lon, lat).split(","); return gcj02_To_Bd09(Double.parseDouble(Gcj02[0]), Double.parseDouble (Gcj02[1])); } /** * wgs84to墨卡托 * * @param lng 经度 * @param lat 纬度