UNPKG

coordinates_convert

Version:

地理坐标转换库,任意类型经纬度数据集(GeoJSON、数组、字符串)实现WGS84、GCJ02、BD09互转。 a utility library for helping convert coordinates from collection like GeoJSON or Array & ect.Use Regular Expression Matching,convert by coordinate-convert

127 lines (119 loc) 5.42 kB
# coordinates_convert ## 说明 + 一个转换坐标的处理工具(百度火星wg84任意互转),支持任意类型数据(坐标数据必须是经纬度数组) + 支持任意格式的经纬度坐标对数据,经纬度坐标转换 - GeoJSON对象序列化GeoJSON字符串,如:; - 逗号分隔的单点经纬度坐标值,如:11.22,44,22 - 一维(单点)二维(多点或线)三维(多线或面)和四维(多面)坐标经纬度数组和其序列化字符串,如:[112133][[112133],][[[11,33],[22,44]]] ……' - 其他格式,只要经纬成成对出现即可 + A utility library for helping convert coordinates from string like GeoJSON Array.Use regular expression patter coordinates 经纬度转换,单个坐标转换,不是啥事百度高德maptalksmapbox都自带相关函数但是,对于GeoJSON,或者任意格式的经纬度转换就比较麻烦 你不知道用户给的是几位数组,GeoJSON给的是面坐标数据但是确实二维数组也不一定是GeoJSON格如果去判断数据类型,一层层判读下来,…… 平时我们去url的search params ,用的就是正则,同理,经纬度坐标转换,用相同方法岂不是更省事 ```javascript function getUrlParams (url) { url || (url = window ? window.location.search : '') if (!url) { return {} } let params = {} url.replace(/([^=?&]+)=([^=?&]*)/g, (str, $1, $2) => { params[$1] = $2 }) return params } ``` 正则万岁! ## 源于coordtransform 经纬度数据转换方法,源自于coordtransform + coordtransform npm地址:https://www.npmjs.com/package/coordtransform2,官网:http://wandergis.com/coordtransform/ + 提供了百度火星坐标(国测局gcj02坐标)wgs84(天地图坐标)之间转换 ```javascript //百度经纬度坐标转国测局坐标 var bd09togcj02=coordtransform.bd09togcj02(116.404, 39.915); //国测局坐标转百度经纬度坐标 var gcj02tobd09=coordtransform.gcj02tobd09(116.404, 39.915); //wgs84转国测局坐标 var wgs84togcj02=coordtransform.wgs84togcj02(116.404, 39.915); //国测局坐标转wgs84坐标 var gcj02towgs84=coordtransform.gcj02towgs84(116.404, 39.915); ``` *注意*:百度坐标转wg84没有提供直接方法,需要先百度经纬度坐标转国测局坐标吗,再国测局坐标转wgs84坐标 但是,遇到GeoJSON字符串转换,或者数组转换,去循环替换,方法可靠,但是代码量太多 个人觉得用正则表达式转换,代码上,最简洁所以,就有了此包 ## 测试 测试实例: ```javascript let {convertCoords} = require('./index') let coordinates0 = '[-0.131049, 51.498568]' let coordinates1 = '-0.131049, 51.498568' let coordinates2 = '[-0.131049, 51.498568],[-0.131049, 51.498568]' let coordinates3 = [-0.131049, 51.498568] let coordinates4 = [[-0.131049, 51.498568], [-0.131049, 51.498568]] let coordinates5 = { "type": "Feature", "geometry": {"type": "Point", "coordinates": [-0.113049, 51.498568]}, "properties": {"name": "point marker"} } let coordinates6 = '{"type":"Feature","geometry":{"type":"Point","coordinates":[-0.113049,51.498568]},"properties":{"name":"point marker"}}' debugger let m0 = convertCoords(coordinates0, 'bd09', 'wgs84') let m1 = convertCoords(coordinates1, 'gcj02', 'wgs84') let m2 = convertCoords(coordinates2, 'gcj02', 'wgs84') let m3 = convertCoords(coordinates3, 'gcj02', 'wgs84') let m4 = convertCoords(coordinates4, 'gcj02', 'wgs84') let m5 = convertCoords(coordinates5, 'gcj02', 'wgs84') let m6 = convertCoords(coordinates6, 'gcj02', 'wgs84') console.log(m0) console.log(m1) console.log(m2) console.log(m3) console.log(m4) console.log(m5) console.log(m6) ``` ## 为什么经纬度默认取6| 赤道周长(米)| 度数(度)| | ---- | ---- | 40076000 | 360 111322.2222 | 1 11132.22222 | 0.1 1113.222222 | 0.01 111.3222222 | .0001 11.13222222 | .00001 1.113222222 | .000001 0.111322222 | .0000001 0.011132222 | .00000001 + 首先参考一个标准:维度是平行的,相邻的1度距离约等于111km + 经纬度相差0.000001度时候,距离相差位0.111米 对于在线地图,经纬度的读数,精确到小数点之后第六位,已经足够当前gps精度下的使用 ## 经纬度不是坐标数组,怎么转换 那就先转换为GeoJSON咯,传送门:https://www.npmjs.com/package/geojson ```javascript var data = [ { name: 'Location A', category: 'Store', street: 'Market', lat: 39.984, lng: -75.343 }, { name: 'Location B', category: 'House', street: 'Broad', lat: 39.284, lng: -75.833 }, { name: 'Location C', category: 'Office', street: 'South', lat: 39.123, lng: -74.534 } ]; GeoJSON.parse(data, {Point: ['lat', 'lng'], include: ['name']}); ``` 转换结果 ```json { "type": "FeatureCollection", "features": [ { "type": "Feature", "geometry": {"type": "Point", "coordinates": [-75.343, 39.984]}, "properties": { "name": "Location A" } }, { "type": "Feature", "geometry": {"type": "Point", "coordinates": [ -75.534, 39.123]}, "properties": { "name": "Location C" } } ] } ```