在一个项目里需要在地图上叠加正六边形图形进行分割。用的方法是d3给的方法。流程是:
(1)获取地图边框范围
(2)计算出铺满地图范围的所有六边形的中心点的坐标centers[];
(3)利用sin 与 cos函数计算出六边形六个顶点的坐标points[]
(4)添加geometry到图层
下面的代码包括了(1)(2)(3)部分。
可是运行结果,发现并不是正六边形。找了很久原因后发现,因为坐标系是经纬度的,当radius=0.005时,经度加0.005与纬度加0.005的实际距离(米)是不同的。
var extent = hexbin.Map.map.getExtent();
var xmin = extent.xmin,
ymin = extent.ymin,
xmax = extent.xmax,
ymax = extent.ymax;
var radius=0.005; //六边形边长
var dx = radius * 2.2 * Math.sin(Math.PI / 3);//分割的宽度
var dy = radius * 1.5;//分割的高度
var centers = [];//中心点坐标集
var xnum = (xmax-xmin)/dx+1; var ynum = (ymax-ymin)/dy+1;
for(var i=0;i<xnum;i++){
for(var j=0;j<ynum;j++){
var point = [];
if(j%2 == 0){ point[0]=xmin+i*dx; point[1]=ymin+j*dy; }
else{ point[0]=xmin+(i+0.5)*dx; point[1]=ymin+j*dy; }
centers.push(point); } }
var hexItem=[];
for(var a=0;a<centers.length;a++){
var angle = 0;
var points=[];
for (var i = 0; i < 6; i++, angle += Math.PI / 3) {
points.push([ centers[a][0]+ radius * Math.sin(angle), centers[a][1] + radius * Math.cos(angle) ]); }
然后大概估计了一个系数1.1,代码改为如下,之后运行,就近似正六边形了。
for (var i = 0; i < 6; i++, angle += Math.PI / 3) {
points.push([
centers[a][0]+ radius * Math.sin(angle)*1.1,
centers[a][1] + radius * Math.cos(angle)
]);
}