前回試したカーネル密度推定は、確率密度を求めるもので値そのものを補間計算で求めるものではありません(密度を実数値に換算出来るのかもしれませんが)。今回は実数値の推定を試みます。
 サンプル点の値から、平面上のデータを持たない点の値を補間計算する方法のうち、最もシンプルなものの1つがIDW(Inverse Distance Weighting:逆距離加重)法です。ある地点の値を推定する際には当然ながら周辺のサンプル点の値を参考にするわけですが、距離が近いサンプル点ほど相関が強いと考えて、距離に応じた加重平均を行い計算する方法がIDWです。計算式は以下のようになります。
  IDW 数式
  μ(s):地点sの予測値  n:サンプル点数  μ(i):i番目のサンプル点siの実測値   
  d(s,si):地点sとサンプル点siの距離  wi(s):地点sにおけるサンプル点siの重み  p:距離指数

   
 カーネル密度推定では何だか良く分からずに数式をそのままプログラムにしただけ・・・といった感じでしたが、今回のIDWは加重計算ですから私にも式の意味が理解出来ます。
 上記式のうち、p(距離指数)の値を大きくすると、より近い点の影響が強くなります。p=2とすることが多いようです。

 この計算を実行するプログラム(関数)は以下のようにしました。

function IDW(samplepoint, calpoint, p, filtermode, filterval) {
/* 引数
   samplepoint:サンプル点の情報 配列収納 [経度(x),緯度(y),実測値,0] ←4番目の要素(0)は未指定、Null等でも可
   calpoint:数値予測対象点の座標 配列収納 [経度(x),緯度(y)
   p:距離指数(省略時は2.0)
   filtermode:サンプル点のフィルタリング(省略時は全点を対象) 
     "PointCounts":より近い点からn点を対象とする "RadiusRange":半径r(m)以内にあるサンプル点を対象とする
   filterval:フィルタリング条件 
          filtermode="PointCounts"の時:対象点数  filtermode="PointCounts"の時:対象半径(m)
*/
   var idw = [];
   var i,j;
   var ivd;
   var ivdsum,calvalue;
   var x,y;
   var n = samplepoint.length;
   var r = Infinity;

   if (filtermode == "PointCounts" && !isNaN(filterval)) {
      n = filterval;
   }
   if (filtermode == "RadiusRange" && !isNaN(filterval)) {
      r = filterval;
   }
   if(!p || isNaN(p)) {
      p = 2.0;
   }

   for (i in calpoint) {
      ivdsum = 0;
      calvalue = 0;
      for (j in samplepoint) {
         samplepoint[j][3] = getDistance(calpoint[i],samplepoint[j]);
      }
      samplepoint.sort(function(a, b) {
         return d3.ascending(a[3],b[3]);
      })
      for (j in samplepoint) {
         if (j == 0 || (j < n && samplepoint[j][3] < r)) {
            ivd = 1 / Math.pow(samplepoint[j][3],p);
            calvalue += ivd * samplepoint[j][2];
            ivdsum += ivd;
         }
      }
      calvalue = calvalue / ivdsum;
      x = mapPath.projection()([calpoint[i][0],calpoint[i][1]])[0];
      y = mapPath.projection()([calpoint[i][0],calpoint[i][1]])[1];
      idw.push([x,y,calvalue])
   }
   return idw;
}

 全てのサンプル点の影響を考慮して計算する以外に、対象点の限定も良く行われているようなので、
  (1)より近いものからn点を選択
  (2)半径r以内にある点を選択
 の2種類の方法でフィルタリング出来るようにしました。

 全体のソースは以下の通り

・TokyoAirPollutionMapIDW.html

<!DOCTYPE html>
<html>
<head>
<title>東京都の大気汚染(SPM)濃度分布</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />
<meta http-equiv="Content-Style-Type" content="text/css">
<script type="text/javascript" src="js/d3.js"></script>
<script type="text/javascript" src="js/queue.v1.js"></script>
<script type="text/javascript" src="js/TokyoAirPollutionMapIDW.js"></script>
</style>
<script type="text/javascript">
  function switch_display(mode) {
     if (mode == "ALL") {
        document.getElementById('blankcell').style.display = "table-cell";
        document.getElementById('pcounts').style.display = "none";
        document.getElementById('rradius').style.display = "none";
     } else if (mode == "PointCounts") {
        document.getElementById('blankcell').style.display = "none";
        document.getElementById('pcounts').style.display = "table-cell";
        document.getElementById('rradius').style.display = "none";
     } else if (mode == "RadiusRange") {
        document.getElementById('blankcell').style.display = "none";
        document.getElementById('pcounts').style.display = "none";
        document.getElementById('rradius').style.display = "table-cell";
     }
  }
</script>
</head>
<body style="margin:0px;" onload="setMap(document.getElementById('f_mode').value,document.getElementById('f_pcounts').value,document.getElementById('f_radius').value,document.getElementById('f_power').value,true)">
  <div style="background-color:#006666;padding:5px;">
  <table style="padding-left:5px;">
  <tr>
    <td style="font-size: 16px;font-weight: bold;color: #FFFFFF;">東京都の大気汚染(SPM)濃度分布 </td>
    <td style="font-size: 12px;color: #FFFFFF;">※IDW法にて予測 </td>
    <td style="font-size:12px;color:#FFFFFF;padding-left:10px;">計算対象とする測定局:
      <select id="f_mode" name="f_mode" style="width:140px;font-size:12px;" onchange="switch_display(this.value);">
         <option value="ALL" selected>全て</option>
         <option value="PointCounts">近い点から指定数分</option>
         <option value="RadiusRange">指定の半径内</option>
      </select>
    </td>
    <td id="blankcell" style="padding-left:15px;width:150px;display:table-cell;">&nbsp;</td>
    <td id="pcounts" style="font-size:12px;color:#FFFFFF;padding-left:15px;width:150px;display:none;">対象測定局数:
      <select id="f_pcounts" name="f_pcounts" style="width:50px;font-size:12px;">
         <option value="1">1</option>
         <option value="2">2</option>
         <option value="3">3</option>
         <option value="4">4</option>
         <option value="5">5</option>
         <option value="7">7</option>
         <option value="10" selected>10</option>
         <option value="15">15</option>
         <option value="20">20</option>
      </select>
    </td>
    <td id="rradius" style="font-size:12px;color:#FFFFFF;padding-left:15px;width:150px;display:none;">対象半径:
      <select id="f_radius" name="f_radius" style="width:70px;font-size:12px;">
         <option value="3000">3km</option>
         <option value="5000">5km</option>
         <option value="10000" selected>10km</option>
         <option value="15000">15km</option>
         <option value="20000">20km</option>
         <option value="30000">30km</option>
      </select>
    </td>
    <td id="rradius" style="font-size:12px;color:#FFFFFF;width:110px;">距離指数:
      <select id="f_power" name="f_power" style="width:50px;font-size:12px;">
         <option value="0.5">0.5</option>
         <option value="1.0">1</option>
         <option value="1.5">1.5</option>
         <option value="2.0" selected>2</option>
         <option value="2.5">2.5</option>
         <option value="3.0">3</option>
         <option value="4.0">4</option>
         <option value="5.0">5</option>
      </select>
    </td>
    <td style="padding-left:10px;">
       <input type="button" style="width:80px;font-size:14px;" onclick="setMap(document.getElementById('f_mode').value,document.getElementById('f_pcounts').value,document.getElementById('f_radius').value,document.getElementById('f_power').value,false)" value="更新">
    </td>
  </tr>
  </table>
  </div>
</body>
</html>

・TokyoAirPollutionMapIDW.js

// *************************************************************** 
//  D3.jsで空間分析にチャレンジ
// *************************************************************** 

  var svg;
  var canvas;
  var mapScale = 50000;  //マップスケール
  var mapWidth = 1000;  //マップ幅
  var mapHeight = 500; //マップ高さ
  var mapTop = 40;
  var mapPath, mapBounds;
  var meshCountX=240,meshCountY=120;
  var Mode,pCounts,rRange,dPower;
  var border,outline,point;
  var color = d3.interpolateHsl("#66ff00", "#ff0000");
  var alpha = 0.7;
  var pMin, pMax;  //濃度 Min,Max
  var jsonCityFileName = "json/CityBorderTokyo.json?=" + new Date().getTime();
  var jsonOutlineFileName = "json/OutlineTokyo.json?=" + new Date().getTime();
  var pointFileName = "csv/T_Place_AirPollution.csv?" + new Date().getTime();
  var prefBorder = new Array();

  function setMap(mode,pcnt,radius,power,initFlag) {
     Mode = mode;
     pCounts = pcnt;
     rRange = radius;
     dPower = power;
     if (initFlag) {
        queue()
           .defer(d3.json, jsonCityFileName)
           .defer(d3.json, jsonOutlineFileName)
           .defer(d3.csv, pointFileName)
           .await(ready);
     } else {
        drawCanvas(false);
     }
  }

  function ready(error, data1, data2, data3) {
     border = data1;
     outline = data2;
     point = data3;
     drawMap();
  }

  function drawMap() {

     d3.select("body").append("canvas")
        .attr("width", mapWidth)
        .attr("height", mapHeight)
        .attr("id", "canvas")
        .style("position", "absolute")
        .style("top", mapTop+"px")
        .style("left", "0px")

     svg = d3.select("body").append("svg")
        .attr("width", mapWidth)
        .attr("height", mapHeight)
        .attr("id", "svg")
        .style("position", "absolute")
        .style("top", mapTop+"px")
        .style("left", "0px")

     mapBounds = d3.geo.bounds(border);
     var mapcenter = [(mapBounds[0][0]+mapBounds[1][0])/2, (mapBounds[0][1]+mapBounds[1][1])/2];
     
     mapPath = d3.geo.path()
        .projection(d3.geo.mercator()
        .center(mapcenter)
        .translate([mapWidth/2, mapHeight/2])
        .scale(mapScale)
     );

     outline.features.forEach(function(d,i) {	
        prefBorder[i] = new Array();
        d["geometry"]["coordinates"][0].forEach(function(dd,j) {
           prefBorder[i].push(mapPath.projection()([parseFloat(dd[0]),parseFloat(dd[1])]));
        });
     });

     svg.selectAll(".outline")
        .data(outline.features)
        .enter()
        .append("path")
        .attr("d", mapPath)
        .style("fill", "none")
        .attr("class", "outline")
        .style("stroke", "#808080")
        .style("stroke-width", "1")

     svg.selectAll(".cityborder")
        .data(border.features)
        .enter()
        .append("path")
        .attr("d", mapPath)
        .style("fill", "none")
        .attr("class", "cityborder")
        .style("stroke", "#808080")
        .style("stroke-width", "0.3")

     var ObservationPoint = svg.selectAll(".point")
        .data(point)
        .enter()
        .append("circle")
        .attr("cx", function(d,i) {
           return mapPath.projection()([d.Lng,d.Lat])[0];
        })
        .attr("cy", function(d,i) {
           return mapPath.projection()([d.Lng,d.Lat])[1];
        })
        .attr("r", 3)
        .style("fill", "#0000ff")
        .on('mouseover', function(d) {
           d3.select(this).style("fill","#ff0000");
           curText = d.PointName + " " + parseFloat(d.SPM2p).toFixed(3);
           SetTooltip(mapPath.projection()([d.Lng,d.Lat]),curText);
        })
        .on('mouseout', function() {
           d3.select(this).style("fill","#0000ff");
           var tooltip = svg.select(".tooltip")
           if(!tooltip.empty()) {
              tooltip.style("visibility", "hidden")
           }
        })

     drawCanvas(true);

  }

  function drawCanvas(initFlag) {

     var currentcolor;
     var canvas = document.getElementById('canvas')
     var ctx = canvas.getContext('2d');
     var meshSize = 10;
     var xRange = d3.extent([mapPath.projection()(mapBounds[0])[0],mapPath.projection()(mapBounds[1])[0]]);
     var yRange = d3.extent([mapPath.projection()(mapBounds[0])[1],mapPath.projection()(mapBounds[1])[1]]);
     var meshWidth = (xRange[1]-xRange[0])/(meshCountX- 1);
     var meshHeight = (yRange[1]-yRange[0])/(meshCountY- 1);
     var gx = d3.range(xRange[0],xRange[1]+Math.pow(10,-10),(xRange[1]-xRange[0])/(meshCountX-1));
     var gy = d3.range(yRange[0],yRange[1]+Math.pow(10,-10),(yRange[1]-yRange[0])/(meshCountY-1));
     var samplepoint = new Array();
     var calpoint = new Array();

     point.forEach(function(d) {
        samplepoint.push([parseFloat(d.Lng),parseFloat(d.Lat),parseFloat(d.SPM2p),0])
     });

     gx.forEach(function(dx) {
        gy.forEach(function(dy) {
           calpoint.push(mapPath.projection().invert([dx,dy]));
        });
     });

     var val;
     if (Mode == "PointCounts") {
        val = pCounts;
     } else if (Mode == "RadiusRange") {
        val = rRange;
     }
     var idw = IDW(samplepoint,calpoint,dPower,Mode,val);
     var vrange = d3.extent(idw, function (d) { return d[2]; });
     pMin = Math.floor(vrange[0]*200)/200;
     pMax = Math.ceil(vrange[1]*200)/200;

     if (initFlag) {
        ctx.beginPath();
        var coordinate; 
        outline.features.forEach(function(d,i) {
           for (var i = 0; i < d["geometry"]["coordinates"][0].length; i++) {
              coordinate = mapPath.projection()([parseFloat(d["geometry"]["coordinates"][0][i][0]),parseFloat(d["geometry"]["coordinates"][0][i][1])])
              if (i==0) {
                 ctx.moveTo(coordinate[0], coordinate[1]);
              } else {
                 ctx.lineTo(coordinate[0], coordinate[1]);
              }
           }
        });
        ctx.closePath();
        ctx.clip();
     }
     ctx.clearRect(0,0,mapWidth,mapHeight); 
     ctx.globalAlpha = alpha;
     idw.forEach(function(d) {
        currentcolor = color((d[2]-pMin)/(pMax-pMin));
        ctx.fillStyle = currentcolor;
        ctx.fillRect(d[0]-0.5*meshWidth,d[1]-0.5*meshHeight,meshWidth,meshHeight);
     });

     setMapLegend(initFlag);
  }

  function IDW(samplepoint, calpoint, p, filtermode, filterval) {
  /* 引数
     samplepoint:サンプル点の情報 配列収納 [経度(x),緯度(y),実測値,0] ←4番目の要素(0)は未指定、Null等でも可
     calpoint:数値予測対象点の座標 配列収納 [経度(x),緯度(y)
     p:距離指数(省略時は2.0)
     filtermode:サンプル点のフィルタリング(省略時は全点を対象) 
      "PointCounts":より近い点からn点を対象とする "RadiusRange":半径r(m)以内にあるサンプル点を対象とする
     filterval:フィルタリング条件 
            filtermode="PointCounts"の時:対象点数  filtermode="PointCounts"の時:対象半径(m)
  */
     var idw = [];
     var i,j;
     var ivd;
     var ivdsum,calvalue;
     var x,y;
     var n = samplepoint.length;
     var r = Infinity;

     if (filtermode == "PointCounts" && !isNaN(filterval)) {
        n = filterval;
     }
     if (filtermode == "RadiusRange" && !isNaN(filterval)) {
        r = filterval;
     }
     if(!p || isNaN(p)) {
        p = 2.0;
     }

     for (i in calpoint) {
        ivdsum = 0;
        calvalue = 0;
        for (j in samplepoint) {
           samplepoint[j][3] = getDistance(calpoint[i],samplepoint[j]);
        }
        samplepoint.sort(function(a, b) {
           return d3.ascending(a[3],b[3]);
        })
        for (j in samplepoint) {
           if (j == 0 || (j < n && samplepoint[j][3] < r)) {
              ivd = 1 / Math.pow(samplepoint[j][3],p);
              calvalue += ivd * samplepoint[j][2];
              ivdsum += ivd;
           }
        }
        calvalue = calvalue / ivdsum;
        x = mapPath.projection()([calpoint[i][0],calpoint[i][1]])[0];
        y = mapPath.projection()([calpoint[i][0],calpoint[i][1]])[1];
        idw.push([x,y,calvalue])
     }
     return idw;
  }

  //度数→ラジアン変換
  function calRadian(deg){
     return deg * Math.PI / 180.0;
  }

  //2点間の距離を計算(GRS80)
  function getDistance(p1, p2) {
     var a = 6378137.0;             //長半径
     var f = 1.0 / 298.257222101;   //扁平率
     var b = a * (1 - f);           //短半径
     var e2 = (Math.pow(a, 2) - Math.pow(b, 2)) / Math.pow(a, 2);
     var dy = calRadian(p1[1] - p2[1]);
     var dx = calRadian(p1[0] - p2[0]);
     var my = calRadian((p1[1] + p2[1]) / 2.0);
     var w = Math.sqrt(1.0 - e2 * Math.pow(Math.sin(my), 2));
     var m = (a * (1 - e2)) / Math.pow(w, 3);
     var n = a / w;

     return Math.sqrt(Math.pow(dy * m, 2) + Math.pow(dx * n * Math.cos(my), 2));
  }

  function SetTooltip(tipXY,tipText) {

     var tooltip = svg.select(".tooltip")
     var fontSize = 12;
     var rectWidth = tipText.length * fontSize + 5;
     var rectHeight = 20;

     if(tooltip.empty()) {
        tooltip = svg
           .append("g")
           .attr("class","tooltip")

        tooltip
           .append("rect")
           .attr("height",rectHeight)
           .style("stroke","none")
           .style("fill","#ffffff")
           .style("opacity","0.8")

        tooltip
           .append("text")
           .attr("text-anchor","left")
           .attr("id","tooltiptext")
           .style("font-size",fontSize+"px")
           .style("font-family","sans-serif")
     }

     var tipleft = tipXY[0] + 2;
     if (tipleft + rectWidth > mapWidth) {
        tipleft = mapWidth - rectWidth;
     }
     var tiptop = tipXY[1] - rectHeight - 2;

     tooltip
        .style("visibility", "visible")
        .attr("transform", "translate("+tipleft+","+tiptop+")")

     tooltip.select("text")
        .text(tipText + "mg/m")
        .attr("transform", "translate(5,"+(fontSize+(rectHeight-fontSize)/2)+")")
        .append("tspan")
        .attr("id","super")
        .attr("dy","-2")
        .style("font-size",(fontSize-2)+"px")
        .text("3")

     tooltip.select("rect")
        .attr("width",rectWidth)

  }

  function setMapLegend(initFlag) { 

    var fontsize = 14;
     var legendWidth = 200;
     var legendHeight = 20;
     var legendLeft = 30;
     var legendTop = mapPath.projection()(mapBounds[0])[1] - 60;
     var valuerange = d3.range(pMin,pMax+0.0001,(pMax-pMin)/(legendWidth-1));
     var pFormat = d3.format(".3f");

     if (!initFlag) {
        var v = [pMin,pMax];
        d3.selectAll(".axistext")
         .text(function(d,i) {
              return pFormat(v[i]) +"mg/m";
           })
           .append("tspan")
           .attr("class","super")
           .attr("dy","-2")
           .style("font-size",(fontsize-4)+"px")
           .text("3")
        return false;
     }

     var MapLegend = d3.select("svg")
        .append("g")
        .attr("id","maplegend")
        .attr("transform", "translate("+legendLeft+","+legendTop+")")

     MapLegend
        .append("circle")
        .attr("r", 3)
        .style("fill", "#0000ff")
        .on('mouseover', function(d) {
           d3.select(this).style("fill","#ff0000");
        })
        .on('mouseout', function() {
           d3.select(this).style("fill","#0000ff");
        })

     MapLegend
        .append("text")
        .attr("id","text1")
        .style("font-size",fontsize + "px")
        .style("font-family","sans-serif")
        .style("fill","#000000")
        .attr("transform", "translate("+10+","+ (fontsize * 0.5 - 2) +")")
      .text("大気汚染常時監視測定局(一般局)")

     MapLegend
        .append("text")
        .attr("id","text2")
        .style("font-size",(fontsize - 2) + "px")
        .style("font-family","sans-serif")
        .style("fill","#000000")
        .attr("transform", "translate("+10+","+ (fontsize * 1.5) +")")
      .text("※マウスオンすると測定局の名称とSPM濃度(2013年度2%除外値)が表示されます。")

     MapLegend.selectAll(".legend")
        .data(valuerange)
        .enter()
        .append("rect")
        .attr("class", "legend")
        .attr("transform", function(d, i) {
           return "translate("+((fontsize*10)+i)+",30)";
        })
        .attr("width",1)
        .attr("height",legendHeight)
        .style("fill", function(d, i){
           return color((d - pMin) / (pMax - pMin));
        })

     MapLegend
        .append("rect")
        .attr("id","legendframe")
        .attr("transform", "translate("+(fontsize*10)+",30)")
        .attr("width",legendWidth)
        .attr("height",legendHeight)
        .style("fill", "none")
        .style("stroke","#303030")
        .style("stroke-width",0.5);

     MapLegend
        .append("text")
        .attr("id","text3")
        .style("font-size",fontsize + "px")
        .style("font-family","sans-serif")
        .style("fill","#000000")
        .attr("transform", "translate(0,"+ (30 + (fontsize + legendHeight) * 0.5) +")")
      .text("SPM濃度(2%除外値)")

     var MapLegendAxis = MapLegend   //.selectAll(".axis")
        .append("g")
        .attr("transform", "translate("+(fontsize*10)+","+ (30 + legendHeight) +")")
        .attr("class","axis")
        .style("stroke","none")
        .style("fill","#303030")

     MapLegendAxis
        .append("rect")
        .attr("transform", "translate(0,10)")
        .attr("width",legendWidth)
        .attr("height",1)

     var MapLegendAxisX = MapLegendAxis.selectAll(".axis")
        .data([d3.min(valuerange),d3.max(valuerange)])
        .enter()
        .append("g")

     MapLegendAxisX
        .append("rect")
        .attr("transform", function(d,i) {
           return "translate(" + (i * legendWidth) + ",5)";
        })
        .attr("width",1)
        .attr("height",10)

     MapLegendAxisX
        .append("text")
        .attr("transform", function(d,i) {
           return "translate("+(i * legendWidth)+","+(15+(fontsize+2))+")";
        })
        .attr("text-anchor","middle")
        .attr("class","axistext")
      .attr("id",function(d,i) {
           return "axistext"+i;
        })
        .style("font-size",(fontsize-2) + "px")
        .style("font-family","sans-serif")
      .text(function(d,i) {
           return pFormat(d) +"mg/m";
        })

     MapLegendAxisX.selectAll("text")
        .append("tspan")
        .attr("class","super")
        .attr("dy","-2")
        .style("font-size",(fontsize-4)+"px")
        .text("3")

  }

 緯度・経度情報から平面座標に変換するに当たっては、投影法としてメルカトル図法を採用しています。
  ※以下のd3.geo.mercator()の箇所

     mapPath = d3.geo.path()
        .projection(d3.geo.mercator()
        .center(mapcenter)
        .translate([mapWidth/2, mapHeight/2])
        .scale(mapScale)
     );

 メルカトル図法では高緯度ほど歪みが大きくなるので、地図上の1目盛(1ピクセル)当たりの距離は高緯度になるほど短くなります。今回の地図描画の対象は、緯度範囲が小さい東京都(島しょ部を除く)なので誤差は無視出来るレベルですが、日本全図を描画する際等は誤差が大きくなり補間計算にも影響が出てきそうです。そのため、IDW法に用いる距離は平面座標(x,y)の値を緯度・経度に戻した上で求めることにしました(以下の部分)。

           calpoint.push(mapPath.projection().invert([dx,dy]));

 d3.jsには平面座標を緯度・経度に戻してくれる便利なメソッド「projection.invert」が用意されています。

 補間計算の結果はフィルタリング条件やp(距離指数)の設定によって異なりますので、実際には出力される地図を見ながら調整することになるかと思います(例を下図に示します)。全サンプル点を対象としp=2とした場合は濃度の高いサンプル点近隣が目立つ出力となりました(図1)。今回扱っているデータはサンプル点=観測点であって発生源ではないので、サンプル点周辺のみにピークがあるというのは実態とは合っていない気がします。いろいろと条件を変更して試した所、対象半径5km以内でp=1とした結果では幹線道路(環八・環七・1号線等)周辺の濃度が高いような印象で、比較的実態に合っているように思います(図2)。もう少し観測点の数が多ければもっと良い結果が得られるのでしょうが・・・。
 ちなみに、最近隣の1点のみを対象とした場合はボロノイ図となります(図3)。240×120のメッシュではギザギザした出力となりますが、メッシュサイズを小さくすれば前々回作成したボロノイ図と同じ形状になるかと思います。

図 東京都の大気汚染(SPM)濃度分布(IDW法による メッシュ数:240×120)

サンプル点のフィルタリングなし(全点対象) p=2

図1 サンプル点のフィルタリングなし(全点対象) p=2


サンプル点のフィルタリング:半径5km以内 p=1

図2 サンプル点のフィルタリング:半径5km以内 p=1


サンプル点のフィルタリング:最近隣1点のみを対象=ボロノイ図

図3 サンプル点のフィルタリング:最近隣1点のみを対象 ※ボロノイ図となります

 
 

コメント   

 2014年12月6日(土)、横浜美術館へ。「ホイッスラー展」を観覧してきました。
 ホイッスラーの作品は先日のオルセー美術館展などでも見ていますが、私にとっては馴染みある画家ではありません。そのため当初は「横浜まで出かける機会があれば、見てみようかな」程度の位置づけだったのですが、本展と同時開催のコレクション展(常設展)にモロー作品が出品されることを知った途端に優先順位が上がり、開催初日の訪問となりました。当館がモローの「岩の上の女神」を所蔵していることは知っていたのですが、これまでは展示のタイミングが合わず今回が初見です。

 ホイッスラーは唯美主義の画家になるのでしょうか、確かに作風はロセッティ等と似ているような気がします。油彩画はとても良いのですが、展示作品は版画ばかりで・・・出品作品は133点と結構多いのですが、その半分以上が小さい版画なのであまり見応えがありません。Webの本展特設ページやちらしで紹介されている作品はどれも素晴らしいのですが、それだけといった感じ。売りの1つの「ジャポニズム」は・・・うーん、どうなんでしょう?

肌色と緑色の黄昏:バルパライソ


白のシンフォニー No.3


リンジー・ハウスから見たバターシー・リーチ


 これで観覧料1,500円というのは、ちょっと強気過ぎませんか?>横浜美術館さん
 まあ、このチケットがあれば観覧出来るコレクション展は前述のモロー作品を始め、デルヴォー、マグリット、ダリ、高橋由一、川瀬巴水、小林清親など充実しているので、こちらも合わせれば妥当なのかなあ?。

岩の上の女神
ギュスターヴ・モロー


 個人的にはモロー作品(小さい絵ですが)さえ観覧出来れば満足なので「行って損した」なんてことはありませんが、本展単独では・・・。あまり期待しすぎるとがっかりするかもしれません。
 3月1日(日)まで。

コメント