2013年3月5日 : してログ

OpenLayers でバッファの発生とかは可能なようですが、ポリゴン同士の幾何演算(融合や差分)などを行う関数が用意されていません。コントロールで Split がありますが、これはマウスで描いたラインを使ってジオメトリを分割するようなインターフェイスです。

色々と調べてみると、JSTS Topology Suite というライブラリを見つけました。Java のライブラリのようですが、JavaScript のものもあり、OpenLayers と連携して使うための仕組みも用意されています。

JSTS Topology Suite

https://github.com/bjornharrtell/jsts

サンプルコード

var reader = new jsts.io.WKTReader();

var a = reader.read('POLYGON((10 10, 100 10, 100 100, 10 100, 10 10))');
var b = reader.read('POLYGON((50 50, 200 50, 200 200, 50 200, 50 50))');

var diff = a.difference(b);

var parser = new jsts.io.OpenLayersParser();

diff = parser.write(diff);

var map = new OpenLayers.Map('map', {
	maxExtent: new OpenLayers.Bounds(0, 0, 300, 300),
	maxResolution: 100,
	units: 'm',
	controls: [new OpenLayers.Control.MousePosition(), new OpenLayers.Control.Navigation()]
});

var layer = new OpenLayers.Layer.Vector('test', {isBaseLayer: true});
map.addLayer(layer); 

var diffOutput = new OpenLayers.Feature.Vector(diff, null, { fillColor: 'green', fillOpacity: 1});
layer.addFeatures([diffOutput]);

layer.addFeatures([diffOutput]);
map.zoomToMaxExtent();