Skip to content

Commit

Permalink
featuresAt returns GeoJSON (fixes #1010)
Browse files Browse the repository at this point in the history
  • Loading branch information
jfirebaugh committed Feb 24, 2015
1 parent f00e0e9 commit 8e09779
Show file tree
Hide file tree
Showing 6 changed files with 46 additions and 48 deletions.
40 changes: 18 additions & 22 deletions js/data/feature_tree.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
'use strict';

var rbush = require('rbush'),
Point = require('point-geometry');
var rbush = require('rbush');
var Point = require('point-geometry');
var vt = require('vector-tile');
var util = require('../util/util');
var TileCoord = require('../source/tile_coord');

module.exports = FeatureTree;

function FeatureTree(getGeometry, getType) {

this.getGeometry = getGeometry;
this.getType = getType;

function FeatureTree(tileId) {
this.coord = TileCoord.fromID(tileId);
this.rtree = rbush(9);
this.toBeInserted = [];
}
Expand Down Expand Up @@ -38,28 +38,24 @@ FeatureTree.prototype.query = function(args, callback) {

var matching = this.rtree.search([ x - radius, y - radius, x + radius, y + radius ]);
for (var i = 0; i < matching.length; i++) {
var feature = matching[i].feature;
var type = this.getType(feature);
var geometry = this.getGeometry(feature);
var feature = matching[i].feature,
layers = matching[i].layers,
type = vt.VectorTileFeature.types[feature.type];

if (params.layer && matching[i].layers.indexOf(params.layer.id) < 0)
continue;
if (params.$type && type !== params.$type)
continue;
if (!geometryContainsPoint(geometry, type, new Point(x, y), radius))
if (!geometryContainsPoint(feature.loadGeometry(), type, new Point(x, y), radius))
continue;

var props = {
$type: type,
properties: matching[i].feature.properties,
layers: matching[i].layers
};
var geoJSON = feature.toGeoJSON(this.coord.x, this.coord.y, this.coord.z);
for (var l = 0; l < layers.length; l++) {
var layer = layers[l];

if (params.geometry) {
props._geometry = geometry;
}
if (params.layer && layer !== params.layer.id)
continue;

result.push(props);
result.push(util.extend({layer: layer}, geoJSON));
}
}

callback(null, result);
Expand Down
11 changes: 1 addition & 10 deletions js/source/worker_tile.js
Original file line number Diff line number Diff line change
@@ -1,19 +1,10 @@
'use strict';

var FeatureTree = require('../data/feature_tree');
var vt = require('vector-tile');
var Collision = require('../symbol/collision');
var BufferSet = require('../data/buffer/buffer_set');
var createBucket = require('../data/create_bucket');

function getGeometry(feature) {
return feature.loadGeometry();
}

function getType(feature) {
return vt.VectorTileFeature.types[feature.type];
}

module.exports = WorkerTile;

function WorkerTile(id, zoom, maxZoom, tileSize, source, overscaling) {
Expand All @@ -26,7 +17,7 @@ function WorkerTile(id, zoom, maxZoom, tileSize, source, overscaling) {
}

WorkerTile.prototype.parse = function(data, layers, actor, callback) {
this.featureTree = new FeatureTree(getGeometry, getType);
this.featureTree = new FeatureTree(this.id);

var i, k,
tile = this,
Expand Down
4 changes: 1 addition & 3 deletions js/style/style.js
Original file line number Diff line number Diff line change
Expand Up @@ -307,9 +307,7 @@ Style.prototype = util.inherit(Evented, {
if (error) return callback(error);

features.forEach(function(feature) {
feature.layers = feature.layers.map(function(id) {
return this._layers[id].json();
}.bind(this));
feature.layer = this._layers[feature.layer].json();
}.bind(this));

callback(null, features);
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@
"rbush": "^1.3.4",
"request": "^2.39.0",
"unitbezier": "0.0.0",
"vector-tile": "^1.0.0"
"vector-tile": "^1.1.0"
},
"devDependencies": {
"benchmark": "~1.0.0",
Expand Down
5 changes: 3 additions & 2 deletions test/js/data/feature_tree.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -83,8 +83,9 @@ test('featuretree query', function(t) {
}, function(err, features) {
t.notEqual(features.length, 0, 'non-empty results for queryFeatures');
features.forEach(function(f) {
t.ok(f.$type, 'result has $type');
t.deepEqual(f.layers, ['water']);
t.equal(f.type, 'Feature');
t.equal(f.geometry.type, 'Polygon');
t.equal(f.layer, 'water');
t.ok(f.properties, 'result has properties');
t.notEqual(f.properties.osm_id, undefined, 'properties has osm_id by default');
});
Expand Down
32 changes: 22 additions & 10 deletions test/js/style/style.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -336,18 +336,30 @@ test('Style#featuresAt', function(t) {

style.sources.mapbox.featuresAt = function(position, params, callback) {
callback(null, [{
$type: 'Polygon',
layers: ['land']
type: 'Feature',
layer: 'land',
geometry: {
type: 'Polygon'
}
}, {
type: 'Feature',
layer: 'land',
geometry: {
type: 'Point'
}
}, {
$type: 'Polygon',
layers: ['land', 'landref']
type: 'Feature',
layer: 'landref',
geometry: {
type: 'Point'
}
}]);
};

t.test('returns feature type', function(t) {
style.featuresAt([256, 256], {}, function(err, results) {
t.error(err);
t.equal(results[0].$type, 'Polygon');
t.equal(results[0].geometry.type, 'Polygon');
t.end();
});
});
Expand All @@ -356,7 +368,7 @@ test('Style#featuresAt', function(t) {
style.featuresAt([256, 256], {}, function(err, results) {
t.error(err);

var layout = results[0].layers[0].layout;
var layout = results[0].layer.layout;
t.deepEqual(layout, {'line-cap': 'round'});
t.deepEqual(
Object.getPrototypeOf(layout),
Expand All @@ -370,7 +382,7 @@ test('Style#featuresAt', function(t) {
style.featuresAt([256, 256], {}, function(err, results) {
t.error(err);

var paint = results[0].layers[0].paint;
var paint = results[0].layer.paint;
t.deepEqual(paint, {'line-color': [ 1, 0, 0, 1 ]});
t.deepEqual(
Object.getPrototypeOf(paint),
Expand All @@ -384,8 +396,8 @@ test('Style#featuresAt', function(t) {
style.featuresAt([256, 256], {}, function(err, results) {
t.error(err);

var layer = results[1].layers[0];
var refLayer = results[1].layers[1];
var layer = results[1].layer;
var refLayer = results[2].layer;
t.deepEqual(layer.layout, refLayer.layout);
t.deepEqual(layer.type, refLayer.type);
t.deepEqual(layer.id, refLayer.ref);
Expand All @@ -399,7 +411,7 @@ test('Style#featuresAt', function(t) {
style.featuresAt([256, 256], {}, function(err, results) {
t.error(err);

var layer = results[0].layers[0];
var layer = results[0].layer;
t.equal(layer.something, 'else');

t.end();
Expand Down

0 comments on commit 8e09779

Please sign in to comment.