SQL Server 2008空间数据应用系列十一:Bing Maps中呈现GeoRSS订阅的空间数据
友情提示,您閱讀本篇博文的先決條件如下:
1、本文示例基于Microsoft SQL Server 2008 R2調(diào)測。
2、具備 Transact-SQL 編程經(jīng)驗和使用 SQL Server Management Studio 的經(jīng)驗。
3、熟悉或了解Microsoft SQL Server 2008中的空間數(shù)據(jù)類型。
4、具備相應(yīng)(比如OGC規(guī)范、KML規(guī)范)的GIS專業(yè)理論知識。
5、GeoRss訂閱技術(shù)以及其他相關(guān)知識。
?
?
?
GeoRSS是一種描述和查明互聯(lián)網(wǎng)內(nèi)容所在物理位置的方法。通過使用GeoRSS,搜索Web站點或者與地理位置有關(guān)的項目就成為可能。GeoRSS利用地理標識語言(GML),即利用可擴展標記語言 (Extensible Markup Language, XML)存儲和傳輸?shù)乩頂?shù)據(jù)的方法。原始的GML模型以由World Wide Web聯(lián)盟(W3C)所開發(fā)的資源描述框架(RDF)為基礎(chǔ)。GML保持著RDF的許多特性,包括智能代理和一個用于描述和查詢數(shù)據(jù)的標準語法。
GeoRSS 是在 RSS 訂閱源中包含地理空間數(shù)據(jù)時所用的一個標準,它定義了一種名為 GeoRSS GML 的特定格式,用來在訂閱源中包含 GML 格式的數(shù)據(jù)??蛻舳藨?yīng)用程序可以訂閱 GeoRSS 訂閱源,訂閱方式與訂閱常規(guī) RSS 訂閱源相同??梢暂p松地將 GeoRSS 格式的數(shù)據(jù)導(dǎo)入Microsoft Bing Maps、Google Maps中,同樣也可以將空間數(shù)據(jù)庫中的空間數(shù)據(jù)發(fā)布為GeoRss訂閱后快速的在GIS中呈現(xiàn),本篇將介紹如何基于微軟Bing Maps for Silverlight中呈現(xiàn)GeoRss訂閱的空間數(shù)據(jù)。
?
一、發(fā)布空間數(shù)據(jù)到GeoRss
?前一篇文章《SQL Server 2008空間數(shù)據(jù)應(yīng)用系列十:使用存儲過程生成GeoRSS聚合空間信息》介紹了如何將空間數(shù)據(jù)通過存儲過程+HTTP請求接口發(fā)布為GeoRss的具體實現(xiàn),這里就一筆帶過,詳細請查閱上篇博文。
?
二、創(chuàng)建GeoRss閱讀器
創(chuàng)建GeoRss閱讀器的目的是為了動態(tài)的請求GeoRss地址,將GeoRss數(shù)據(jù)解析為自己想要的數(shù)據(jù)結(jié)構(gòu),如下便是根據(jù)自己的需求結(jié)合GeoRss定義的一種數(shù)據(jù)結(jié)構(gòu)樣例。 核心原理就是使用WebClient動態(tài)的發(fā)起http請求,將返回的GeoRss數(shù)據(jù)通過Linq To XML的方式解析為對象結(jié)構(gòu)的數(shù)據(jù)。其實現(xiàn)非常簡單,不做具體分析,詳細代碼如下所示:
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;?}
????}
}
?
?
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<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呈現(xiàn)GeoRss數(shù)據(jù)
引入Bing Maps Silverlight Control的控件庫,定義一個專門的MapLayer圖層來呈現(xiàn)GeoRss數(shù)據(jù),其Silverlight前臺的代碼如下。
?
<Grid?x:Name="LayoutRoot"?Background="White">????<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>
?
應(yīng)用程序加載的過程中使用上面所開發(fā)完成的GeoRss閱讀器進行數(shù)據(jù)讀取并解析,隨后將結(jié)果呈現(xiàn)在Bing Maps Silverlight Control的應(yīng)用中。代碼如下:
public?MainPage(){
????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);
????}
}
?
?
四、相關(guān)資料
[1]、數(shù)據(jù)表中使用空間數(shù)據(jù)類型: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 靜態(tài)幾何圖形方法:http://msdn.microsoft.com/zh-cn/library/bb933894.aspx
[5]、Bing Maps開發(fā)系列博文:http://www.cnblogs.com/beniao/archive/2010/01/13/1646446.html
總結(jié)
以上是生活随笔為你收集整理的SQL Server 2008空间数据应用系列十一:Bing Maps中呈现GeoRSS订阅的空间数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转载] 武汉天河机场大巴时刻及路线
- 下一篇: 关于Infobright的一个小TIPS