├── app.wxss ├── pages └── index │ ├── index.json │ ├── index.wxml │ ├── index.wxss │ └── index.js ├── app.js ├── .gitignore ├── app.json ├── project.config.json ├── README.md └── utils └── WSCoordinate.js /app.wxss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /pages/index/index.json: -------------------------------------------------------------------------------- 1 | { 2 | "usingComponents": {} 3 | } -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | //app.js 2 | App({ 3 | onLaunch: function () { 4 | 5 | } 6 | }) -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Windows 2 | [Dd]esktop.ini 3 | Thumbs.db 4 | $RECYCLE.BIN/ 5 | 6 | # macOS 7 | .DS_Store 8 | .fseventsd 9 | .Spotlight-V100 10 | .TemporaryItems 11 | .Trashes 12 | 13 | # Node.js 14 | node_modules/ 15 | -------------------------------------------------------------------------------- /app.json: -------------------------------------------------------------------------------- 1 | { 2 | "pages":[ 3 | "pages/index/index" 4 | ], 5 | "window":{ 6 | "backgroundTextStyle":"light", 7 | "navigationBarBackgroundColor": "#fff", 8 | "navigationBarTitleText": "经纬度转换", 9 | "navigationBarTextStyle":"black" 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /pages/index/index.wxml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 当前:32.0806670849,118.9060163095 4 | 5 | 6 | 7 | {{item}} 8 | 转换后:{{results[index].latitude}},{{results[index].longitude}} 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /pages/index/index.wxss: -------------------------------------------------------------------------------- 1 | .BGView { 2 | position: absolute; 3 | width: 100%; 4 | height: 100%; 5 | background-color: lightblue; 6 | } 7 | 8 | .latLonText { 9 | width: 690rpx; 10 | height: 80rpx; 11 | margin: 30rpx; 12 | display: flex; 13 | justify-content: center; 14 | } 15 | 16 | .typesView { 17 | margin: 30rpx; 18 | height: 150rpx; 19 | background-color: lightgray; 20 | } 21 | 22 | .titleView { 23 | font-size: 30rpx; 24 | height: 50rpx; 25 | } 26 | 27 | .valueView { 28 | font-size: 30rpx; 29 | height: 100rpx; 30 | color: orangered; 31 | } -------------------------------------------------------------------------------- /project.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "description": "项目配置文件", 3 | "packOptions": { 4 | "ignore": [] 5 | }, 6 | "setting": { 7 | "urlCheck": true, 8 | "es6": true, 9 | "postcss": true, 10 | "minified": true, 11 | "newFeature": true, 12 | "autoAudits": false 13 | }, 14 | "compileType": "miniprogram", 15 | "libVersion": "2.5.1", 16 | "appid": "wx67575f91f0edfa84", 17 | "projectname": "%E7%BB%8F%E7%BA%AC%E5%BA%A6%E8%BD%AC%E6%8D%A2", 18 | "debugOptions": { 19 | "hidedInDevtools": [] 20 | }, 21 | "isGameTourist": false, 22 | "condition": { 23 | "search": { 24 | "current": -1, 25 | "list": [] 26 | }, 27 | "conversation": { 28 | "current": -1, 29 | "list": [] 30 | }, 31 | "game": { 32 | "currentL": -1, 33 | "list": [] 34 | }, 35 | "miniprogram": { 36 | "current": -1, 37 | "list": [] 38 | } 39 | } 40 | } -------------------------------------------------------------------------------- /pages/index/index.js: -------------------------------------------------------------------------------- 1 | var util = require('../../utils/WSCoordinate.js') 2 | 3 | 4 | Page({ 5 | 6 | data: { 7 | results:[], 8 | types: ["将WGS-84(国际标准)转为GCJ-02(火星坐标)", "将GCJ-02(火星坐标)转为百度坐标", "将百度坐标转为GCJ-02(火星坐标)", "将GCJ-02(火星坐标)转为WGS-84"] 9 | }, 10 | 11 | onLoad: function (options) { 12 | var array = []; 13 | 14 | //举例子:我们以经纬度 1 为例进行转换 15 | 16 | /** 17 | * 将WGS-84(国际标准)转为GCJ-02(火星坐标) 18 | */ 19 | var result1 = util.transformFromWGSToGCJ(32.0806670849, 118.9060163095); 20 | console.log("result1 = ",result1) 21 | array.push(result1); 22 | 23 | /** 24 | * 将GCJ-02(火星坐标)转为百度坐标 25 | */ 26 | var result2 = util.transformFromGCJToBaidu(32.0806670849, 118.9060163095); 27 | console.log("result2 = ",result2) 28 | array.push(result2); 29 | 30 | /** 31 | * 将百度坐标转为GCJ-02(火星坐标) 32 | */ 33 | var result3 = util.transformFromBaiduToGCJ(32.0806670849, 118.9060163095); 34 | console.log("result3 = ",result3) 35 | array.push(result3); 36 | 37 | /** 38 | * 将GCJ-02(火星坐标)转为WGS-84 39 | */ 40 | var result4 = util.transformFromGCJToWGS(32.0806670849, 118.9060163095); 41 | console.log("result4 = ",result4) 42 | array.push(result4); 43 | this.setData({ results: array }) 44 | }, 45 | 46 | }) -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | # wechat-Coordinate 3 | 微信小程序经纬度转换,坐标系转换💯 WGS-84(国际标准)、GCJ-02(火星坐标) 、百度坐标相互转换 4 | 5 | 此转换库为本地坐标转换库,不需要依赖网络资源,快速转换。可在极短时间内转换大量坐标。
6 | 如果使用过程中有问题,请issue我 (。♥‿♥。)
7 | 如果觉得对你还有些用,顺手点一下star吧 (。♥‿♥。)
8 | 9 | # Demo截图 10 | ![在这里插入图片描述](https://img-blog.csdnimg.cn/2019012411184361.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzI2NTk4MDc3,size_16,color_FFFFFF,t_70) 11 | # 方法 12 | 提供以下方法 13 | 14 | ```ruby 15 | /** 16 | * 判断经纬度是否超出中国境内 17 | */ 18 | function isLocationOutOfChina(latitude, longitude) 19 | 20 | /** 21 | * 将WGS-84(国际标准)转为GCJ-02(火星坐标): 22 | */ 23 | function transformFromWGSToGCJ(latitude, longitude) 24 | 25 | /** 26 | * 将GCJ-02(火星坐标)转为百度坐标: 27 | */ 28 | function transformFromGCJToBaidu(latitude, longitude) 29 | 30 | /** 31 | * 将百度坐标转为GCJ-02(火星坐标): 32 | */ 33 | function transformFromBaiduToGCJ(latitude, longitude) 34 | 35 | /** 36 | * 将GCJ-02(火星坐标)转为WGS-84: 37 | */ 38 | function transformFromGCJToWGS(latitude, longitude) 39 | 40 | ``` 41 | # 如何使用 42 | 下载此项目,将项目中的WSCoordinate.js复制到您的项目根目录utils文件夹(或其他文件夹)。 43 | 44 | 在您要使用的页面对应的.JS文件中引入 45 | ```ruby 46 | var util = require('../../utils/WSCoordinate.js') 47 | ``` 48 | 49 | 在您需要转换的地方使用 50 | ```ruby 51 | 52 | //将WGS-84(国际标准)转为GCJ-02(火星坐标) 53 | var result1 = util.transformFromWGSToGCJ(32.0806670849, 118.9060163095); 54 | 55 | // 将GCJ-02(火星坐标)转为百度坐标 56 | var result2 = util.transformFromGCJToBaidu(32.0806670849, 118.9060163095); 57 | 58 | //将百度坐标转为GCJ-02(火星坐标) 59 | var result3 = util.transformFromBaiduToGCJ(32.0806670849, 118.9060163095); 60 | 61 | //将GCJ-02(火星坐标)转为WGS-84 62 | var result4 = util.transformFromGCJToWGS(32.0806670849, 118.9060163095); 63 | 64 | ``` 65 | 方法的返回值result是一个对象,格式为 66 | ```ruby 67 | { 68 | latitude: 纬度的值, 69 | longitude: 经度的值 70 | } 71 | ``` 72 | 73 | 74 | #### github下载地址:[https://github.com/Zws-China/wechat-Coordinate](https://github.com/Zws-China/wechat-Coordinate) 75 | 76 | 如果使用过程中有问题,请issue我 (。♥‿♥。)
77 | 如果觉得对你还有些用,顺手点一下star吧 (。♥‿♥。) 你的支持是我继续的动力。
78 | 79 | -------------------------------------------------------------------------------- /utils/WSCoordinate.js: -------------------------------------------------------------------------------- 1 | 2 | /** 3 | * 判断经纬度是否超出中国境内 4 | */ 5 | function isLocationOutOfChina(latitude, longitude) { 6 | if (longitude < 72.004 || longitude > 137.8347 || latitude < 0.8293 || latitude > 55.8271) 7 | return true; 8 | return false; 9 | } 10 | 11 | 12 | /** 13 | * 将WGS-84(国际标准)转为GCJ-02(火星坐标): 14 | */ 15 | function transformFromWGSToGCJ(latitude, longitude) { 16 | var lat = ""; 17 | var lon = ""; 18 | var ee = 0.00669342162296594323; 19 | var a = 6378245.0; 20 | var pi = 3.14159265358979324; 21 | 22 | if (isLocationOutOfChina(latitude, longitude)) { 23 | lat = latitude; 24 | lon = longitude; 25 | } 26 | else { 27 | var adjustLat = transformLatWithXY(longitude - 105.0, latitude - 35.0); 28 | var adjustLon = transformLonWithXY(longitude - 105.0, latitude - 35.0); 29 | var radLat = latitude / 180.0 * pi; 30 | var magic = Math.sin(radLat); 31 | magic = 1 - ee * magic * magic; 32 | var sqrtMagic = Math.sqrt(magic); 33 | adjustLat = (adjustLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi); 34 | adjustLon = (adjustLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi); 35 | latitude = latitude + adjustLat; 36 | longitude = longitude + adjustLon; 37 | } 38 | return { latitude: latitude, longitude: longitude }; 39 | 40 | } 41 | 42 | /** 43 | * 将GCJ-02(火星坐标)转为百度坐标: 44 | */ 45 | function transformFromGCJToBaidu(latitude, longitude) { 46 | var pi = 3.14159265358979324 * 3000.0 / 180.0; 47 | 48 | var z = Math.sqrt(longitude * longitude + latitude * latitude) + 0.00002 * Math.sin(latitude * pi); 49 | var theta = Math.atan2(latitude, longitude) + 0.000003 * Math.cos(longitude * pi); 50 | var a_latitude = (z * Math.sin(theta) + 0.006); 51 | var a_longitude = (z * Math.cos(theta) + 0.0065); 52 | 53 | return { latitude: a_latitude, longitude: a_longitude }; 54 | } 55 | 56 | /** 57 | * 将百度坐标转为GCJ-02(火星坐标): 58 | */ 59 | function transformFromBaiduToGCJ(latitude, longitude) { 60 | var xPi = 3.14159265358979323846264338327950288 * 3000.0 / 180.0; 61 | 62 | var x = longitude - 0.0065; 63 | var y = latitude - 0.006; 64 | var z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * xPi); 65 | var theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * xPi); 66 | var a_latitude = z * Math.sin(theta); 67 | var a_longitude = z * Math.cos(theta); 68 | 69 | return { latitude: a_latitude, longitude: a_longitude }; 70 | } 71 | 72 | /** 73 | * 将GCJ-02(火星坐标)转为WGS-84: 74 | */ 75 | function transformFromGCJToWGS(latitude, longitude) { 76 | var threshold = 0.00001; 77 | 78 | // The boundary 79 | var minLat = latitude - 0.5; 80 | var maxLat = latitude + 0.5; 81 | var minLng = longitude - 0.5; 82 | var maxLng = longitude + 0.5; 83 | 84 | var delta = 1; 85 | var maxIteration = 30; 86 | 87 | while (true) { 88 | var leftBottom = transformFromWGSToGCJ(minLat, minLng); 89 | var rightBottom = transformFromWGSToGCJ(minLat, maxLng); 90 | var leftUp = transformFromWGSToGCJ(maxLat, minLng); 91 | var midPoint = transformFromWGSToGCJ((minLat + maxLat) / 2, (minLng + maxLng) / 2); 92 | delta = Math.abs(midPoint.latitude - latitude) + Math.abs(midPoint.longitude - longitude); 93 | 94 | if (maxIteration-- <= 0 || delta <= threshold) { 95 | return { latitude: (minLat + maxLat) / 2, longitude: (minLng + maxLng) / 2 }; 96 | } 97 | 98 | if (isContains({ latitude: latitude, longitude: longitude }, leftBottom, midPoint)) { 99 | maxLat = (minLat + maxLat) / 2; 100 | maxLng = (minLng + maxLng) / 2; 101 | } 102 | else if (isContains({ latitude: latitude, longitude: longitude }, rightBottom, midPoint)) { 103 | maxLat = (minLat + maxLat) / 2; 104 | minLng = (minLng + maxLng) / 2; 105 | } 106 | else if (isContains({ latitude: latitude, longitude: longitude }, leftUp, midPoint)) { 107 | minLat = (minLat + maxLat) / 2; 108 | maxLng = (minLng + maxLng) / 2; 109 | } 110 | else { 111 | minLat = (minLat + maxLat) / 2; 112 | minLng = (minLng + maxLng) / 2; 113 | } 114 | } 115 | 116 | } 117 | 118 | function isContains(point, p1, p2) { 119 | return (point.latitude >= Math.min(p1.latitude, p2.latitude) && point.latitude <= Math.max(p1.latitude, p2.latitude)) && (point.longitude >= Math.min(p1.longitude, p2.longitude) && point.longitude <= Math.max(p1.longitude, p2.longitude)); 120 | } 121 | 122 | function transformLatWithXY(x, y) { 123 | var pi = 3.14159265358979324; 124 | var lat = -100.0 + 2.0 * x + 3.0 * y + 0.2 * y * y + 0.1 * x * y + 0.2 * Math.sqrt(Math.abs(x)); 125 | lat += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0; 126 | lat += (20.0 * Math.sin(y * pi) + 40.0 * Math.sin(y / 3.0 * pi)) * 2.0 / 3.0; 127 | lat += (160.0 * Math.sin(y / 12.0 * pi) + 320 * Math.sin(y * pi / 30.0)) * 2.0 / 3.0; 128 | return lat; 129 | } 130 | 131 | function transformLonWithXY(x, y) { 132 | var pi = 3.14159265358979324; 133 | var lon = 300.0 + x + 2.0 * y + 0.1 * x * x + 0.1 * x * y + 0.1 * Math.sqrt(Math.abs(x)); 134 | lon += (20.0 * Math.sin(6.0 * x * pi) + 20.0 * Math.sin(2.0 * x * pi)) * 2.0 / 3.0; 135 | lon += (20.0 * Math.sin(x * pi) + 40.0 * Math.sin(x / 3.0 * pi)) * 2.0 / 3.0; 136 | lon += (150.0 * Math.sin(x / 12.0 * pi) + 300.0 * Math.sin(x / 30.0 * pi)) * 2.0 / 3.0; 137 | return lon; 138 | } 139 | 140 | 141 | 142 | module.exports = { 143 | isLocationOutOfChina: isLocationOutOfChina, 144 | transformFromWGSToGCJ: transformFromWGSToGCJ, 145 | transformFromGCJToBaidu: transformFromGCJToBaidu, 146 | transformFromBaiduToGCJ: transformFromBaiduToGCJ, 147 | transformFromGCJToWGS: transformFromGCJToWGS 148 | } 149 | --------------------------------------------------------------------------------