Example #1
0
    private void OnBuildingRequestSuccess(OnlineMapsTextWebService request)
    {
        string response = request.response;

        if (response.Length < 300)
        {
            if (OnRequestFailed != null)
            {
                try
                {
                    OnRequestFailed();
                }
                catch
                {
                }
            }
            return;
        }

        LoadBuildingsFromOSM(response);

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

        osmRequest = null;
    }
    private void OnBuildingRequestComplete(string response)
    {
        Action action = () =>
        {
            Dictionary <string, OnlineMapsOSMNode> nodes;
            List <OnlineMapsOSMWay>      ways;
            List <OnlineMapsOSMRelation> relations;

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

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

            sendBuildingsReceived = true;
        };

#if !UNITY_WEBGL
        OnlineMapsThreadManager.AddThreadAction(action);
#else
        action();
#endif

        if (OnRequestComplete != null)
        {
            OnRequestComplete();
        }
    }
    /// <summary>
    /// Query the Open Street Map Overpass API.
    /// </summary>
    /// <param name="data">Overpass QL request</param>
    /// <returns>Instance of the query</returns>
    public static OnlineMapsOSMAPIQuery Find(string data)
    {
        OnlineMapsOSMAPIQuery query = new OnlineMapsOSMAPIQuery(data);

        OnlineMaps.instance.AddGoogleAPIQuery(query);
        return(query);
    }
    public void LoadBuildingsFromOSM(string osmData)
    {
        Action action = () =>
        {
            Dictionary <string, OnlineMapsOSMNode> nodes;
            Dictionary <string, OnlineMapsOSMWay>  ways;
            List <OnlineMapsOSMRelation>           relations;

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

            lock (newBuildingsData)
            {
                MoveRelationsToWays(relations, ways, nodes);
            }

            sendBuildingsReceived = true;
        };

#if !UNITY_WEBGL
        if (map.renderInThread)
        {
            OnlineMapsThreadManager.AddThreadAction(action);
        }
        else
        {
            action();
        }
#else
        action();
#endif
    }
Example #5
0
 private void OnBuildingRequestFailed(OnlineMapsTextWebService request)
 {
     osmRequest = null;
     if (OnRequestFailed != null)
     {
         OnRequestFailed();
     }
 }
Example #6
0
 private void OnDisable()
 {
     RemoveAllBuildings();
     if (osmRequest != null)
     {
         osmRequest.OnComplete = null;
         osmRequest            = null;
     }
     sendBuildingsReceived = false;
     topLeft     = OnlineMapsVector2i.zero;
     bottomRight = OnlineMapsVector2i.zero;
 }
Example #7
0
        private void Start()
        {
            // Get map corners
            Vector2 topLeft     = OnlineMaps.instance.topLeftPosition;
            Vector2 bottomRight = OnlineMaps.instance.bottomRightPosition;

            // Create OSM Overpass request where highway is primary or residential
            string requestData = String.Format("node({0},{1},{2},{3});way(bn)[{4}];(._;>;);out;",
                                               bottomRight.y, topLeft.x, topLeft.y, bottomRight.x, "'highway'~'primary|residential'");

            // Send request and subscribe to complete event
            OnlineMapsOSMAPIQuery.Find(requestData).OnComplete += OnComplete;
        }
Example #8
0
 private void OnBuildingRequestFailed(OnlineMapsTextWebService request)
 {
     if (OnRequestFailed != null)
     {
         try
         {
             OnRequestFailed();
         }
         catch
         {
         }
     }
     osmRequest = null;
 }
Example #9
0
    private void OnBuildingRequestSuccess(OnlineMapsTextWebService request)
    {
        osmRequest = null;

        string response = request.response;

        if (response.Length < 300)
        {
            if (OnRequestFailed != null)
            {
                OnRequestFailed();
            }
            return;
        }

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

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

            lock (newBuildingsData)
            {
                MoveRelationsToWays(relations, ways, nodes);
            }

            sendBuildingsReceived = true;
        };

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

        if (OnRequestComplete != null)
        {
            OnRequestComplete();
        }
    }
Example #10
0
        /// This event called when the request is completed.
        private void OnComplete(string response)
        {
            List <OnlineMapsOSMNode>     nodes;
            List <OnlineMapsOSMWay>      ways;
            List <OnlineMapsOSMRelation> relations;

            // Get nodes, ways and relations from response
            OnlineMapsOSMAPIQuery.ParseOSMResponse(response, out nodes, out ways, out relations);

            foreach (OnlineMapsOSMWay way in ways)
            {
                // Log highway type
                Debug.Log(way.tags.FirstOrDefault(t => t.key == "highway").value);
            }
        }
Example #11
0
    private void SendRequest()
    {
        if (osmRequest != null || string.IsNullOrEmpty(requestData))
        {
            return;
        }

        osmRequest             = OnlineMapsOSMAPIQuery.Find(requestData);
        osmRequest.OnComplete += OnBuildingRequestComplete;
        if (OnRequestSent != null)
        {
            OnRequestSent();
        }
        lastRequestTime = Time.time;
        requestData     = null;
    }
Example #12
0
    private void LoadNewBuildings()
    {
        Vector2 tl = OnlineMapsUtils.TileToLatLong(topLeft, api.zoom);
        Vector2 br = OnlineMapsUtils.TileToLatLong(bottomRight, api.zoom);

        string requestData = String.Format("node({0},{1},{2},{3});way(bn)[{4}];(._;>;);out;", br.y, tl.x, tl.y, br.x, "'building'");

        if (OnPrepareRequest != null)
        {
            requestData = OnPrepareRequest(requestData, tl, br);
        }

        OnlineMapsOSMAPIQuery.Find(requestData).OnComplete += OnBuildingRequestComplete;
        if (OnRequestSent != null)
        {
            OnRequestSent();
        }
    }
    private void OnDisable()
    {
        RemoveAllBuildings();
        if (osmRequest != null)
        {
            osmRequest.OnComplete = null;
            osmRequest            = null;
        }
        sendBuildingsReceived = false;
        topLeft     = OnlineMapsVector2i.zero;
        bottomRight = OnlineMapsVector2i.zero;

        if (map != null)
        {
            map.OnChangePosition  -= OnMapPositionChanged;
            map.OnChangeZoom      -= OnMapZoomChanged;
            map.OnLateUpdateAfter -= OnUpdate;
        }
    }
Example #14
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();
        }
    }
 /// <summary>
 /// Query the Open Street Map Overpass API.
 /// </summary>
 /// <param name="data">Overpass QL request</param>
 /// <returns>Instance of the query</returns>
 public static OnlineMapsOSMAPIQuery Find(string data)
 {
     OnlineMapsOSMAPIQuery query = new OnlineMapsOSMAPIQuery(data);
     OnlineMaps.instance.AddGoogleAPIQuery(query);
     return query;
 }