coordtransform
Advanced tools
Comparing version 2.0.2 to 2.1.1
266
index.js
@@ -7,134 +7,148 @@ /** | ||
// if the module has no dependencies, the above pattern can be simplified to | ||
(function(root, factory) { | ||
if (typeof define === 'function' && define.amd) { | ||
// AMD. Register as an anonymous module. | ||
define([], factory); | ||
} else if (typeof module === 'object' && module.exports) { | ||
// Node. Does not work with strict CommonJS, but | ||
// only CommonJS-like environments that support module.exports, | ||
// like Node. | ||
module.exports = factory(); | ||
(function (root, factory) { | ||
if (typeof define === 'function' && define.amd) { | ||
// AMD. Register as an anonymous module. | ||
define([], factory); | ||
} else if (typeof module === 'object' && module.exports) { | ||
// Node. Does not work with strict CommonJS, but | ||
// only CommonJS-like environments that support module.exports, | ||
// like Node. | ||
module.exports = factory(); | ||
} else { | ||
// Browser globals (root is window) | ||
root.coordtransform = factory(); | ||
} | ||
}(this, function () { | ||
//定义一些常量 | ||
var x_PI = 3.14159265358979324 * 3000.0 / 180.0; | ||
var PI = 3.1415926535897932384626; | ||
var a = 6378245.0; | ||
var ee = 0.00669342162296594323; | ||
/** | ||
* 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换 | ||
* 即 百度 转 谷歌、高德 | ||
* @param bd_lon | ||
* @param bd_lat | ||
* @returns {*[]} | ||
*/ | ||
var bd09togcj02 = function bd09togcj02(bd_lon, bd_lat) { | ||
var bd_lon = +bd_lon; | ||
var bd_lat = +bd_lat; | ||
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_lng = z * Math.cos(theta); | ||
var gg_lat = z * Math.sin(theta); | ||
return [gg_lng, gg_lat] | ||
}; | ||
/** | ||
* 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换 | ||
* 即谷歌、高德 转 百度 | ||
* @param lng | ||
* @param lat | ||
* @returns {*[]} | ||
*/ | ||
var gcj02tobd09 = function gcj02tobd09(lng, lat) { | ||
var lat = +lat; | ||
var lng = +lng; | ||
var z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * x_PI); | ||
var theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * x_PI); | ||
var bd_lng = z * Math.cos(theta) + 0.0065; | ||
var bd_lat = z * Math.sin(theta) + 0.006; | ||
return [bd_lng, bd_lat] | ||
}; | ||
/** | ||
* WGS84转GCj02 | ||
* @param lng | ||
* @param lat | ||
* @returns {*[]} | ||
*/ | ||
var wgs84togcj02 = function wgs84togcj02(lng, lat) { | ||
var lat = +lat; | ||
var lng = +lng; | ||
if (out_of_china(lng, lat)) { | ||
return [lng, lat] | ||
} else { | ||
// Browser globals (root is window) | ||
root.coordtransform = factory(); | ||
var dlat = transformlat(lng - 105.0, lat - 35.0); | ||
var dlng = transformlng(lng - 105.0, lat - 35.0); | ||
var radlat = lat / 180.0 * PI; | ||
var magic = Math.sin(radlat); | ||
magic = 1 - ee * magic * magic; | ||
var sqrtmagic = Math.sqrt(magic); | ||
dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI); | ||
dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI); | ||
var mglat = lat + dlat; | ||
var mglng = lng + dlng; | ||
return [mglng, mglat] | ||
} | ||
}(this, function() { | ||
//定义一些常量 | ||
var x_PI = 3.14159265358979324 * 3000.0 / 180.0; | ||
var PI = 3.1415926535897932384626; | ||
var a = 6378245.0; | ||
var ee = 0.00669342162296594323; | ||
/** | ||
* 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换 | ||
* 即 百度 转 谷歌、高德 | ||
* @param bd_lon | ||
* @param bd_lat | ||
* @returns {*[]} | ||
*/ | ||
var bd09togcj02 = function bd09togcj02(bd_lon, bd_lat) { | ||
var x_pi = 3.14159265358979324 * 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_lng = z * Math.cos(theta); | ||
var gg_lat = z * Math.sin(theta); | ||
return [gg_lng, gg_lat] | ||
}; | ||
}; | ||
/** | ||
* 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换 | ||
* 即谷歌、高德 转 百度 | ||
* @param lng | ||
* @param lat | ||
* @returns {*[]} | ||
*/ | ||
var gcj02tobd09 = function gcj02tobd09(lng, lat) { | ||
var z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * x_PI); | ||
var theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * x_PI); | ||
var bd_lng = z * Math.cos(theta) + 0.0065; | ||
var bd_lat = z * Math.sin(theta) + 0.006; | ||
return [bd_lng, bd_lat] | ||
}; | ||
/** | ||
* GCJ02 转换为 WGS84 | ||
* @param lng | ||
* @param lat | ||
* @returns {*[]} | ||
*/ | ||
var gcj02towgs84 = function gcj02towgs84(lng, lat) { | ||
var lat = +lat; | ||
var lng = +lng; | ||
if (out_of_china(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 * PI; | ||
var magic = Math.sin(radlat); | ||
magic = 1 - ee * magic * magic; | ||
var sqrtmagic = Math.sqrt(magic); | ||
dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI); | ||
dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI); | ||
mglat = lat + dlat; | ||
mglng = lng + dlng; | ||
return [lng * 2 - mglng, lat * 2 - mglat] | ||
} | ||
}; | ||
/** | ||
* WGS84转GCj02 | ||
* @param lng | ||
* @param lat | ||
* @returns {*[]} | ||
*/ | ||
var wgs84togcj02 = function wgs84togcj02(lng, lat) { | ||
if (out_of_china(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 * PI; | ||
var magic = Math.sin(radlat); | ||
magic = 1 - ee * magic * magic; | ||
var sqrtmagic = Math.sqrt(magic); | ||
dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI); | ||
dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI); | ||
var mglat = lat + dlat; | ||
var mglng = lng + dlng; | ||
return [mglng, mglat] | ||
} | ||
}; | ||
var transformlat = function transformlat(lng, lat) { | ||
var lat = +lat; | ||
var lng = +lng; | ||
var ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng)); | ||
ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0; | ||
ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0; | ||
ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0; | ||
return ret | ||
}; | ||
/** | ||
* GCJ02 转换为 WGS84 | ||
* @param lng | ||
* @param lat | ||
* @returns {*[]} | ||
*/ | ||
var gcj02towgs84 = function gcj02towgs84(lng, lat) { | ||
if (out_of_china(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 * PI; | ||
var magic = Math.sin(radlat); | ||
magic = 1 - ee * magic * magic; | ||
var sqrtmagic = Math.sqrt(magic); | ||
dlat = (dlat * 180.0) / ((a * (1 - ee)) / (magic * sqrtmagic) * PI); | ||
dlng = (dlng * 180.0) / (a / sqrtmagic * Math.cos(radlat) * PI); | ||
mglat = lat + dlat; | ||
mglng = lng + dlng; | ||
return [lng * 2 - mglng, lat * 2 - mglat] | ||
} | ||
}; | ||
var transformlng = function transformlng(lng, lat) { | ||
var lat = +lat; | ||
var lng = +lng; | ||
var ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng)); | ||
ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0; | ||
ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0; | ||
ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0; | ||
return ret | ||
}; | ||
var transformlat = function transformlat(lng, lat) { | ||
var ret = -100.0 + 2.0 * lng + 3.0 * lat + 0.2 * lat * lat + 0.1 * lng * lat + 0.2 * Math.sqrt(Math.abs(lng)); | ||
ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0; | ||
ret += (20.0 * Math.sin(lat * PI) + 40.0 * Math.sin(lat / 3.0 * PI)) * 2.0 / 3.0; | ||
ret += (160.0 * Math.sin(lat / 12.0 * PI) + 320 * Math.sin(lat * PI / 30.0)) * 2.0 / 3.0; | ||
return ret | ||
}; | ||
/** | ||
* 判断是否在国内,不在国内则不做偏移 | ||
* @param lng | ||
* @param lat | ||
* @returns {boolean} | ||
*/ | ||
var out_of_china = function out_of_china(lng, lat) { | ||
var lat = +lat; | ||
var lng = +lng; | ||
// 纬度3.86~53.55,经度73.66~135.05 | ||
return !(lng > 73.66 && lng < 135.05 && lat > 3.86 && lat < 53.55); | ||
}; | ||
var transformlng = function transformlng(lng, lat) { | ||
var ret = 300.0 + lng + 2.0 * lat + 0.1 * lng * lng + 0.1 * lng * lat + 0.1 * Math.sqrt(Math.abs(lng)); | ||
ret += (20.0 * Math.sin(6.0 * lng * PI) + 20.0 * Math.sin(2.0 * lng * PI)) * 2.0 / 3.0; | ||
ret += (20.0 * Math.sin(lng * PI) + 40.0 * Math.sin(lng / 3.0 * PI)) * 2.0 / 3.0; | ||
ret += (150.0 * Math.sin(lng / 12.0 * PI) + 300.0 * Math.sin(lng / 30.0 * PI)) * 2.0 / 3.0; | ||
return ret | ||
}; | ||
/** | ||
* 判断是否在国内,不在国内则不做偏移 | ||
* @param lng | ||
* @param lat | ||
* @returns {boolean} | ||
*/ | ||
var out_of_china = function out_of_china(lng, lat) { | ||
return (lng < 72.004 || lng > 137.8347) || ((lat < 0.8293 || lat > 55.8271) || false); | ||
}; | ||
return { | ||
bd09togcj02: bd09togcj02, | ||
gcj02tobd09: gcj02tobd09, | ||
wgs84togcj02: wgs84togcj02, | ||
gcj02towgs84: gcj02towgs84 | ||
} | ||
})); | ||
return { | ||
bd09togcj02: bd09togcj02, | ||
gcj02tobd09: gcj02tobd09, | ||
wgs84togcj02: wgs84togcj02, | ||
gcj02towgs84: gcj02towgs84 | ||
} | ||
})); |
{ | ||
"name": "coordtransform", | ||
"version": "2.0.2", | ||
"version": "2.1.1", | ||
"description": "A common coordinate systems conversion module!", | ||
"main": "index.js", | ||
"scripts": { | ||
"test": "echo \"Error: no test specified\" && exit 1" | ||
"test": "node test/app.js" | ||
}, | ||
@@ -26,2 +26,2 @@ "repository": { | ||
"homepage": "http://wandergis.github.io/coordtransform" | ||
} | ||
} |
# coordtransform 坐标转换 | ||
**** | ||
一个提供了百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换的工具模块**另外还提供了python版本的代码https://github.com/wandergis/coordTransform_py** | ||
一个提供了百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换的工具模块。 | ||
python版本:https://github.com/wandergis/coordTransform_py | ||
命令行版本:https://github.com/wandergis/coordtransform-cli | ||
**** | ||
@@ -12,6 +16,4 @@ ## **支持node、浏览器(AMD方式和直接引用方式)** | ||
随着移动互联网的兴起,几乎每一个app都会去收集用户位置,如果恰好你在处理与地理定位相关的代码,并且不了解地理坐标系的话,肯定要被我大天朝各种坐标系搞晕。写这个模块的目的也是因为项目中app获取的坐标是百度sdk获取的,在做webgis可视化的时候各种偏,各种坐标不对,当时的心情就是下面这个图片。 | ||
随着移动互联网的兴起,几乎每一个app都会去收集用户位置,如果恰好你在处理与地理定位相关的代码,并且不了解地理坐标系的话,肯定要被我大天朝各种坐标系搞晕。写这个模块的目的也是因为项目中app获取的坐标是百度sdk获取的,在做webgis可视化的时候各种偏,各种坐标不对,叠加错位。 | ||
![image](http://7xocdq.com1.z0.glb.clouddn.com/image/4/d5/d3b841ab56b58fde3106b218c7504.png) | ||
## 当前互联网地图的坐标系现状 | ||
@@ -40,4 +42,4 @@ ### 地球坐标 (WGS84) | ||
iOS 地图(其实是高德) | ||
Gogole地图 | ||
搜搜、阿里云、高德地图 | ||
Google国内地图(.cn域名下) | ||
搜搜、阿里云、高德地图、腾讯 | ||
百度坐标系: | ||
@@ -47,3 +49,3 @@ 当然只有百度地图 | ||
国际标准,谷歌国外地图、osm地图等国外的地图一般都是这个 | ||
# 举个栗子 | ||
# 举个例子 | ||
笔者所在的公司app使用的是百度的sdk,需要对定位坐标做web可视化效果,百度地图提供的js api满足不了需求,选用leaflet来做可视化,这里要说到百度地图了,它使用的坐标系和切图的原点都不一致,并且其加偏还是非线性的,因此无法利用常用的加载方法去加载,放弃使用它的底图,选用了符合标准的高德底图,高德底图使用的是国测局坐标也就是GCJ02坐标系,如果简单的将app获取的经纬度叠加上去,就有可能你本来在百度大厦的位置就显示在西二旗地铁站了甚至更远,因此需要将bd09转成gcj02坐标系,这个时候这个库就有了用武之地,对点批量转换再加载到底图上,就可以让点显示在本应该出现的位置。 | ||
@@ -123,4 +125,10 @@ | ||
``` | ||
**** | ||
### todos | ||
- 墨卡托坐标 | ||
- geojson转换 | ||
- 批量转换 | ||
- turf插件 | ||
- leaflet插件 | ||
### sometipes | ||
对于做GIS的人来说,底图对我们还是很重要的,有时候看国外的底图很好看,换上之后发现坐标位置全部不对,因此写了这个包帮助大家完成坐标的转换,也准备写成一个leaflet的扩展,方便大家的使用,喜欢的童鞋请star,O(∩_∩)O |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
No tests
QualityPackage does not have any tests. This is a strong signal of a poorly maintained or low quality package.
Found 1 instance in 1 package
16632
8
167
0
131