Fixing RTree, and using it for retrieving geometries

This commit is contained in:
ahocevar
2013-02-13 12:29:14 +01:00
parent 5bbd8fd9f3
commit e155f870cd
2 changed files with 14 additions and 20 deletions

View File

@@ -6,7 +6,10 @@ goog.require('ol.Size');
goog.require('ol.TileCache');
goog.require('ol.TileCoord');
goog.require('ol.ViewHint');
goog.require('ol.filter.Extent');
goog.require('ol.filter.Geometry');
goog.require('ol.filter.Logical');
goog.require('ol.filter.LogicalOperator');
goog.require('ol.geom.GeometryType');
goog.require('ol.layer.Vector');
goog.require('ol.renderer.canvas.Layer');
@@ -276,11 +279,11 @@ ol.renderer.canvas.VectorLayer.prototype.renderFrame =
var renderedFeatures = {};
var tilesToRender = {};
var tile, tileCoord, key, tileExtent, tileState, x, y;
var tile, tileCoord, key, tileState, x, y;
// render features by geometry type
var filters = this.geometryFilters_,
numFilters = filters.length,
i, filter, type, features, symbolizer;
i, spatialFilter, extentFilter, type, features, symbolizer;
for (x = tileRange.minX; x <= tileRange.maxX; ++x) {
for (y = tileRange.minY; y <= tileRange.maxY; ++y) {
tileCoord = new ol.TileCoord(z, x, y);
@@ -289,24 +292,13 @@ ol.renderer.canvas.VectorLayer.prototype.renderFrame =
tilesToRender[key] = tileCoord;
} else if (!frameState.viewHints[ol.ViewHint.ANIMATING]) {
tilesToRender[key] = tileCoord;
tileExtent = tileGrid.getTileCoordExtent(tileCoord);
// TODO: instead of filtering here, do this on the source and maintain
// 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;
}
extentFilter = new ol.filter.Extent(
tileGrid.getTileCoordExtent(tileCoord));
for (i = 0; i < numFilters; ++i) {
filter = filters[i];
type = filter.getType();
features = source.getFeatures(filter);
// TODO: spatial index of tiles - see filterFn above
features = goog.array.filter(features, filterFn);
spatialFilter = filters[i];
type = spatialFilter.getType();
features = source.getFeatures(new ol.filter.Logical(
[spatialFilter, extentFilter], ol.filter.LogicalOperator.AND));
if (features.length) {
// TODO: layer.getSymbolizerLiterals(features) or similar
symbolizer = this.symbolizers_[type];

View File

@@ -57,7 +57,9 @@ ol.RTreeNode_.prototype.find = function(bounds, results) {
if (this.intersects(bounds)) {
var numChildren = this.children.length;
if (numChildren === 0) {
results[this.objectId] = this.object;
if (goog.isDef(this.object)) {
results[this.objectId] = this.object;
}
} else {
for (var i = 0; i < numChildren; ++i) {
this.children[i].find(bounds, results);