作为一名GISer,现处于交通行业(交通行业与GIS结合确实是一件很有意思的事情)。最近遇到一个大数据量下的矢量文件在前台加载渲染直接崩溃问题,处于这个节点上,做了如下思考:
- 重新梳理下场景逻辑,看能否现在后台缩小数据量,然后前台渲染。总体思路是:在后台根据业务逻辑结合turf.js的矢量合并函数union,最终根据业务指标形成矢量要素(合并过程中会融合节点信息,减少文件大小)。思路感觉没问题,但是。。。用node执行特别耗时(目前执行了两个小时没结果)。只能先放弃
- 上面方案不可行,忽然想起后台处理插值算法密度图。举一反三,尝试mapnik直接在后台渲染栅格图。具体代码如下
var mapnik = require("mapnik");
var fs = require("fs");
var img = new mapnik.Image(2082,1617);
fs.readFile('PTAL_gridCoefficient.txt','utf-8',function(err,data){
if(err){
console.error(err);
}else{
data = data.toString().split("\r\n");
data.forEach(function(v){
var tmp=v.split(","),color=[65,105,225,1];
if(tmp[1] == 0){
color=[255,255,255,0];
}else if( tmp[1] >0 && tmp[1]<=2.5 ){
color=[22,73,125,255];
}else if( tmp[1] >2.5 && tmp[1]<=5 ){
color=[17,111,184,255];
}else if( tmp[1] >5 && tmp[1]<=10 ){
color=[39,173,227,255];
}else if( tmp[1] >10 && tmp[1]<=15 ){
color=[145,201,83,255];
}else if( tmp[1] >15 && tmp[1]<=20 ){
color=[255,241,1,255];
}else if( tmp[1] >20 && tmp[1]<=25 ){
color=[251,192,142,255];
}else if( tmp[1] >25 && tmp[1]<=40 ){
color=[238,29,35,255];
}else if( tmp[1] >40){
color=[132,21,23,255];
}
var x=parseInt(tmp[0].substr(0,6))-115423,
y=1617-(parseInt(tmp[0].substr(6,5))-39443);
img.setPixel(x==2082?2081:x,y==1617?1616:y,new mapnik.Color(color[0],color[1],color[2],color[3]));
});
img.encode('png', function(err,buffer) {
if (err) throw err;
fs.writeFile('map.png',buffer, function(err) {
if (err) throw err;
});
});
}
}
);
ps:关键点如下
- 栅格长宽:取地理图层extent范围(minx,miny,maxx,maxy)
- 起始点:栅格起始点左上角,地理范围最小点是左下角