void start_tile_feature(mapnik::feature_impl const& feature) { current_feature_ = current_layer_->add_features(); x_ = y_ = 0; // TODO - encode as sint64: (n << 1) ^ ( n >> 63) // test current behavior with negative numbers current_feature_->set_id(feature.id()); feature_kv_iterator itr = feature.begin(); feature_kv_iterator end = feature.end(); for ( ;itr!=end; ++itr) { std::string const& name = MAPNIK_GET<0>(*itr); mapnik::value const& val = MAPNIK_GET<1>(*itr); if (!val.is_null()) { // Insert the key index keys_container::const_iterator key_itr = keys_.find(name); if (key_itr == keys_.end()) { // The key doesn't exist yet in the dictionary. current_layer_->add_keys(name.c_str(), name.length()); size_t index = keys_.size(); keys_.insert(keys_container::value_type(name, index)); current_feature_->add_tags(index); } else { current_feature_->add_tags(key_itr->second); } // Insert the value index values_container::const_iterator val_itr = values_.find(val); if (val_itr == values_.end()) { // The value doesn't exist yet in the dictionary. to_tile_value visitor(current_layer_->add_values()); #if MAPNIK_VERSION >= 300000 MAPNIK_APPLY_VISITOR(visitor, val); #else MAPNIK_APPLY_VISITOR(visitor, val.base()); #endif size_t index = values_.size(); values_.insert(values_container::value_type(val, index)); current_feature_->add_tags(index); } else { current_feature_->add_tags(val_itr->second); } } } }