├── 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 | 
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 |
--------------------------------------------------------------------------------