private void AddTag(OsmTag tag, RelationMemberTypes type, long id) { var valueId = 0UL; var reference = new Reference(type, (ulong)id); if (!values.TryGetValue(tag.Value, out var valueInfo)) { valueId = ++lastId; valueInfo.Id = valueId; valueInfo.Value = tag.Value; valueInfo.Refs = new List <Reference> { reference }; values.Add(tag.Value, valueInfo); dataSize += (ulong)tag.Value.Length * 8 + 512; } else { valueId = valueInfo.Id; valueInfo.Refs.Add(reference); } dataSize += 24; if (!keys.TryGetValue(tag.Key, out var keyInfo)) { keyInfo.Id = ++lastId; keyInfo.Key = tag.Key; keyInfo.Values = new Dictionary <ulong, List <Reference> > { { valueId, new List <Reference> { reference } } }; keys.Add(tag.Key, keyInfo); dataSize += (ulong)tag.Key.Length * 8 + 1024; } else { if (keyInfo.Values.TryGetValue(valueId, out var valueRefs)) { valueRefs.Add(reference); } else { keyInfo.Values.Add(valueId, new List <Reference> { reference }); dataSize += 128; } } dataSize += 24; valuesCount++; }
public Reference(RelationMemberTypes type, ulong id) { RefId = (id << 2) | (ulong)type; }