地图定位偏移以及坐标系转换(二)-不同坐标系的转换
不同坐標系轉換
// 定義一些常量 const x_PI = 3.14159265358979324 * 3000.0 / 180.0 const PI = 3.1415926535897932384626 // 圓周率 const a = 6378245.0 // 地球半徑(米) const ee = 0.00669342162296594323(一)地圖的偏移
1、百度地圖的偏移差別是(0.01185,-0.00328)
即如果百度地圖的經緯度是(lon,lat),實際的應該是(lon-0.01185,lat-0.00328)
2、google Map的偏移差別是(0.0143,-0.014)
即如果用getscreen截圖,如果要截的范圍為(lon,lat),輸入getscreen的為(lon-0.0143,lat+0.014)
(二)度分秒坐標轉換為經緯度
比如,采集到的是39°31'20.51,那么應該這樣換算,31分就是31/60度,20.51秒就是20.51/3600度,結果就是39+ 31/60 + 20.51/3600 度。
(三)GCJ-02與BD-09之間互轉
即國家測繪局GCJ-02坐標系(谷歌地圖、高德地圖、騰訊地圖)與BD-09坐標系(百度坐標,只適用于百度地圖的相關產品)的轉換。
百度坐標系轉火星坐標系 function bd_encrypt(gg_lon, gg_lat){var pi_value=Math.PI;var X_PI = pi_value * 3000.0 / 180.0;var x = gg_lon, y = gg_lat;var z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * X_PI);var theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * X_PI);var bd_lon = z * Math.cos(theta) + 0.0065;var bd_lat = z * Math.sin(theta) + 0.006;return {bd_lat: bd_lat,bd_lon: bd_lon}; }火星坐標系轉百度坐標系 function bd_decrypt(bd_lon,bd_lat) {var pi_value=Math.PI;var X_PI = pi_value * 3000.0 / 180.0;var x = bd_lon - 0.0065;var y = bd_lat - 0.006;var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * X_PI);var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * X_PI);var gg_lon = z * Math.cos(theta);var gg_lat = z * Math.sin(theta);return {gg_lon: gg_lon,gg_lat: gg_lat} }當然還有簡化版,如下
to_b是轉到百度,to_g是轉到GCJ-02。
var to_blng = function(lng) {return lng+0.0065; };var to_blat = function(lat) {return lat+0.0060; };var to_glng = function(lng) {return lng-0.0065; };var to_glat = function(lat) {return lat-0.0060; };(四)經緯度與墨卡托之間互轉
//經緯度轉墨卡托 function lonlatTomercator(lonlat) {var mercator={x:0,y:0};var x = lonlat.x *20037508.34/180;var y = Math.log(Math.tan((90+lonlat.y)*Math.PI/360))/(Math.PI/180);y = y *20037508.34/180;mercator.x = x;mercator.y = y;return mercator ; } //墨卡托轉經緯度 function mercatorTolonlat(mercator){var lonlat={x:0,y:0};var x = mercator.x/20037508.34*180;var y = mercator.y/20037508.34*180;y= 180/Math.PI*(2*Math.atan(Math.exp(y*Math.PI/180))-Math.PI/2);lonlat.x = x;lonlat.y = y;return lonlat; }(五)GCJ-02與WGS84之間互轉
// WGS84坐標系轉火星坐標系 export function wgs84togcj02 (lng, lat) {if (outOfChina(lng, lat)) {return [lng, lat]}else {var dlat = transformlat(lng - 105.0, lat - 35.0)var dlng = transformlng(lng - 105.0, lat - 35.0)var radlat = lat / 180.0 * PIvar magic = Math.sin(radlat)magic = 1 - ee * magic * magicvar sqrtmagic = Math.sqrt(magic)dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI)dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI)const mglat = lat + dlatconst mglng = lng + dlngreturn [mglng, mglat]} }// 火星坐標系 轉 WGS84 export function gcj02towgs84 (lng, lat) {if (outOfChina(lng, lat)) {return [lng, lat]}else {var dlat = transformlat(lng - 105.0, lat - 35.0)var dlng = transformlng(lng - 105.0, lat - 35.0)var radlat = lat / 180.0 * PIvar magic = Math.sin(radlat)magic = 1 - ee * magic * magicvar sqrtmagic = Math.sqrt(magic)dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI)dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI)const mglat = lat + dlatconst mglng = lng + dlngreturn [lng * 2 - mglng, lat * 2 - mglat]} }(六)BD-09與WGS84之間互轉
// 百度坐標系轉wgs84 export function bd09towgs84 (lng, lat) {// 百度坐標系先轉為火星坐標系const gcj02 = bd09togcj02(lng, lat)// 火星坐標系轉wgs84坐標系const result = gcj02towgs84(gcj02[0], gcj02[1])return result }// wgs84轉百度坐標系 export function wgs84tobd09 (lng, lat) {// wgs84先轉為火星坐標系const gcj02 = wgs84togcj02(lng, lat)// 火星坐標系轉百度坐標系const result = gcj02tobd09(gcj02[0], gcj02[1])return result }坐標轉換之后還有偏移
隨之而來的問題是坐標轉換之后還有偏移,那么需要考慮以下幾個方面:
1.原始坐標系弄錯
比如以為自己是GPS坐標,但其實已經是GCJ-02坐標。
解決方案:請確保采集到的數據是哪個坐標體系,需要轉換到哪個坐標系,再進行坐標轉換。
2.原始坐標準確度不夠
解決方案:如果您是GPS坐標,請確保采集GPS數據時,搜到至少4顆以上的衛星。并且GPS數據準不準,還取決于周圍建筑物的高度,越高越不準,因為有遮擋。
如果本來就是GCJ-02坐標,在不同地圖放大級別的時候,看到的地方可能不一樣。比如你在地圖級別4(國家)取到的坐標,放大到地圖12級(街道)時,坐標就偏了。請確保在地圖最大放大級別時,拾取坐標。
3.度分秒的概念混淆
比如,在googleearth上采集到的是39°31'20.51,那么應該這樣換算,31分就是31/60度,20.51秒就是20.51/3600度,結果就是39+ 31/60 + 20.51/3600 度。
4.經緯度順序寫反了
比如高德,百度,騰訊是先經度,再緯度,即Point(lng,lat)。但谷歌坐標的順序恰好相反,是(lat, lng)。
總結
以上是生活随笔為你收集整理的地图定位偏移以及坐标系转换(二)-不同坐标系的转换的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 【Linux系统中的】磁盘管理
- 下一篇: 结构化分析方法
