added simple kml support to SQL API, format=kml will output

This commit is contained in:
Andrew W. Hill 2011-09-20 19:15:43 -07:00
parent fd4bab78e1
commit 19b2829d73
2 changed files with 43 additions and 10 deletions

View File

@ -14,14 +14,15 @@
// eg. vizzuality.cartodb.com/api/v1/?sql=SELECT * from my_table // eg. vizzuality.cartodb.com/api/v1/?sql=SELECT * from my_table
var express= require('express') var express= require('express')
, app = express.createServer( , app = express.createServer(
express.logger({buffer:true, express.logger({buffer:true,
format:'[:req[X-Real-IP] :date] \033[90m:method\033[0m \033[36m:url\033[0m \033[90m:status :response-time ms -> :res[Content-Type]\033[0m'})) format:'[:req[X-Real-IP] :date] \033[90m:method\033[0m \033[36m:url\033[0m \033[90m:status :response-time ms -> :res[Content-Type]\033[0m'}))
, Step = require('step') , Step = require('step')
, Meta = require(global.settings.app_root + '/app/models/metadata') , Meta = require(global.settings.app_root + '/app/models/metadata')
, oAuth = require(global.settings.app_root + '/app/models/oauth') , oAuth = require(global.settings.app_root + '/app/models/oauth')
, PSQL = require(global.settings.app_root + '/app/models/psql') , PSQL = require(global.settings.app_root + '/app/models/psql')
, _ = require('underscore'); , _ = require('underscore')
, libxml = require("libxmljs");
app.use(express.bodyParser()); app.use(express.bodyParser());
app.enable('jsonp callback'); app.enable('jsonp callback');
@ -72,12 +73,15 @@ function handleQuery(req, res){
if (format == 'geojson'){ if (format == 'geojson'){
sql = ['SELECT *,ST_AsGeoJSON(the_geom) as the_geom FROM (', sql, ') as foo'].join(""); sql = ['SELECT *,ST_AsGeoJSON(the_geom) as the_geom FROM (', sql, ') as foo'].join("");
}else if (format == 'kml'){
sql = ['SELECT *,ST_AsKML(the_geom) as the_geom FROM (', sql, ') as foo'].join("");
} }
pg.query(sql, this); pg.query(sql, this);
}, },
function packageResults(err, result){ function packageResults(err, result){
if (err) throw err; if (err) throw err;
var end = new Date().getTime(); var end = new Date().getTime();
if (format == 'geojson'){ if (format == 'geojson'){
var out = {type: "FeatureCollection", var out = {type: "FeatureCollection",
features: []}; features: []};
@ -92,6 +96,34 @@ function handleQuery(req, res){
out.features.push(geojson); out.features.push(geojson);
} }
res.send(out); res.send(out);
} else if (format == 'kml'){
var doc = new libxml.Document(function(n) {
n.node('kml', {xmlns: "http://www.opengis.net/kml/2.2"}, function(n) {
n.node('Document', function(n) {
n.node('Folder', function(n){
n.node('name', 'CartoDB SQL API');
for (i=0; i < result.rows.length; i++) {
n.node('Placemark', function(n){
var name = result.rows[i].name ? result.rows[i].name : result.rows[i].cartodb_id;
var geom = libxml.parseXmlString(result.rows[i].the_geom).root();
n.node('name', name);
n.node(geom);
delete result.rows[i]["the_geom"];
delete result.rows[i]["the_geom_webmercator"];
for (var key in result.rows[i]){
var val = result.rows[i][key];
if (val && val != null && val != ''){
if (typeof(val) === 'object') val = val.toString();
n.node(key, val);
}
}
});
}
});
});
});
});
res.send(doc.toString());
}else{ }else{
res.send({'time' : ((end - start)/1000), res.send({'time' : ((end - start)/1000),
'total_rows': result.rows.length, 'total_rows': result.rows.length,

View File

@ -12,7 +12,8 @@
"generic-pool": "1.0.x", "generic-pool": "1.0.x",
"redis": "0.6.1", "redis": "0.6.1",
"step": "0.0.x", "step": "0.0.x",
"oauth-client": "0.2.0" "oauth-client": "0.2.0",
"libxmljs": "0.4.2"
}, },
"devDependencies": { "devDependencies": {
"expresso": "0.8.x" "expresso": "0.8.x"