/// <summary> /// Encodes an OsmSharp-node into a PBF-node. /// </summary> /// <returns></returns> public static OsmSharp.Osm.PBF.Node EncodeNode(PrimitiveBlock block, Dictionary <string, int> reverseStringTable, Osm.Node node) { var pbfNode = new OsmSharp.Osm.PBF.Node(); Encoder.EncodeNode(block, reverseStringTable, pbfNode, node); return(pbfNode); }
/// <summary> /// Encodes the nodes into the given block. /// </summary> public static void Encode(this PrimitiveBlock block, Dictionary <string, int> reverseStringTable, List <OsmGeo> osmGeos) { var groupIdx = 0; var i = 0; var nodeCount = 0; if (block.stringtable != null && block.stringtable.s != null) { block.stringtable.s.Clear(); } while (i < osmGeos.Count) { PrimitiveGroup group = null; if (groupIdx < block.primitivegroup.Count) { // get the existing group and clear it's data. group = block.primitivegroup[groupIdx]; if (group == null) { group = new PrimitiveGroup(); } if (group.dense != null) { if (group.dense.denseinfo != null) { if (group.dense.denseinfo.changeset != null) { group.dense.denseinfo.changeset.Clear(); } if (group.dense.denseinfo.timestamp != null) { group.dense.denseinfo.timestamp.Clear(); } if (group.dense.denseinfo.uid != null) { group.dense.denseinfo.uid.Clear(); } if (group.dense.denseinfo.user_sid != null) { group.dense.denseinfo.user_sid.Clear(); } if (group.dense.denseinfo.version != null) { group.dense.denseinfo.version.Clear(); } } if (group.dense.id != null) { group.dense.id.Clear(); } if (group.dense.keys_vals != null) { group.dense.keys_vals.Clear(); } if (group.dense.lat != null) { group.dense.lat.Clear(); } if (group.dense.lon != null) { group.dense.lon.Clear(); } } if (group.changesets != null) { group.changesets.Clear(); } //if (group.nodes != null) { group.nodes.Clear(); } if (group.ways != null) { group.ways.Clear(); } if (group.relations != null) { group.relations.Clear(); } } else { // add a new group. group = new PrimitiveGroup(); block.primitivegroup.Add(group); } // build group. var groupType = osmGeos[i].Type; var current = osmGeos[i]; while (i < osmGeos.Count && osmGeos[i].Type == groupType) { switch (groupType) { case OsmGeoType.Node: if (group.nodes.Count > nodeCount) { // overwrite existing. Encoder.EncodeNode(block, reverseStringTable, group.nodes[nodeCount], osmGeos[i] as Osm.Node); } else { // write new. group.nodes.Add(Encoder.EncodeNode(block, reverseStringTable, osmGeos[i] as Osm.Node)); } nodeCount++; break; case OsmGeoType.Way: group.ways.Add(Encoder.EncodeWay(block, reverseStringTable, osmGeos[i] as Osm.Way)); break; case OsmGeoType.Relation: group.relations.Add(Encoder.EncodeRelation(block, reverseStringTable, osmGeos[i] as Osm.Relation)); break; } i++; } // remove obsolete nodes. if (group.nodes != null) { while (nodeCount < group.nodes.Count) { group.nodes.RemoveAt(nodeCount); } } // move to the next group. groupIdx++; } while (groupIdx < block.primitivegroup.Count) { block.primitivegroup.RemoveAt(groupIdx); } }
public static void Encode(this PrimitiveBlock block, Dictionary <string, int> reverseStringTable, List <OsmGeo> osmGeos) { int index1 = 0; int index2 = 0; int index3 = 0; if (block.stringtable != null && block.stringtable.s != null) { block.stringtable.s.Clear(); } while (index2 < osmGeos.Count) { PrimitiveGroup primitiveGroup; if (index1 < block.primitivegroup.Count) { primitiveGroup = block.primitivegroup[index1] ?? new PrimitiveGroup(); if (primitiveGroup.dense != null) { if (primitiveGroup.dense.denseinfo != null) { if (primitiveGroup.dense.denseinfo.changeset != null) { primitiveGroup.dense.denseinfo.changeset.Clear(); } if (primitiveGroup.dense.denseinfo.timestamp != null) { primitiveGroup.dense.denseinfo.timestamp.Clear(); } if (primitiveGroup.dense.denseinfo.uid != null) { primitiveGroup.dense.denseinfo.uid.Clear(); } if (primitiveGroup.dense.denseinfo.user_sid != null) { primitiveGroup.dense.denseinfo.user_sid.Clear(); } if (primitiveGroup.dense.denseinfo.version != null) { primitiveGroup.dense.denseinfo.version.Clear(); } } if (primitiveGroup.dense.id != null) { primitiveGroup.dense.id.Clear(); } if (primitiveGroup.dense.keys_vals != null) { primitiveGroup.dense.keys_vals.Clear(); } if (primitiveGroup.dense.lat != null) { primitiveGroup.dense.lat.Clear(); } if (primitiveGroup.dense.lon != null) { primitiveGroup.dense.lon.Clear(); } } if (primitiveGroup.changesets != null) { primitiveGroup.changesets.Clear(); } if (primitiveGroup.ways != null) { primitiveGroup.ways.Clear(); } if (primitiveGroup.relations != null) { primitiveGroup.relations.Clear(); } } else { primitiveGroup = new PrimitiveGroup(); block.primitivegroup.Add(primitiveGroup); } OsmGeoType type = osmGeos[index2].Type; OsmGeo osmGeo = osmGeos[index2]; for (; index2 < osmGeos.Count && osmGeos[index2].Type == type; ++index2) { switch (type) { case OsmGeoType.Node: if (primitiveGroup.nodes.Count > index3) { Encoder.EncodeNode(block, reverseStringTable, primitiveGroup.nodes[index3], osmGeos[index2] as OsmSharp.Osm.Node); } else { primitiveGroup.nodes.Add(Encoder.EncodeNode(block, reverseStringTable, osmGeos[index2] as OsmSharp.Osm.Node)); } ++index3; break; case OsmGeoType.Way: primitiveGroup.ways.Add(Encoder.EncodeWay(block, reverseStringTable, osmGeos[index2] as OsmSharp.Osm.Way)); break; case OsmGeoType.Relation: primitiveGroup.relations.Add(Encoder.EncodeRelation(block, reverseStringTable, osmGeos[index2] as OsmSharp.Osm.Relation)); break; } } if (primitiveGroup.nodes != null) { while (index3 < primitiveGroup.nodes.Count) { primitiveGroup.nodes.RemoveAt(index3); } } ++index1; } while (index1 < block.primitivegroup.Count) { block.primitivegroup.RemoveAt(index1); } }