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.
95 lines
2.9 KiB
95 lines
2.9 KiB
/**
|
|
* echarts地图投射算法
|
|
*
|
|
* @desc echarts基于Canvas,纯Javascript图表库,提供直观,生动,可交互,可个性化定制的数据统计图表。
|
|
* @author Kener (@Kener-林峰, kener.linfeng@gmail.com)
|
|
*
|
|
*/
|
|
define(function() {
|
|
// Derived from Tom Carden's Albers implementation for Protovis.
|
|
// http://gist.github.com/476238
|
|
// http://mathworld.wolfram.com/AlbersEqual-AreaConicProjection.html
|
|
function _albers() {
|
|
var radians = Math.PI / 180;
|
|
var origin = [0, 0]; //[-98, 38],
|
|
var parallels = [29.5, 45.5];
|
|
var scale = 1000;
|
|
var translate = [0, 0]; //[480, 250],
|
|
var lng0; // radians * origin[0]
|
|
var n;
|
|
var C;
|
|
var p0;
|
|
|
|
function albers(coordinates) {
|
|
var t = n * (radians * coordinates[0] - lng0);
|
|
var p = Math.sqrt(
|
|
C - 2 * n * Math.sin(radians * coordinates[1])
|
|
) / n;
|
|
return [
|
|
scale * p * Math.sin(t) + translate[0],
|
|
scale * (p * Math.cos(t) - p0) + translate[1]
|
|
];
|
|
}
|
|
|
|
albers.invert = function (coordinates) {
|
|
var x = (coordinates[0] - translate[0]) / scale;
|
|
var y = (coordinates[1] - translate[1]) / scale;
|
|
var p0y = p0 + y;
|
|
var t = Math.atan2(x, p0y);
|
|
var p = Math.sqrt(x * x + p0y * p0y);
|
|
return [
|
|
(lng0 + t / n) / radians,
|
|
Math.asin((C - p * p * n * n) / (2 * n)) / radians
|
|
];
|
|
};
|
|
|
|
function reload() {
|
|
var phi1 = radians * parallels[0];
|
|
var phi2 = radians * parallels[1];
|
|
var lat0 = radians * origin[1];
|
|
var s = Math.sin(phi1);
|
|
var c = Math.cos(phi1);
|
|
lng0 = radians * origin[0];
|
|
n = 0.5 * (s + Math.sin(phi2));
|
|
C = c * c + 2 * n * s;
|
|
p0 = Math.sqrt(C - 2 * n * Math.sin(lat0)) / n;
|
|
return albers;
|
|
}
|
|
|
|
albers.origin = function (x) {
|
|
if (!arguments.length) {
|
|
return origin;
|
|
}
|
|
origin = [+x[0], +x[1]];
|
|
return reload();
|
|
};
|
|
|
|
albers.parallels = function (x) {
|
|
if (!arguments.length) {
|
|
return parallels;
|
|
}
|
|
parallels = [+x[0], +x[1]];
|
|
return reload();
|
|
};
|
|
|
|
albers.scale = function (x) {
|
|
if (!arguments.length) {
|
|
return scale;
|
|
}
|
|
scale = +x;
|
|
return albers;
|
|
};
|
|
|
|
albers.translate = function (x) {
|
|
if (!arguments.length) {
|
|
return translate;
|
|
}
|
|
translate = [+x[0], +x[1]];
|
|
return albers;
|
|
};
|
|
|
|
return reload();
|
|
}
|
|
|
|
return _albers;
|
|
});
|