在一个项目里需要在地图上叠加正六边形图形进行分割。用的方法是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) ]); }
