10楼#
发布于:2011-11-28 16:44
<font size="4"> GeoRSS是一种描述和查明互联网内容所在物理位置的方法。通过使用GeoRSS,搜索Web站点或者与地理位置有关的项目就成为可能。GeoRSS利用地理标识语言(GML),即利用可扩展标记语言
(Extensible Markup Language, XML)存储和传输地理数据的方法。原始的GML模型以由World Wide Web联盟(W3C)所开发的资源描述框架(RDF)为基础。GML保持着RDF的许多特性,包括智能代理和一个用于描述和查询数据的标准语法。 <br/> GeoRSS 是在 RSS 订阅源中包含地理空间数据时所用的一个标准,它定义了一种名为 GeoRSS GML 的特定格式,用来在订阅源中包含 GML 格式的数据。客户端应用程序可以订阅 GeoRSS 订阅源,订阅方式与订阅常规 RSS 订阅源相同。可以轻松地将 GeoRSS 格式的数据导入Microsoft Bing Maps、Google Maps中,同样也可以将空间数据库中的空间数据发布为GeoRss订阅后快速的在GIS中呈现,本篇将介绍如何基于微软Bing Maps for Silverlight中呈现GeoRss订阅的空间数据。<br/> <br/> 一、发布空间数据到GeoRss<br/> 前一篇文章《SQL Server 2008空间数据应用系列十:使用存储过程生成GeoRSS聚合空间信息》介绍了如何将空间数据通过存储过程+HTTP请求接口发布为GeoRss的具体实现,这里就一笔带过,详细请查阅上篇博文。<br/> <br/> 二、创建GeoRss阅读器<br/> 创建GeoRss阅读器的目的是为了动态的请求GeoRss地址,将GeoRss数据解析为自己想要的数据结构,如下便是根据自己的需求结合GeoRss定义的一种数据结构样例。<br/> using System.Collections.Generic;<br/>using Microsoft.Maps.MapControl;<br/>namespace GeoRss.Map.GeoRssUtils<br/>{<br/> public class GeoRssItem<br/> {<br/> public string Title { get; set; }<br/> public string Description { get; set; }<br/> public string Link { get; set; }<br/> public string PubData { get; set; }<br/> public LocationCollection Locatios { get; set; }<br/> }<br/>} <br/> 核心原理就是使用WebClient动态的发起http请求,将返回的GeoRss数据通过Linq To XML的方式解析为对象结构的数据。其实现非常简单,不做具体分析,详细代码如下所示:<br/> using System.Collections.Generic;<br/>using System;<br/>using System.Net;<br/>using System.Xml.Linq;<br/>using System.Linq;<br/>using System.Windows;<br/>using Microsoft.Maps.MapControl;<br/>namespace GeoRss.Map.GeoRssUtils<br/>{<br/> public delegate void DownloadGeoRssCompletedEventHandler(List<GeoRssItem> items);<br/><br/> public delegate void DownloadGeoRssExceptionEventHandler(Exception e);<br/><br/> public class GeoRssReader<br/> {<br/> public GeoRssReader()<br/> {<br/> wc = new WebClient();<br/> wc.DownloadStringCompleted += WebClientDownloadGeoRssCompleted;<br/> }<br/><br/> public GeoRssReader(Uri uri)<br/> : this()<br/> {<br/> this.uri = uri;<br/> }<br/><br/> public GeoRssReader(Uri uri, DownloadGeoRssCompletedEventHandler evh)<br/> : this(uri)<br/> {<br/> DownloadGeoRssCompleted += evh;<br/> }<br/><br/> public Uri uri { get; set; }<br/><br/> public event DownloadGeoRssCompletedEventHandler DownloadGeoRssCompleted;<br/> public event DownloadGeoRssExceptionEventHandler DownloadGeoRssException;<br/><br/> public void ReadAsync()<br/> {<br/> if (DownloadGeoRssCompleted.Target != null)<br/> {<br/> wc.DownloadStringAsync(uri);<br/> }<br/> }<br/><br/> #region _private<br/><br/> private readonly WebClient wc;<br/><br/> private void WebClientDownloadGeoRssCompleted(object sender, DownloadStringCompletedEventArgs e)<br/> {<br/> try<br/> {<br/> XNamespace nsXml = "http://www.w3.org/2005/Atom";<br/> XNamespace nsGeorss = "http://www.georss.org/georss";<br/> XNamespace nsGeo = "http://www.w3.org/2003/01/geo/wgs84_pos#";<br/> XNamespace nsMedia = "http://search.yahoo.com/mrss/";<br/><br/> var items = from item in XElement.Parse(e.Result).Descendants("item")<br/> select new GeoRssItem<br/> {<br/> Title = (item.Element("title") != null) ? item.Element("title").Value : null,<br/> Link = (item.Element("link") != null) ? item.Element("link").Value : null,<br/> Description = (item.Element("description") != null) ? item.Element("description").Value : null,<br/> PubData = (item.Element("pubDate") != null) ? item.Element("pubDate").Value : null,<br/> Locatios = ParserLocations(XElement.Parse(item.LastNode.ToString().Replace(":", "X")).Value)<br/> };<br/> <br/><br/> if (DownloadGeoRssCompleted.Method != null)<br/> {<br/> DownloadGeoRssCompleted.Invoke(items.ToList());<br/> }<br/> }<br/> catch (Exception ex)<br/> {<br/> if (DownloadGeoRssException.Method != null)<br/> {<br/> DownloadGeoRssException.Invoke(ex);<br/> }<br/> else<br/> {<br/> throw;<br/> }<br/> }<br/> }<br/><br/> private LocationCollection ParserLocations(string points)<br/> {<br/> LocationCollection lc = new LocationCollection();<br/> string[] ps = points.Split(' ');<br/> for (int i = 0; i < ps.Length; i+=2)<br/> {<br/> lc.Add(new Location(double.Parse(ps), double.Parse(ps[i + 1])));<br/> }<br/> return lc;<br/> }<br/><br/> #endregion<br/><br/> }<br/>} <br/> 三、基于SLBM呈现GeoRss数据<br/> 引入Bing Maps Silverlight Control的控件库,定义一个专门的MapLayer图层来呈现GeoRss数据,其Silverlight前台的代码如下。<br/> <Grid x:Name="LayoutRoot" Background="White"><br/> <map:Map x:Name="map" Margin="0,0,0,0" CredentialsProvider="{StaticResource MyCredentials}" <br/> ScaleVisibility="Visible"<br/> CopyrightVisibility="Collapsed"><br/> <map:MapLayer Name="mlayer"></map:MapLayer><br/> </map:Map><br/></Grid> <br/> 应用程序加载的过程中使用上面所开发完成的GeoRss阅读器进行数据读取并解析,随后将结果呈现在Bing Maps Silverlight Control的应用中。代码如下:<br/> public MainPage()<br/>{<br/> InitializeComponent();<br/><br/> string url = "http://localhost:32484/SHBuildingGeoHandler.ashx";<br/> GeoRssReader reader = new GeoRssReader(new Uri(url, UriKind.RelativeOrAbsolute));<br/> reader.DownloadGeoRssCompleted+=new DownloadGeoRssCompletedEventHandler(reader_DownloadGeoRssCompleted);<br/> reader.ReadAsync();<br/>}<br/><br/>void reader_DownloadGeoRssCompleted(List<GeoRssItem> items)<br/>{<br/> //System.Diagnostics.Debug.WriteLine(items.Count);<br/> foreach (var item in items)<br/> {<br/> MapPolygon mp = new MapPolygon();<br/> mp.Locations = item.Locatios;<br/> mp.Fill = new SolidColorBrush(Colors.Red);<br/> this.mlayer.Children.Add(mp);<br/><br/> }<br/>} <br/> <img border="0" alt="" src="http://images.cnblogs.com/cnblogs_com/beniao/BingMaps/GeoRssBingMaps.jpg" width="644" height="430"/><br/> <br/> 四、相关资料<br/> [1]、数据表中使用空间数据类型:http://www.cnblogs.com/beniao/archive/2011/02/21/1959347.html<br/> [2]、几何实例上的OGC方法:http://msdn.microsoft.com/zh-cn/visualc/bb933960.aspx <br/> [3]、几何图形实例上的扩展方法:http://msdn.microsoft.com/zh-cn/library/bb933880.aspx<br/> [4]、OGC 静态几何图形方法:http://msdn.microsoft.com/zh-cn/library/bb933894.aspx<br/> [5]、Bing Maps开发系列博文:http://www.cnblogs.com/beniao/archive/2010/01/13/1646446.html<br/></font> |
|
|
11楼#
发布于:2011-11-28 16:44
作 者:Beniao
|
|
|
12楼#
发布于:2013-06-05 15:45
多谢楼主!!学习中,谢谢!!
|
|
|
上一页
下一页