基于矢量文件渲染思考-mapnik

作为一名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)
  • 起始点:栅格起始点左上角,地理范围最小点是左下角

你可能感兴趣的:(大数据GIS开发)