Exemplo n.º 1
0
        /// <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);
        }
Exemplo n.º 2
0
        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);
            }
        }