Created
September 17, 2012 06:37
-
-
Save aisk/3735854 to your computer and use it in GitHub Desktop.
百度地图坐标与像素互相转换的方法
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pixelToPoint = function(point, zoom, center, bounds) { | |
// 像素到坐标 | |
if (!point) { | |
return | |
} | |
var zoomUnits = getZoomUnits(zoom); | |
var mercatorLng = center.lng + zoomUnits * (point.x - bounds.width / 2); | |
var mercatorLat = center.lat - zoomUnits * (point.y - bounds.height / 2); | |
var mercatorLngLat = {lng: mercatorLng, lat: mercatorLat}; | |
return mercatorToLngLat(mercatorLngLat) | |
} | |
pointToPixel = function(point, zoom, mCenter, bounds) { | |
// 坐标到像素 | |
if (!point) { | |
return | |
} | |
point = lngLatToMercator(point); | |
var units = getZoomUnits(zoom); | |
var x = Math.round((point.lng - mCenter.lng) / units + bounds.width / 2); | |
var y = Math.round((mCenter.lat - point.lat) / units + bounds.height / 2); | |
return {x: x, y: y} | |
} | |
getZoomUnits = function(zoom) { | |
return Math.pow(2, (18 - zoom)) | |
} | |
mercatorToLngLat = function(mLngLat) { | |
var absLngLat, mc; | |
absLngLat = { | |
lng: Math.abs(mLngLat.lng), | |
lat: Math.abs(mLngLat.lat) | |
}; | |
for (var i = 0; i < MCBAND.length; i++) { | |
if (absLngLat.lat >= MCBAND[i]) { | |
mc = MC2LL[i]; | |
break | |
} | |
} | |
var lngLat = convertor(mLngLat, mc); | |
var lngLat = { | |
lng: lngLat.lng.toFixed(6), | |
lat: lngLat.lat.toFixed(6) | |
}; | |
return lngLat | |
} | |
lngLatToMercator = function(point) { | |
var lng_lat, mc; | |
point.lng = getLoop(point.lng, -180, 180); | |
point.lat = getRange(point.lat, -74, 74); | |
lng_lat = { | |
lng: point.lng, | |
lat: point.lat | |
}; | |
for (var i = 0; i < LLBAND.length; i++) { | |
if (lng_lat.lat >= LLBAND[i]) { | |
mc = LL2MC[i]; | |
break | |
} | |
} | |
if (!mc) { | |
for (var i = LLBAND.length - 1; i >= 0; i--) { | |
if (lng_lat.lat <= -LLBAND[i]) { | |
mc = LL2MC[i]; | |
break | |
} | |
} | |
} | |
var cE = convertor(point, mc); | |
var lng_lat = { | |
lng: cE.lng.toFixed(2), | |
lat: cE.lat.toFixed(2) | |
}; | |
return lng_lat | |
} | |
getLoop = function(lng, a, b) { | |
while (lng > b) { | |
lng -= b - a | |
} | |
while (lng < a) { | |
lng += b - a | |
} | |
return lng | |
} | |
getRange = function(lat, a, b) { | |
if (a != null) { | |
lat = Math.max(lat, a) | |
} | |
if (b != null) { | |
lat = Math.min(lat, b) | |
} | |
return lat | |
} | |
convertor = function(point, mc) { | |
if (!point || !mc) { | |
return | |
} | |
var lng = mc[0] + mc[1] * Math.abs(point.lng); | |
var c = Math.abs(point.lat) / mc[9]; | |
var lat = mc[2] + mc[3] * c + mc[4] * c * c + mc[5] * c * c * c + mc[6] * c * c * c * c + mc[7] * c * c * c * c * c + mc[8] * c * c * c * c * c * c; | |
lng *= (point.lng < 0 ? -1 : 1); | |
lat *= (point.lat < 0 ? -1 : 1); | |
return {lng: lng, lat: lat} | |
} | |
MCBAND = [12890594.86, 8362377.87, 5591021, 3481989.83, 1678043.12, 0] | |
LLBAND = [75, 60, 45, 30, 15, 0] | |
MC2LL = [ | |
[1.410526172116255e-8, 0.00000898305509648872, -1.9939833816331, 200.9824383106796, -187.2403703815547, 91.6087516669843, -23.38765649603339, 2.57121317296198, -0.03801003308653, 17337981.2], | |
[ - 7.435856389565537e-9, 0.000008983055097726239, -0.78625201886289, 96.32687599759846, -1.85204757529826, -59.36935905485877, 47.40033549296737, -16.50741931063887, 2.28786674699375, 10260144.86], | |
[ - 3.030883460898826e-8, 0.00000898305509983578, 0.30071316287616, 59.74293618442277, 7.357984074871, -25.38371002664745, 13.45380521110908, -3.29883767235584, 0.32710905363475, 6856817.37], | |
[ - 1.981981304930552e-8, 0.000008983055099779535, 0.03278182852591, 40.31678527705744, 0.65659298677277, -4.44255534477492, 0.85341911805263, 0.12923347998204, -0.04625736007561, 4482777.06], | |
[3.09191371068437e-9, 0.000008983055096812155, 0.00006995724062, 23.10934304144901, -0.00023663490511, -0.6321817810242, -0.00663494467273, 0.03430082397953, -0.00466043876332, 2555164.4], | |
[2.890871144776878e-9, 0.000008983055095805407, -3.068298e-8, 7.47137025468032, -0.00000353937994, -0.02145144861037, -0.00001234426596, 0.00010322952773, -0.00000323890364, 826088.5] | |
] | |
LL2MC = [ | |
[ - 0.0015702102444, 111320.7020616939, 1704480524535203, -10338987376042340, 26112667856603880, -35149669176653700, 26595700718403920, -10725012454188240, 1800819912950474, 82.5], | |
[0.0008277824516172526, 111320.7020463578, 647795574.6671607, -4082003173.641316, 10774905663.51142, -15171875531.51559, 12053065338.62167, -5124939663.577472, 913311935.9512032, 67.5], | |
[0.00337398766765, 111320.7020202162, 4481351.045890365, -23393751.19931662, 79682215.47186455, -115964993.2797253, 97236711.15602145, -43661946.33752821, 8477230.501135234, 52.5], | |
[0.00220636496208, 111320.7020209128, 51751.86112841131, 3796837.749470245, 992013.7397791013, -1221952.21711287, 1340652.697009075, -620943.6990984312, 144416.9293806241, 37.5], | |
[ - 0.0003441963504368392, 111320.7020576856, 278.2353980772752, 2485758.690035394, 6070.750963243378, 54821.18345352118, 9540.606633304236, -2710.55326746645, 1405.483844121726, 22.5], | |
[ - 0.0003218135878613132, 111320.7020701615, 0.00369383431289, 823725.6402795718, 0.46104986909093, 2351.343141331292, 1.58060784298199, 8.77738589078284, 0.37238884252424, 7.45] | |
] |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
请问从像素到坐标的转换是转换到什么坐标啊?平面坐标还是可视区域坐标啊?