2014-08-03 02:26:01 +08:00
|
|
|
var pg = require('./pg'),
|
|
|
|
_ = require('underscore'),
|
|
|
|
geojson = require('./geojson'),
|
|
|
|
TopoJSON = require('topojson');
|
2013-05-16 17:24:52 +08:00
|
|
|
|
|
|
|
|
2013-05-27 17:21:56 +08:00
|
|
|
function topojson() { }
|
2013-05-16 17:24:52 +08:00
|
|
|
|
2013-05-27 17:21:56 +08:00
|
|
|
topojson.prototype = new pg('topojson');
|
2013-05-16 17:24:52 +08:00
|
|
|
|
2013-05-27 17:21:56 +08:00
|
|
|
var p = topojson.prototype;
|
2013-05-16 17:24:52 +08:00
|
|
|
|
2013-05-27 17:21:56 +08:00
|
|
|
p.getQuery = function(sql, options) {
|
|
|
|
var sql = geojson.prototype.getQuery(sql, options);
|
|
|
|
return sql + ' where ' + options.gn + ' is not null';
|
|
|
|
};
|
2013-05-16 17:24:52 +08:00
|
|
|
|
2013-05-27 17:21:56 +08:00
|
|
|
p.transform = function(result, options, callback) {
|
|
|
|
toTopoJSON(result, options.gn, options.skipfields, callback);
|
|
|
|
};
|
2013-05-16 17:24:52 +08:00
|
|
|
|
|
|
|
function toTopoJSON(data, gn, skipfields, callback){
|
|
|
|
geojson.toGeoJSON(data, gn, function(err, geojson) {
|
|
|
|
if ( err ) {
|
|
|
|
callback(err, null);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
var topology = TopoJSON.topology(geojson.features, {
|
|
|
|
/* TODO: expose option to API for requesting an identifier
|
|
|
|
"id": function(o) {
|
|
|
|
console.log("id called with obj: "); console.dir(o);
|
|
|
|
return o;
|
|
|
|
},
|
|
|
|
*/
|
|
|
|
"quantization": 1e4, // TODO: expose option to API (use existing "dp" for this ?)
|
|
|
|
"force-clockwise": true,
|
|
|
|
"property-filter": function(d) {
|
|
|
|
// TODO: delegate skipfields handling to toGeoJSON
|
|
|
|
return skipfields.indexOf(d) != -1 ? null : d;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
callback(err, topology);
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2013-05-27 17:21:56 +08:00
|
|
|
module.exports = topojson;
|