SQL Server 2008空间数据应用系列十一:Bing Maps中呈现GeoRSS订阅的空间数据
友情提示,您阅读本篇博文的先决条件如下:
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定义的一种数据结构样例。 核心原理就是使用WebClient动态的发起http请求,将返回的GeoRss数据通过Linq To XML的方式解析为对象结构的数据。其实现非常简单,不做具体分析,详细代码如下所示:
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; }
}
}
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<GeoRssItem> items);
public delegate void DownloadGeoRssExceptionEventHandler(Exception e);
public class GeoR***eader
{
public GeoR***eader()
{
wc = new WebClient();
wc.DownloadStringCompleted += WebClientDownloadGeoRssCompleted;
}
public GeoR***eader(Uri uri)
: this()
{
this.uri = uri;
}
public GeoR***eader(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[i]), double.Parse(ps[i + 1])));
}
return lc;
}
#endregion
}
}
三、基于SLBM呈现GeoRss数据
引入Bing Maps Silverlight Control的控件库,定义一个专门的MapLayer图层来呈现GeoRss数据,其Silverlight前台的代码如下。
<map:Map x:Name="map" Margin="0,0,0,0" CredentialsProvider="{StaticResource MyCredentials}"
ScaleVisibility="Visible"
CopyrightVisibility="Collapsed">
<map:MapLayer Name="mlayer"></map:MapLayer>
</map:Map>
</Grid>
应用程序加载的过程中使用上面所开发完成的GeoRss阅读器进行数据读取并解析,随后将结果呈现在Bing Maps Silverlight Control的应用中。代码如下:
{
InitializeComponent();
string url = "http://localhost:32484/SHBuildingGeoHandler.ashx";
GeoR***eader reader = new GeoR***eader(new Uri(url, UriKind.RelativeOrAbsolute));
reader.DownloadGeoRssCompleted+=new DownloadGeoRssCompletedEventHandler(reader_DownloadGeoRssCompleted);
reader.ReadAsync();
}
void reader_DownloadGeoRssCompleted(List<GeoRssItem> 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);
}
}
四、相关资料
[1]、数据表中使用空间数据类型:http://www.cnblogs.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.cnblogs.com/beniao/archive/2010/01/13/1646446.html
SQL Server 2008空间数据应用系列十一:Bing Maps中呈现GeoRSS订阅的空间数据相关推荐
- SQL Server 2008 数据库同步的两种方式 (发布、订阅)
参考转载: SQL Server 2008 数据库同步的两种方式 (发布.订阅) 使用Sqlserver事务发布实现数据同步 转载于:https://www.cnblogs.com/YangBinCh ...
- 联科教育SQL Server 2008 R2管理系列04:创建表
本节视频介绍了如何在SQL Server服务器上创建表,创建表中最主要的是介绍创建表的结构,表有多少个字段,如何设置主键,唯一键,检查约束,默认值,外键,空值检查等,如何创建一个符合规定的表格. -- ...
- Python实现SQL Server 2008的增删查改+连接过程中出现的问题以及解决方法
Python操作SQL Server 2008需要一个名为pymssql的库,如果没有这个库可以通过在cmd中输入如下命令来安装: pip install pymssql 闲话少说,直接贴代码: # ...
- SQL Server 2008空间数据应用系列七:基于Bing Maps(Silverlight) 的空间数据展现
SQL Server 2008空间数据应用系列七:基于Bing Maps(Silverlight) 的空间数据展现 原文:SQL Server 2008空间数据应用系列七:基于Bing Maps(Si ...
- 详细介绍微软SQL Server 2008
SQL Server 2008是一个重大的产品版本,它推出了许多新的特性和关键的改进,使得它成为至今为止的最强大和最全面的SQL Server版本.这篇文章详细介绍了Microsoft SQL Ser ...
- 微软 Sql Server 2008
详细介绍微软SQL Server 2008 http://dev.yesky.com/264/7681264_4.shtml 2007-11-25 09:00 作者: 戴羽 出处: IT专家网 责任编 ...
- SQL Server 2008 概览(综述及三大新特性,冉冉毅马 译)
译:SQL Server 2008 概览(综述及三大新特性) ==================================== SQL Server 2008 概述 原文:微软网站(链接) 译 ...
- 在SQL Server 2008中配置文件流(FILESTREAM)
SQL Server 2008推出了一个新的特性叫做文件流(FILESTREAM),它使得基于SQL Server的应用程序可以在文件系统中存储非结构化的数据,例如文档.图片.音频.视频等等.文件流主 ...
- 彻底解决SQL SERVER 2008无法远程连接的问题
1.想要彻底解决SQL SERVER 2008无法远程连接的问题必须按照步骤来 一.为 SQL 启用远程连接 1. 单击"开始",依次指向"程序"." ...
最新文章
- 自己封装JSTL 自定义标签
- 如何评价百度造车?字很少,事很大
- java ThreadLocal用法及原理
- JS中map()与forEach()的用法
- 记事本保存的内容被覆盖_记事本的妙用——双击记事本即可关机
- python写货币转换_如何在Python中将货币字符串转换为浮点数?
- NFS搭建openfoam
- uva705--slash maze
- 从业十余年谈谈对dotnet看法与坚持
- getBoundingClientRect说明
- dcom无法在此计算机运行,DCOM遇到错误“无法启动服务,原因可能是已被禁用或与其相关联的设备没有启动”的解决...
- 董小姐尴尬了?被判赔偿奥克斯1.67亿,格力回应已上诉
- 如何在UIimageview里显示一张图片里的某一部分
- JavaWeb学习总结(一)JavaWeb入门与Tomcat
- 平面与网页设计中关于颜色搭配的问题
- php excel库,phpexcel类库下载
- tv.twitch.android,Twitch智能电视客户端
- 尚硅谷 clickHouse
- 公众号500篇文章分类和索引
- 不只是CAD电子签名,设计院电子签章还要有这些!
热门文章
- Spring 2.0.1 与 BEA WebLogic Server 9.2 的集成
- Microsoft Artificial Intelligence Conference(2018.05.21)
- goole机器学习视频链接【学习笔记】
- Linux Socket TCP/IP通信
- JavaScriptSerializer类
- 轻松掌握Ajax.net系列教程二:部署Ajax Control Toolkit
- 熟悉使用ssm框架完成项目
- Python并发编程:多线程-死锁现象与递归锁
- JTextField类(单行文本框)/JPasswordFiel(密码框)/JTextArea(多行文本框)常用方法
- Oracle中Merge into的用法实例讲解