/// <summary> /// Decodes the given block. /// </summary> public static bool Decode(this PrimitiveBlock block, IPBFOsmPrimitiveConsumer primitivesConsumer, bool ignoreNodes, bool ignoreWays, bool ignoreRelations) { bool hasNodes, hasWays, hasRelations; return(block.Decode(primitivesConsumer, ignoreNodes, ignoreWays, ignoreRelations, out hasNodes, out hasWays, out hasRelations)); }
/// <summary> /// Decodes the block. /// </summary> public static bool Decode(this PrimitiveBlock block, IPBFOsmPrimitiveConsumer primitivesConsumer, bool ignoreNodes, bool ignoreWays, bool ignoreRelations, out bool hasNodes, out bool hasWays, out bool hasRelations) { var success = false; hasNodes = false; hasWays = false; hasRelations = false; if (block.primitivegroup != null) { foreach (var primitivegroup in block.primitivegroup) { if (primitivegroup.dense != null && primitivegroup.dense.id.Count > 0) { hasNodes = true; if (!ignoreNodes) { int keyValsIdx = 0; long currentId = 0; long currentLat = 0; long currentLon = 0; long currentChangeset = 0; long currentTimestamp = 0; int currentUid = 0; int currentUserSid = 0; int currentVersion = 0; for (int idx = 0; idx < primitivegroup.dense.id.Count; idx++) { // do the delta decoding stuff. currentId = currentId + primitivegroup.dense.id[idx]; currentLat = currentLat + primitivegroup.dense.lat[idx]; currentLon = currentLon + primitivegroup.dense.lon[idx]; if (primitivegroup.dense.denseinfo != null) { // add all the metadata. currentChangeset = currentChangeset + primitivegroup.dense.denseinfo.changeset[idx]; currentTimestamp = currentTimestamp + primitivegroup.dense.denseinfo.timestamp[idx]; currentUid = currentUid + primitivegroup.dense.denseinfo.uid[idx]; currentUserSid = currentUserSid + primitivegroup.dense.denseinfo.user_sid[idx]; currentVersion = currentVersion + primitivegroup.dense.denseinfo.version[idx]; } var node = new Node(); node.id = currentId; node.info = new Info(); node.info.changeset = currentChangeset; node.info.timestamp = (int)currentTimestamp; node.info.uid = currentUid; node.info.user_sid = currentUserSid; node.info.version = currentVersion; node.lat = currentLat; node.lon = currentLon; // get the keys/vals. var keyVals = primitivegroup.dense.keys_vals; while (keyVals.Count > keyValsIdx && keyVals[keyValsIdx] != 0) { node.keys.Add((uint)keyVals[keyValsIdx]); keyValsIdx++; node.vals.Add((uint)keyVals[keyValsIdx]); keyValsIdx++; } keyValsIdx++; success = true; hasNodes = true; primitivesConsumer.ProcessNode(block, node); } } } else { if (primitivegroup.nodes != null && primitivegroup.nodes.Count > 0) { hasNodes = true; if (!ignoreNodes) { foreach (var node in primitivegroup.nodes) { success = true; primitivesConsumer.ProcessNode(block, node); } } } if (primitivegroup.ways != null && primitivegroup.ways.Count > 0) { hasWays = true; if (!ignoreWays) { foreach (var way in primitivegroup.ways) { success = true; primitivesConsumer.ProcessWay(block, way); } } } if (primitivegroup.relations != null && primitivegroup.relations.Count > 0) { hasRelations = true; if (!ignoreRelations) { foreach (var relation in primitivegroup.relations) { success = true; primitivesConsumer.ProcessRelation(block, relation); } } } } } } return(success); }
/// <summary> /// Decodes the block. /// </summary> public static bool Decode(this PrimitiveBlock block, IPBFOsmPrimitiveConsumer primitivesConsumer, bool ignoreNodes, bool ignoreWays, bool ignoreRelations) { var success = false; if (block.primitivegroup != null) { foreach (var primitivegroup in block.primitivegroup) { if (!ignoreNodes && primitivegroup.dense != null) { int keyValsIdx = 0; long currentId = 0; long currentLat = 0; long currentLon = 0; long currentChangeset = 0; long currentTimestamp = 0; int currentUid = 0; int currentUserSid = 0; int currentVersion = 0; for (int idx = 0; idx < primitivegroup.dense.id.Count; idx++) { // do the delta decoding stuff. currentId = currentId + primitivegroup.dense.id[idx]; currentLat = currentLat + primitivegroup.dense.lat[idx]; currentLon = currentLon + primitivegroup.dense.lon[idx]; if (primitivegroup.dense.denseinfo != null) { // add all the metadata. currentChangeset = currentChangeset + primitivegroup.dense.denseinfo.changeset[idx]; currentTimestamp = currentTimestamp + primitivegroup.dense.denseinfo.timestamp[idx]; currentUid = currentUid + primitivegroup.dense.denseinfo.uid[idx]; currentUserSid = currentUserSid + primitivegroup.dense.denseinfo.user_sid[idx]; currentVersion = currentVersion + primitivegroup.dense.denseinfo.version[idx]; } var node = new Node(); node.id = currentId; node.info = new Info(); node.info.changeset = currentChangeset; node.info.timestamp = (int)currentTimestamp; node.info.uid = currentUid; node.info.user_sid = currentUserSid; node.info.version = currentVersion; node.lat = currentLat; node.lon = currentLon; // get the keys/vals. var keyVals = primitivegroup.dense.keys_vals; while (keyVals.Count > keyValsIdx && keyVals[keyValsIdx] != 0) { node.keys.Add((uint)keyVals[keyValsIdx]); keyValsIdx++; node.vals.Add((uint)keyVals[keyValsIdx]); keyValsIdx++; } keyValsIdx++; success = true; primitivesConsumer.ProcessNode(block, node); } } else { if (!ignoreNodes && primitivegroup.nodes != null) { foreach (var node in primitivegroup.nodes) { success = true; primitivesConsumer.ProcessNode(block, node); } } if (!ignoreWays && primitivegroup.ways != null) { foreach (var way in primitivegroup.ways) { success = true; primitivesConsumer.ProcessWay(block, way); } } if (!ignoreRelations && primitivegroup.relations != null) { foreach (var relation in primitivegroup.relations) { success = true; primitivesConsumer.ProcessRelation(block, relation); } } } } } return success; }
/// <summary> /// Creates a decompressor. /// </summary> internal Decompressor(IPBFOsmPrimitiveConsumer primitives_consumer) { _primitives_consumer = primitives_consumer; }
public static bool Decode(this PrimitiveBlock block, IPBFOsmPrimitiveConsumer primitivesConsumer, bool ignoreNodes, bool ignoreWays, bool ignoreRelations) { bool flag = false; if (block.primitivegroup != null) { foreach (PrimitiveGroup primitiveGroup in block.primitivegroup) { if (!ignoreNodes && primitiveGroup.dense != null) { int index1 = 0; long num1 = 0; long num2 = 0; long num3 = 0; long num4 = 0; long num5 = 0; int num6 = 0; int num7 = 0; int num8 = 0; for (int index2 = 0; index2 < primitiveGroup.dense.id.Count; ++index2) { num1 += primitiveGroup.dense.id[index2]; num2 += primitiveGroup.dense.lat[index2]; num3 += primitiveGroup.dense.lon[index2]; if (primitiveGroup.dense.denseinfo != null) { num4 += primitiveGroup.dense.denseinfo.changeset[index2]; num5 += primitiveGroup.dense.denseinfo.timestamp[index2]; num6 += primitiveGroup.dense.denseinfo.uid[index2]; num7 += primitiveGroup.dense.denseinfo.user_sid[index2]; num8 += primitiveGroup.dense.denseinfo.version[index2]; } Node node = new Node(); node.id = num1; node.info = new Info(); node.info.changeset = num4; node.info.timestamp = (int)num5; node.info.uid = num6; node.info.user_sid = num7; node.info.version = num8; node.lat = num2; node.lon = num3; int index3; for (List <int> keysVals = primitiveGroup.dense.keys_vals; keysVals.Count > index1 && keysVals[index1] != 0; index1 = index3 + 1) { node.keys.Add((uint)keysVals[index1]); index3 = index1 + 1; node.vals.Add((uint)keysVals[index3]); } ++index1; flag = true; primitivesConsumer.ProcessNode(block, node); } } else { if (!ignoreNodes && primitiveGroup.nodes != null) { foreach (Node node in primitiveGroup.nodes) { flag = true; primitivesConsumer.ProcessNode(block, node); } } if (!ignoreWays && primitiveGroup.ways != null) { foreach (Way way in primitiveGroup.ways) { flag = true; primitivesConsumer.ProcessWay(block, way); } } if (!ignoreRelations && primitiveGroup.relations != null) { foreach (Relation relation in primitiveGroup.relations) { flag = true; primitivesConsumer.ProcessRelation(block, relation); } } } } } return(flag); }