Example #1
0
    public void MoveRelationsToWays(List <OnlineMapsOSMRelation> relations, Dictionary <string, OnlineMapsOSMWay> ways, Dictionary <string, OnlineMapsOSMNode> nodes)
    {
        List <string> waysInRelation = new List <string>();

        foreach (OnlineMapsOSMRelation relation in relations)
        {
            MoveRelationToWay(relation, ways, waysInRelation, nodes);
        }

        foreach (string id in waysInRelation)
        {
            if (!ways.ContainsKey(id))
            {
                continue;
            }

            OnlineMapsOSMWay way = ways[id];
            way.Dispose();
            ways.Remove(id);
        }

        foreach (KeyValuePair <string, OnlineMapsOSMWay> pair in ways)
        {
            newBuildingsData.Enqueue(new OnlineMapsBuildingsNodeData(pair.Value, nodes));
        }
    }
Example #2
0
    private void OnBuildingRequestComplete(string response)
    {
        osmRequest = null;

        Action action = () =>
        {
            Dictionary <string, OnlineMapsOSMNode> nodes;
            List <OnlineMapsOSMWay>      ways;
            List <OnlineMapsOSMRelation> relations;

            OnlineMapsOSMAPIQuery.ParseOSMResponseFast(response, out nodes, out ways, out relations);

            lock (newBuildingsData)
            {
                List <string> waysInRelation = new List <string>();
                foreach (OnlineMapsOSMRelation relation in relations)
                {
                    if (relation.members.Count == 0)
                    {
                        continue;
                    }

                    OnlineMapsOSMWay way      = new OnlineMapsOSMWay();
                    List <string>    nodeRefs = new List <string>();

                    List <OnlineMapsOSMRelationMember> members = relation.members.Where(m => m.type == "way" && m.role == "outer").ToList();
                    if (members.Count == 0)
                    {
                        continue;
                    }

                    OnlineMapsOSMWay relationWay = GetWayByID(ways, members[0].reference);
                    if (relationWay == null)
                    {
                        continue;
                    }

                    nodeRefs.AddRange(relationWay.nodeRefs);
                    members.RemoveAt(0);

                    while (members.Count > 0)
                    {
                        string lastRef = nodeRefs[nodeRefs.Count - 1];

                        int memberIndex = -1;
                        for (int i = 0; i < members.Count; i++)
                        {
                            OnlineMapsOSMRelationMember member = members[i];
                            OnlineMapsOSMWay            w      = GetWayByID(ways, member.reference);
                            if (w.nodeRefs[0] == lastRef)
                            {
                                nodeRefs.AddRange(w.nodeRefs.Skip(1));
                                memberIndex = i;
                                break;
                            }
                            if (w.nodeRefs[w.nodeRefs.Count - 1] == lastRef)
                            {
                                List <string> refs = w.nodeRefs;
                                refs.Reverse();
                                nodeRefs.AddRange(refs.Skip(1));
                                memberIndex = i;
                                break;
                            }
                        }

                        if (memberIndex != -1)
                        {
                            members.RemoveAt(memberIndex);
                        }
                        else
                        {
                            break;
                        }
                    }

                    waysInRelation.AddRange(relation.members.Select(m => m.reference));
                    way.nodeRefs = nodeRefs;
                    way.id       = relation.id;
                    way.tags     = relation.tags;
                    newBuildingsData.Enqueue(new OnlineMapsBuildingsNodeData(way, nodes));
                }

                ways.RemoveAll(delegate(OnlineMapsOSMWay w)
                {
                    if (waysInRelation.Contains(w.id))
                    {
                        w.Dispose();
                        return(true);
                    }
                    return(false);
                });

                foreach (OnlineMapsOSMWay way in ways)
                {
                    newBuildingsData.Enqueue(new OnlineMapsBuildingsNodeData(way, nodes));
                }
            }

            sendBuildingsReceived = true;
        };

#if !UNITY_WEBGL
        if (map.renderInThread)
        {
            OnlineMapsThreadManager.AddThreadAction(action);
        }
        else
        {
            action();
        }
#else
        action();
#endif

        if (OnRequestComplete != null)
        {
            OnRequestComplete();
        }
    }