Skip to content

Commit

Permalink
Fixing RTree, and using it for retrieving geometries
Browse files Browse the repository at this point in the history
  • Loading branch information
ahocevar committed Feb 13, 2013
1 parent 5bbd8fd commit e155f87
Show file tree
Hide file tree
Showing 2 changed files with 14 additions and 20 deletions.
30 changes: 11 additions & 19 deletions src/ol/renderer/canvas/canvasvectorlayerrenderer.js
Expand Up @@ -6,7 +6,10 @@ goog.require('ol.Size');
goog.require('ol.TileCache'); goog.require('ol.TileCache');
goog.require('ol.TileCoord'); goog.require('ol.TileCoord');
goog.require('ol.ViewHint'); goog.require('ol.ViewHint');
goog.require('ol.filter.Extent');
goog.require('ol.filter.Geometry'); goog.require('ol.filter.Geometry');
goog.require('ol.filter.Logical');
goog.require('ol.filter.LogicalOperator');
goog.require('ol.geom.GeometryType'); goog.require('ol.geom.GeometryType');
goog.require('ol.layer.Vector'); goog.require('ol.layer.Vector');
goog.require('ol.renderer.canvas.Layer'); goog.require('ol.renderer.canvas.Layer');
Expand Down Expand Up @@ -276,11 +279,11 @@ ol.renderer.canvas.VectorLayer.prototype.renderFrame =


var renderedFeatures = {}; var renderedFeatures = {};
var tilesToRender = {}; var tilesToRender = {};
var tile, tileCoord, key, tileExtent, tileState, x, y; var tile, tileCoord, key, tileState, x, y;
// render features by geometry type // render features by geometry type
var filters = this.geometryFilters_, var filters = this.geometryFilters_,
numFilters = filters.length, numFilters = filters.length,
i, filter, type, features, symbolizer; i, spatialFilter, extentFilter, type, features, symbolizer;
for (x = tileRange.minX; x <= tileRange.maxX; ++x) { for (x = tileRange.minX; x <= tileRange.maxX; ++x) {
for (y = tileRange.minY; y <= tileRange.maxY; ++y) { for (y = tileRange.minY; y <= tileRange.maxY; ++y) {
tileCoord = new ol.TileCoord(z, x, y); tileCoord = new ol.TileCoord(z, x, y);
Expand All @@ -289,24 +292,13 @@ ol.renderer.canvas.VectorLayer.prototype.renderFrame =
tilesToRender[key] = tileCoord; tilesToRender[key] = tileCoord;
} else if (!frameState.viewHints[ol.ViewHint.ANIMATING]) { } else if (!frameState.viewHints[ol.ViewHint.ANIMATING]) {
tilesToRender[key] = tileCoord; tilesToRender[key] = tileCoord;
tileExtent = tileGrid.getTileCoordExtent(tileCoord); extentFilter = new ol.filter.Extent(
// TODO: instead of filtering here, do this on the source and maintain tileGrid.getTileCoordExtent(tileCoord));
// a spatial index
function filterFn(feature) {
var id = goog.getUid(feature);
var include = !(id in renderedFeatures) &&
feature.getGeometry().getBounds().intersects(tileExtent);
if (include === true) {
renderedFeatures[id] = true;
}
return include;
}
for (i = 0; i < numFilters; ++i) { for (i = 0; i < numFilters; ++i) {
filter = filters[i]; spatialFilter = filters[i];
type = filter.getType(); type = spatialFilter.getType();
features = source.getFeatures(filter); features = source.getFeatures(new ol.filter.Logical(
// TODO: spatial index of tiles - see filterFn above [spatialFilter, extentFilter], ol.filter.LogicalOperator.AND));
features = goog.array.filter(features, filterFn);
if (features.length) { if (features.length) {
// TODO: layer.getSymbolizerLiterals(features) or similar // TODO: layer.getSymbolizerLiterals(features) or similar
symbolizer = this.symbolizers_[type]; symbolizer = this.symbolizers_[type];
Expand Down
4 changes: 3 additions & 1 deletion src/ol/structs/rtree.js
Expand Up @@ -57,7 +57,9 @@ ol.RTreeNode_.prototype.find = function(bounds, results) {
if (this.intersects(bounds)) { if (this.intersects(bounds)) {
var numChildren = this.children.length; var numChildren = this.children.length;
if (numChildren === 0) { if (numChildren === 0) {
results[this.objectId] = this.object; if (goog.isDef(this.object)) {
results[this.objectId] = this.object;
}
} else { } else {
for (var i = 0; i < numChildren; ++i) { for (var i = 0; i < numChildren; ++i) {
this.children[i].find(bounds, results); this.children[i].find(bounds, results);
Expand Down

0 comments on commit e155f87

Please sign in to comment.