在地图上画正六边形时出现的问题(d3)

来源:互联网 发布:mac怎样整理文件 编辑:程序博客网 时间:2024/06/06 01:17

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





阅读全文
0 0
原创粉丝点击