Пример #1
0
        /// <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);
            }
        }
Пример #2
0
        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);
            }
        }