Add support for geocoder api (carmen dev).

This commit is contained in:
Young Hahn
2013-12-05 15:00:17 -05:00
parent 9868c9aca4
commit 51c598ddac
4 changed files with 180 additions and 1 deletions

View File

@@ -56,6 +56,7 @@ function MBTiles(uri, callback) {
if (err) return callback(err);
mbtiles._stat = stat;
mbtiles.open = true;
mbtiles.emit('open', err);
callback(null, mbtiles);
});
});
@@ -562,3 +563,82 @@ MBTiles.prototype.putInfo = function(data, callback) {
});
};
// Implements carmen#getGeocoderData method.
MBTiles.prototype.getGeocoderData = function(type, shard, callback) {
return this._db.get('SELECT data FROM geocoder_data WHERE type = ? AND shard = ?', type, shard, function(err, row) {
if (err) return callback(err);
if (!row) return callback();
zlib.inflate(row.data, callback);
});
};
// Implements carmen#putGeocoderData method.
MBTiles.prototype.putGeocoderData = function(type, shard, data, callback) {
var source = this;
zlib.deflate(data, function(err, zdata) {
if (err) return callback(err);
source.write('geocoder_data', type + '.' + shard, { type:type, shard: shard, data: zdata }, callback);
});
};
// Implements carmen#getIndexableDocs method.
MBTiles.prototype.getIndexableDocs = function(pointer, callback) {
pointer = pointer || {};
pointer.limit = pointer.limit || 10000;
pointer.offset = pointer.offset || 0;
pointer.nogrids = 'nogrids' in pointer ? pointer.nogrids : false;
// Converts MBTiles native TMS coords to ZXY.
function tms2zxy(zxys) {
return zxys.split(',').map(function(tms) {
var zxy = tms.split('/').map(function(v) { return parseInt(v, 10); });
zxy[2] = (1 << zxy[0]) - 1 - zxy[2];
return zxy.join('/');
});
}
// If 'carmen' option is passed in initial pointer, retrieve indexables from
// carmen table. This option can be used to access the previously indexed
// documents from an MBTiles database without having to know what search
// field was used in the past (see comment below).
if (pointer.table === 'carmen') {
return this._db.all('SELECT c.id AS id, c.text AS text, c.zxy, k.key_json FROM carmen c JOIN keymap k ON c.id = k.key_name LIMIT ? OFFSET ?', pointer.limit, pointer.offset, function(err, rows) {
if (err) return callback(err);
var docs = rows.map(function(row) {
var doc = JSON.parse(row.key_json);
doc._id = row.id;
doc._text = row.text;
if (row.zxy) doc._zxy = tms2zxy(row.zxy);
return doc;
});
pointer.offset += pointer.limit;
return callback(null, docs, pointer);
}.bind(this));
}
// By default the keymap table contains all indexable documents.
this.getInfo(function(err, info) {
if (err) return callback(err);
var sql, args;
if (pointer.nogrids) {
sql = "SELECT key_name, key_json FROM keymap LIMIT ? OFFSET ?;";
args = [pointer.limit, pointer.offset];
} else {
sql = "SELECT k.key_name AS id, k.key_json, GROUP_CONCAT(zoom_level||'/'||tile_column ||'/'||tile_row,',') AS zxy FROM keymap k JOIN grid_key g ON k.key_name = g.key_name JOIN map m ON g.grid_id = m.grid_id WHERE m.zoom_level=? GROUP BY k.key_name LIMIT ? OFFSET ?;";
args = [info.maxzoom, pointer.limit, pointer.offset];
}
this._db.all(sql, args, function(err, rows) {
if (err) return callback(err);
var docs = rows.map(function(row) {
var doc = JSON.parse(row.key_json);
doc._id = row.id;
doc._text = doc.search || doc.name || '';
if (row.zxy) doc._zxy = tms2zxy(row.zxy);
return doc;
});
pointer.offset += pointer.limit;
return callback(null, docs, pointer);
}.bind(this));
}.bind(this));
};