设为首页 收藏本站
查看: 575|回复: 0

[经验分享] SQL Server 2008空间数据应用系列十二:Bing Maps中呈现GeoRSS订阅的空间数据

[复制链接]

尚未签到

发表于 2015-6-29 13:45:22 | 显示全部楼层 |阅读模式
  友情提示,您阅读本篇博文的先决条件如下:
  1、本文示例基于Microsoft SQL Server 2008 R2调测。
  2、具备 Transact-SQL 编程经验和使用 SQL Server Management Studio 的经验。
  3、熟悉或了解Microsoft SQL Server 2008中的空间数据类型。
  4、具备相应(比如OGC规范、KML规范)的GIS专业理论知识。
  5、GeoRss订阅技术以及其他相关知识。

  
  
    GeoRSS是一种描述和查明互联网内容所在物理位置的方法。通过使用GeoRSS,搜索Web站点或者与地理位置有关的项目就成为可能。GeoRSS利用地理标识语言(GML),即利用可扩展标记语言 (Extensible Markup Language, XML)存储和传输地理数据的方法。原始的GML模型以由World Wide Web联盟(W3C)所开发的资源描述框架(RDF)为基础。GML保持着RDF的许多特性,包括智能代理和一个用于描述和查询数据的标准语法。
  
  GeoRSS 是在 RSS 订阅源中包含地理空间数据时所用的一个标准,它定义了一种名为 GeoRSS GML 的特定格式,用来在订阅源中包含 GML 格式的数据。客户端应用程序可以订阅 GeoRSS 订阅源,订阅方式与订阅常规 RSS 订阅源相同。可以轻松地将 GeoRSS 格式的数据导入Microsoft Bing Maps、Google Maps中,同样也可以将空间数据库中的空间数据发布为GeoRss订阅后快速的在GIS中呈现,本篇将介绍如何基于微软Bing Maps for Silverlight中呈现GeoRss订阅的空间数据。
  
  一、发布空间数据到GeoRss
  前一篇文章《SQL Server 2008空间数据应用系列十:使用存储过程生成GeoRSS聚合空间信息》介绍了如何将空间数据通过存储过程+HTTP请求接口发布为GeoRss的具体实现,这里就一笔带过,详细请查阅上篇博文。
  
  二、创建GeoRss阅读器
    创建GeoRss阅读器的目的是为了动态的请求GeoRss地址,将GeoRss数据解析为自己想要的数据结构,如下便是根据自己的需求结合GeoRss定义的一种数据结构样例。


using System.Collections.Generic;
using Microsoft.Maps.MapControl;
namespace GeoRss.Map.GeoRssUtils
{
    public class GeoRssItem
    {
        public string Title { get; set; }
        public string Description { get; set; }
        public string Link { get; set; }
        public string PubData { get; set; }
        public LocationCollection Locatios { get; set; }
    }
}  
    核心原理就是使用WebClient动态的发起http请求,将返回的GeoRss数据通过Linq To XML的方式解析为对象结构的数据。其实现非常简单,不做具体分析,详细代码如下所示:


using System.Collections.Generic;
using System;
using System.Net;
using System.Xml.Linq;
using System.Linq;
using System.Windows;
using Microsoft.Maps.MapControl;
namespace GeoRss.Map.GeoRssUtils
{
    public delegate void DownloadGeoRssCompletedEventHandler(List items);
    public delegate void DownloadGeoRssExceptionEventHandler(Exception e);
    public class GeoRssReader
    {
        public GeoRssReader()
        {
            wc = new WebClient();
            wc.DownloadStringCompleted += WebClientDownloadGeoRssCompleted;
        }
        public GeoRssReader(Uri uri)
            : this()
        {
            this.uri = uri;
        }
        public GeoRssReader(Uri uri, DownloadGeoRssCompletedEventHandler evh)
            : this(uri)
        {
            DownloadGeoRssCompleted += evh;
        }
        public Uri uri { get; set; }
        public event DownloadGeoRssCompletedEventHandler DownloadGeoRssCompleted;
        public event DownloadGeoRssExceptionEventHandler DownloadGeoRssException;
        public void ReadAsync()
        {
            if (DownloadGeoRssCompleted.Target != null)
            {
                wc.DownloadStringAsync(uri);
            }
        }
        #region _private
        private readonly WebClient wc;
        private void WebClientDownloadGeoRssCompleted(object sender, DownloadStringCompletedEventArgs e)
        {
            try
            {
                XNamespace nsXml = "http://www.w3.org/2005/Atom";
                XNamespace nsGeorss = "http://www.georss.org/georss";
                XNamespace nsGeo = "http://www.w3.org/2003/01/geo/wgs84_pos#";
                XNamespace nsMedia = "http://search.yahoo.com/mrss/";
                var items = from item in XElement.Parse(e.Result).Descendants("item")
                            select new GeoRssItem
                            {
                                Title = (item.Element("title") != null) ? item.Element("title").Value : null,
                                Link = (item.Element("link") != null) ? item.Element("link").Value : null,
                                Description = (item.Element("description") != null) ? item.Element("description").Value : null,
                                PubData = (item.Element("pubDate") != null) ? item.Element("pubDate").Value : null,
                                Locatios = ParserLocations(XElement.Parse(item.LastNode.ToString().Replace(":", "X")).Value)
                            };
                 
                if (DownloadGeoRssCompleted.Method != null)
                {
                    DownloadGeoRssCompleted.Invoke(items.ToList());
                }
            }
            catch (Exception ex)
            {
                if (DownloadGeoRssException.Method != null)
                {
                    DownloadGeoRssException.Invoke(ex);
                }
                else
                {
                    throw;
                }
            }
        }
        private LocationCollection ParserLocations(string points)
        {
            LocationCollection lc = new LocationCollection();
            string[] ps = points.Split(' ');
            for (int i = 0; i < ps.Length; i+=2)
            {
                lc.Add(new Location(double.Parse(ps), double.Parse(ps[i + 1])));
            }
            return lc;
        }
        #endregion
    }
}  
  三、基于SLBM呈现GeoRss数据
    引入Bing Maps Silverlight Control的控件库,定义一个专门的MapLayer图层来呈现GeoRss数据,其Silverlight前台的代码如下。



   
        
   
  
  应用程序加载的过程中使用上面所开发完成的GeoRss阅读器进行数据读取并解析,随后将结果呈现在Bing Maps Silverlight Control的应用中。代码如下:


public MainPage()
{
    InitializeComponent();
    string url = "http://localhost:32484/SHBuildingGeoHandler.ashx";
    GeoRssReader reader = new GeoRssReader(new Uri(url, UriKind.RelativeOrAbsolute));
    reader.DownloadGeoRssCompleted+=new DownloadGeoRssCompletedEventHandler(reader_DownloadGeoRssCompleted);
    reader.ReadAsync();
}
void reader_DownloadGeoRssCompleted(List items)
{
    //System.Diagnostics.Debug.WriteLine(items.Count);
    foreach (var item in items)
    {
        MapPolygon mp = new MapPolygon();
        mp.Locations = item.Locatios;
        mp.Fill = new SolidColorBrush(Colors.Red);
        this.mlayer.Children.Add(mp);
    }
}  
DSC0000.jpg
  
  四、相关资料
  [1]、数据表中使用空间数据类型:http://www.iyunv.com/beniao/archive/2011/02/21/1959347.html
  [2]、几何实例上的OGC方法:http://msdn.microsoft.com/zh-cn/visualc/bb933960.aspx
  [3]、几何图形实例上的扩展方法:http://msdn.microsoft.com/zh-cn/library/bb933880.aspx
  [4]、OGC 静态几何图形方法:http://msdn.microsoft.com/zh-cn/library/bb933894.aspx
  [5]、Bing Maps开发系列博文:http://www.iyunv.com/beniao/archive/2010/01/13/1646446.html
  
DSC0001.gif
  
  版权说明
  本文属原创文章,欢迎转载且注明文章出处,其版权归作者和博客园共有。为了保存作者的创作热情,请在转载后的明显位置标记本文出处。   
  作      者:Beniao
  文章出处:http://beniao.iyunv.com/  或  http://www.iyunv.com/
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-81517-1-1.html 上篇帖子: SQL Server性能调优之执行计划深度剖析 第二节 执行计划第一次实践 下篇帖子: SQL SERVER 查询性能优化——分析事务与锁(三)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表