gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15899
  • QQ491474196
  • 铜币10742枚
  • 威望809点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国铁杆
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>
举报 回复(0) 喜欢(0)     评分
gis
gis
管理员
管理员
  • 注册日期2003-07-16
  • 发帖数15899
  • QQ491474196
  • 铜币10742枚
  • 威望809点
  • 贡献值0点
  • 银元0个
  • GIS帝国居民
  • 帝国沙发管家
  • GIS帝国铁杆
11楼#
发布于:2011-11-28 16:44
 作      者:Beniao
举报 回复(0) 喜欢(0)     评分
liushuo_whu
路人甲
路人甲
  • 注册日期2013-05-18
  • 发帖数1
  • QQ543802360
  • 铜币103枚
  • 威望0点
  • 贡献值0点
  • 银元0个
12楼#
发布于:2013-06-05 15:45
多谢楼主!!学习中,谢谢!!
行云流水,机型所致!!!!!
举报 回复(0) 喜欢(0)     评分
上一页 下一页
游客

返回顶部