/// <summary> /// Encodes an OsmSharp-node into a PBF-node. /// </summary> public static OsmSharp.IO.PBF.Node EncodeNode(PrimitiveBlock block, Dictionary <string, int> reverseStringTable, OsmSharp.IO.PBF.Node pbfNode, OsmSharp.Node node) { pbfNode.id = node.Id.Value; pbfNode.info = new Info(); pbfNode.info.version = 0; if (node.ChangeSetId.HasValue) { pbfNode.info.changeset = node.ChangeSetId.Value; } else { pbfNode.info.changeset = 0; } if (node.TimeStamp.HasValue) { pbfNode.info.timestamp = Encoder.EncodeTimestamp(node.TimeStamp.Value, block.date_granularity); } else { pbfNode.info.timestamp = 0; } if (node.UserId.HasValue) { pbfNode.info.uid = (int)node.UserId.Value; } else { pbfNode.info.uid = 0; } pbfNode.info.user_sid = Encoder.EncodeString(block, reverseStringTable, node.UserName); if (node.Version.HasValue) { pbfNode.info.version = (int)node.Version.Value; } else { pbfNode.info.version = 0; } pbfNode.lat = Encoder.EncodeLatLon(node.Latitude.Value, block.lat_offset, block.granularity); pbfNode.lon = Encoder.EncodeLatLon(node.Longitude.Value, block.lon_offset, block.granularity); if (node.Tags != null) { foreach (var tag in node.Tags) { pbfNode.keys.Add((uint)Encoder.EncodeString(block, reverseStringTable, tag.Key)); pbfNode.vals.Add((uint)Encoder.EncodeString(block, reverseStringTable, tag.Value)); } } else { pbfNode.keys.Clear(); pbfNode.vals.Clear(); } return(pbfNode); }
private static void EncodeDenseNode(PrimitiveBlock block, Dictionary <string, int> reverseStringTable, DenseNodes groupDense, OsmSharp.Node current, OsmSharp.Node previous) { groupDense.id.Add(current.Id.Value - previous.Id.Value); var currentLat = Encoder.EncodeLatLon(current.Latitude.Value, block.lat_offset, block.granularity); var currentLon = Encoder.EncodeLatLon(current.Longitude.Value, block.lon_offset, block.granularity); var previousLat = Encoder.EncodeLatLon(previous.Latitude.Value, block.lat_offset, block.granularity); var previousLon = Encoder.EncodeLatLon(previous.Longitude.Value, block.lon_offset, block.granularity); // Note that the offsets are actually cancelled out by the subtraction below // LatDiff equals (current.Latitude - previous.Latitude) * 100000000 / granularity var latDiff = currentLat - previousLat; var lonDiff = currentLon - previousLon; groupDense.lat.Add(latDiff); groupDense.lon.Add(lonDiff); if (current.Tags != null) { foreach (var nodeTag in current.Tags) { groupDense.keys_vals.Add(Encoder.EncodeString(block, reverseStringTable, nodeTag.Key)); groupDense.keys_vals.Add(Encoder.EncodeString(block, reverseStringTable, nodeTag.Value)); } groupDense.keys_vals.Add(0); } if (groupDense.denseinfo != null) { groupDense.denseinfo.changeset.Add(current.ChangeSetId.Value - previous.ChangeSetId.Value); var currentTimeStamp = Encoder.EncodeTimestamp(current.TimeStamp.Value, block.date_granularity); var previousTimeStamp = previous.TimeStamp == null ? 0 : Encoder.EncodeTimestamp(previous.TimeStamp.Value, block.date_granularity); groupDense.denseinfo.timestamp.Add(currentTimeStamp - previousTimeStamp); groupDense.denseinfo.uid.Add((int)(current.UserId.Value - previous.UserId.Value)); groupDense.denseinfo.version.Add((int)(current.Version.Value - previous.Version.Value)); var previousUserNameId = previous.UserName == null ? 0 : Encoder.EncodeString(block, reverseStringTable, previous.UserName); var currentUserNameId = Encoder.EncodeString(block, reverseStringTable, current.UserName); groupDense.denseinfo.user_sid.Add(currentUserNameId - previousUserNameId); } }