作者:yangjunlin
首先我们需要知道什么是d3-contour,具体的使用方式是什么,可以参考https://www.wenjiangs.com/doc/d3-contour-2这个文档,阅读之后我们发现他是一个类库,
以我的角度理解是将任意一个矩形,将其分成若干个单位相同的正方形格子,并且记录下每个正方形中的value值(非常类似栅格图像以像素为单位进行分割)。我红框圈起来的就非常能体现,一个256*256的矩形盒子以0.5为单位的正方形进行切割,每个正方形有个值,然后调用方法,只需要传入thresholds阈值返回的并返回每个阈值对应的等值线坐标数组。看到这里是不是有点想法了,我们只要想方法将我们分析的区域搞成矩形,并同时将其分割成若干个单位相同的正方形,然后将采样点和这个‘单位’正方形关联起来。既然提到了单位正方形,就非常类似咋们的像元了,因此废话不多说直接上代码
全国面数据 2.2011年各地区气象站点数据(属性值中包含降雨量)
import bbox from '@turf/bbox'
let box = bbox(region);
let p = map.project(pos);
let cw = pxregion.xmax - pxregion.xmin;
let ch = pxregion.ymax - pxregion.ymin;
let p = map.project([data[i].x, data[i].y])
_data.push({x: p['x'] - pxregion.xmin,y: p['y'] - pxregion.ymin,value: _value})
const dlen = d.length;let matrixData = new Array(width * height);let idwcount = 0for (let i = 0, k1 = 0; i < height; i++) {for (let j = 0; j < width; j++, k1++) {let sum0 = 0,sum1 = 0;for (let k = dlen - 1; k >= 0; k--) {const dk = d[k];const dis = Math.pow((i - dk.y), 2) + Math.pow((j - dk.x), 2);sum0 += dk.value / dis;sum1 += 1 / dis;idwcount++}matrixData[k1] = sum0 / sum1}}
return matrixData;
contours.thresholds([20, 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000, 11000, 12000, 13000, 14000, 15000, 16000, 17000, 18000, 19000, 20000])(idwdata).forEach((fakegeometry) => {})
let data = map.unproject([coordinates[i][j][m][0] + pxregion.xmin, coordinates[i][j][m][1] + pxregion.ymin])
coordinates[i][j][m] = [data.lng, data.lat]
import intersect from '@turf/intersect'
dataset.features.map(item => {let resfea = intersect(item, region.features[0])resfea['properties']['value'] = item['properties']['value']datasetres.features.push(resfea)})
最后,这个才做好了一半,为什么说只做好了一半呢,因为有两个大原因1.分析的速度很慢,将主线程卡住了,导致整个界面都没法动,用户体验不好只是不要卡到主进程,2.分析的快慢和你所展示地图的zoom有关系,并且如果当你放的越大的时候,还没法分析出结果或者结果错误(这是因为我们使用的webgis框架自带的坐标转像素坐标导致,这个的结果和当前zoom有直接关系)。我们后面应该采取何种方式避免zoom级别导致的问题并做性能上的优化呢?大家可以关注我的下篇文章,前端克里金插值分析的优化和提升。下篇文章中我将放出全部完整代码及数据(像素渲染和网格渲染都将分别放出)
上一篇:Pod的生命周期
下一篇:4.4——数据库和前后端身份认证