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 }
private void OnBuildingRequestFailed(OnlineMapsTextWebService request) { osmRequest = null; if (OnRequestFailed != null) { OnRequestFailed(); } }
private void OnDisable() { RemoveAllBuildings(); if (osmRequest != null) { osmRequest.OnComplete = null; osmRequest = null; } sendBuildingsReceived = false; topLeft = OnlineMapsVector2i.zero; bottomRight = OnlineMapsVector2i.zero; }
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; }
private void OnBuildingRequestFailed(OnlineMapsTextWebService request) { if (OnRequestFailed != null) { try { OnRequestFailed(); } catch { } } osmRequest = null; }
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(); } }
/// 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); } }
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; }
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; } }
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; }