You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

69 lines
2.6 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/**
* 坐标转换:业务数据为腾讯/国测局 GCJ-02天地图底图为 WGS84/CGCS2000
*/
const PI = Math.PI
const A = 6378245.0
const EE = 0.00669342162296594323
function outOfChina(lng, lat) {
return lng < 72.004 || lng > 137.8347 || lat < 0.8293 || lat > 55.8271
}
function transformLat(lng, lat) {
let 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
}
function transformLng(lng, lat) {
let 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
}
/** GCJ-02 → WGS84天地图展示用 */
export function gcj02ToWgs84(lng, lat) {
lng = parseFloat(lng)
lat = parseFloat(lat)
if (isNaN(lng) || isNaN(lat)) return { lng, lat }
if (outOfChina(lng, lat)) return { lng, lat }
let dlat = transformLat(lng - 105.0, lat - 35.0)
let dlng = transformLng(lng - 105.0, lat - 35.0)
const radlat = lat / 180.0 * PI
let magic = Math.sin(radlat)
magic = 1 - EE * magic * magic
const 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 + dlat
const mglng = lng + dlng
return { lng: lng * 2 - mglng, lat: lat * 2 - mglat }
}
/** WGS84 → GCJ-02 */
export function wgs84ToGcj02(lng, lat) {
lng = parseFloat(lng)
lat = parseFloat(lat)
if (isNaN(lng) || isNaN(lat)) return { lng, lat }
if (outOfChina(lng, lat)) return { lng, lat }
let dlat = transformLat(lng - 105.0, lat - 35.0)
let dlng = transformLng(lng - 105.0, lat - 35.0)
const radlat = lat / 180.0 * PI
let magic = Math.sin(radlat)
magic = 1 - EE * magic * magic
const sqrtmagic = Math.sqrt(magic)
dlat = (dlat * 180.0) / ((A * (1 - EE)) / (magic * sqrtmagic) * PI)
dlng = (dlng * 180.0) / (A / sqrtmagic * Math.cos(radlat) * PI)
return { lng: lng + dlng, lat: lat + dlat }
}
/** uni-app scale(约3-20) 转天地图 zoom(约1-18) */
export function uniScaleToTdtZoom(scale) {
const s = parseInt(scale, 10) || 11
return Math.max(3, Math.min(18, s + 1))
}