/// <summary> /// Computes a WorldWind URL (as string) /// </summary> /// <param name="ww"></param> /// <returns></returns> public String GotoURL(WorldWindow ww) { WorldWindUri uri = new WorldWindUri(); uri.Latitude = Angle.FromDegrees(this.pn.Lat); uri.Longitude = Angle.FromDegrees(this.pn.Lon); return(uri.ToString()); }
/// <summary> /// Parses a worldwind uri string /// Updated by CM = worldwind://goto/lat=51.41&lon=5.479 /// or worldwind://goto/lat=51.41&lon5.479&view=0.25 /// or /// worldwind://wmsimage=displayname%3Dtestlayer%2526transparency%3D50%2526altitude%3D10000%2526link%3Dhttp%3A%2F%2Fviz.globe.gov%2Fviz-bin%2Fwmt.cgi%3Fservice%3DWMS%26version%3D1.1.1%26request%3DGetMap%26layers%3DRATMAX%26format%3Dimage%2Fpng%26width%3D512%26height%3D512%26bbox%3D-180%2C-90%2C180%2C90%26srs%3DEPSG%3A4326 /// </summary> /// <param name="worldWindUri"></param> /// <returns></returns> public static WorldWindUri Parse(string worldWindUri) { try { WorldWindUri uri = new WorldWindUri(); worldWindUri = worldWindUri.Trim(); uri._preserveCase = worldWindUri; //set our case-sensitive one, hack for worldwind://install= //then continue as before worldWindUri = worldWindUri.ToLower(CultureInfo.InvariantCulture); uri._rawUrl = worldWindUri; if (!worldWindUri.StartsWith(Scheme + "://")) { throw new UriFormatException("Invalid protocol, expected " + Scheme + "://"); } string url = worldWindUri.Replace(Scheme + "://", ""); if (url.Length == 0) { throw new UriFormatException("Incomplete URI"); } //url = url.Replace("///", "!"); // I wanted to allow a sure to split "functions" inside of the url by using "//" string[] functions = url.Split('!'); foreach (string function in functions) { if (function.IndexOf("goto/") == 0) { string functionString = function.Replace("goto/", "").Trim(); string[] functionParameters = functionString.Split('&'); foreach (string curParam in functionParameters) { string[] nv = curParam.Split(new char[] { '=' }, 2); if (nv.Length != 2) { continue; } string key = nv[0].ToLower(); string value = nv[1]; double doubleVal = double.NaN; string urlDecodedValue = HttpUtility.UrlDecode(value); double.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out doubleVal); switch (key.ToLower()) { case "lat": case "latitude": uri.Latitude = Angle.FromDegrees(doubleVal); break; case "lon": case "longitude": uri.Longitude = Angle.FromDegrees(doubleVal); break; case "altitude": case "alt": uri.Altitude = doubleVal; break; case "view": case "viewrange": uri.ViewRange = Angle.FromDegrees(doubleVal); break; // TODO: Decide on URI parameter names case "bank": uri.Bank = Angle.FromDegrees(doubleVal); break; case "dir": case "direction": uri.Direction = Angle.FromDegrees(doubleVal); break; case "tilt": uri.Tilt = Angle.FromDegrees(doubleVal); break; case "world": uri.World = value; break; case "layer": uri.Layer = urlDecodedValue; break; } } } } return(uri); } catch (Exception caught) { throw new UriFormatException("The worldwind:// URI could not be parsed. (The URI used was: " + worldWindUri + " and the error generated was: " + caught.Message + ")"); } }