function rasterizeMap(M, N, sampleArea, projection){
var top = sampleArea[0];
var bot = sampleArea[1];
var lft = sampleArea[2];
var rgt = sampleArea[3];
var cellWidth = (rgt-lft)/N;
var cellHeight = (bot-top)/M;
var Matrix = [];
for(var rr of d3.range(0,M)){
var Row = [];
for(var cc of d3.range(0,N)){
var x = lft+cellWidth/2 + cellWidth*(cc);
var y = top+cellHeight/2+ cellHeight*(rr);
var lonlat = projection.invert([x, y]);
if((lonlat == null)|(lonlat == undefined)){
Row.push({x:x, y:y, lon:null, lat:null});
}else{
if((lonlat[0]==null)|(lonlat[1]==null)){
Row.push({x:x, y:y, lon:null, lat:null});
}else{
var x2 = projection(lonlat);
if(x2 != undefined){
if((Math.abs(x2[0]-x)>cellWidth/1000)|(Math.abs(x2[1]-y)>cellHeight/1000)){
Row.push({x:x, y:y, lon:null, lat:null});
}else{
Row.push({x:x, y:y, lon:lonlat[0], lat:lonlat[1]});
}
}else{
Row.push({x:x, y:y, lon:null, lat:null});
}
}
}
}
Matrix.push(Row);
}
return Matrix;
}