diff --git a/plugins/tiddlywiki/geospatial/operators/transformation.js b/plugins/tiddlywiki/geospatial/operators/transformation.js new file mode 100644 index 000000000..2947780c5 --- /dev/null +++ b/plugins/tiddlywiki/geospatial/operators/transformation.js @@ -0,0 +1,88 @@ +/*\ +title: $:/plugins/tiddlywiki/geospatial/operators/transformation.js +type: application/javascript +module-type: filteroperator + +Filter operators for geospatial transformation + +\*/ +(function(){ + +/*jslint node: true, browser: true */ +/*global $tw: false */ +"use strict"; + +var turf = require("$:/plugins/tiddlywiki/geospatial/turf.js"), + geotools = require("$:/plugins/tiddlywiki/geospatial/geotools.js"); + +exports.geounion = makeTransformation("union"); + +exports.geointersect = makeTransformation("intersect"); + +exports.geodifference = makeTransformation("difference"); + +function makeTransformation(methodName) { + return function(source,operator,options) { + // Collect the input + var jsonObjects = []; + source(function(tiddler,title) { + var jsonObject = $tw.utils.parseJSONSafe(title,null); + if(jsonObject) { + jsonObjects.push(jsonObject) + } + }); + // Perform the transformation + var result = geojsonOp(jsonObjects,methodName); + return [JSON.stringify(result)]; + }; +} + +function geojsonOp(geojsonObjects, op) { + var resultFeatures = []; + $tw.utils.each(geojsonObjects,function (geojson1) { + if(geojson1.type === "FeatureCollection") { + resultFeatures = resultFeatures.length ? resultFeatures : geojson1.features; + } else if(geojson1.type === "Feature") { + resultFeatures = resultFeatures.length ? resultFeatures : [geojson1]; + } + $tw.utils.each(geojsonObjects,function (geojson2) { + if(geojson1 !== geojson2) { + var newResultFeatures = []; + $tw.utils.each(resultFeatures,function (feature1) { + if(geojson2.type === "FeatureCollection") { + $tw.utils.each(geojson2.features,function (feature2) { + var result; + if(op === "union") { + result = turf.union(feature1, feature2); + } else if(op === "intersect") { + result = turf.intersect(feature1, feature2); + } else if(op === "difference") { + result = turf.difference(feature1, feature2); + } + if(result) { + newResultFeatures.push(result); + } + }); + } else if(geojson2.type === "Feature") { + var result; + if(op === "union") { + result = turf.union(feature1, geojson2); + } else if(op === "intersect") { + result = turf.intersect(feature1, geojson2); + } else if(op === "difference") { + result = turf.difference(feature1, geojson2); + } + if(result) { + newResultFeatures.push(result); + } + } + }); + resultFeatures = newResultFeatures; + } + }); + }); + return turf.featureCollection(resultFeatures); +} + + +})();