void hit_grid<T>::add_feature(mapnik::feature_impl const& feature) { value_type feature_id = feature.id(); // avoid adding duplicate features (e.g. in the case of both a line symbolizer and a polygon symbolizer) typename feature_key_type::const_iterator feature_pos = f_keys_.find(feature_id); if (feature_pos != f_keys_.end()) { return; } if (ctx_->size() == 0) { context_type::map_type::const_iterator itr = feature.context()->begin(); context_type::map_type::const_iterator end = feature.context()->end(); for ( ;itr!=end; ++itr) { ctx_->add(itr->first,itr->second); } } // NOTE: currently lookup keys must be strings, // but this should be revisited lookup_type lookup_value; if (key_ == id_name_) { mapnik::util::to_string(lookup_value,feature_id); } else { if (feature.has_key(key_)) { lookup_value = feature.get(key_).to_string(); } else { MAPNIK_LOG_DEBUG(grid) << "hit_grid: Should not get here: key '" << key_ << "' not found in feature properties"; } } if (!lookup_value.empty()) { // TODO - consider shortcutting f_keys if feature_id == lookup_value // create a mapping between the pixel id and the feature key f_keys_.emplace(feature_id,lookup_value); // if extra fields have been supplied, push them into grid memory if (!names_.empty()) { // it is ~ 2x faster to copy feature attributes compared // to building up a in-memory cache of feature_ptrs // https://github.com/mapnik/mapnik/issues/1198 mapnik::feature_ptr feature2(mapnik::feature_factory::create(ctx_,feature_id)); feature2->set_data(feature.get_data()); features_.emplace(lookup_value,feature2); } } else { MAPNIK_LOG_DEBUG(grid) << "hit_grid: Warning - key '" << key_ << "' was blank for " << feature; } }