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 System.Collections.Generic;
using Microsoft.Maps.MapControl;
namespace GeoRss.Map.GeoRssUtils
{
    
public class GeoRssItem
    {
        
public string Title { getset; }
        
public string Description { getset; }
        
public string Link { getset; }
        
public string PubData { getset; }
        
public LocationCollection Locatios { getset; }
    }
}

 

 

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 { getset; }

        
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前台的代码如下。

  

 

<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>

 

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

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);

    }
}

 

        

 

四、相关资料

  [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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/404937.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

聚类算法的分类整理

1、基于划分的聚类算法 基于划分的聚类算法 主要通过聚类中心的迭代重置&#xff0c;直到达到“簇内点足够近&#xff0c;簇间点足够远”的目标效果&#xff0c;完成样本集的最优化分。其算法优点是时间、空间复杂度低&#xff0c;可以处理大规模数据集。缺点包括容易陷入局部…

[react] 为什么标签里的for要写成htmlFor呢?

[react] 为什么标签里的for要写成htmlFor呢&#xff1f; 为了区别和html自身标签中属性 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

minGW64安装和使用 极简教程

1、下载minGW64 官网下载&#xff1a;https://sourceforge.net/projects/mingw-w64/files/mingw-w64/mingw-w64-release/我的FTP&#xff1a;a、minGW64 install.exe b、解压免安装版 2、解压 3、添加环境变量 4、CMD 运行gcc 安装完成。 5、使用minGW编译C源码 6、运行

培训总结2

今天&#xff0c;我学习了工具类java.util.包中的几个平时经常用到的几个类&#xff0c;例如ArrayList、HashMap、Hashtable等几个类&#xff0c;在这我总结一下ArrayList的用法。 特征&#xff1a;允许null在内的所有元素&#xff0c;大致上等同于Vector类&#xff0c;但是他是…

GWT 开发入门

From: http://home.cnblogs.com/group/topic/47694.html 在使用GWT开发web程序时&#xff0c;首先得到GWT下载其SDK&#xff0c;目前的最新版为GWT 2.3。 安装插件&#xff0c;目前两大Java IDE&#xff1a; Eclipse 和 NetBeans都有其开发插件&#xff0c;建议使用Eclipse &…

[C#反编译教程]001.Reflector.NET反编译工具 v8.5绿色版+注册机+注册教程

截图 下载地址 Reflector.NET反编译工具 v8.5绿色版注册机 下载地址&#xff1a;http://pan.baidu.com/s/1mgN1Cpi 密码&#xff1a;mx19 简介 .NET Reflector是一个类浏览器和反编译器&#xff0c;.NET Reflector可以分析程序集并向你展示它的所有秘密。.NET 框架向全世界引入…

[react] 函数式组件有没有生命周期?为什么?

[react] 函数式组件有没有生命周期&#xff1f;为什么&#xff1f; 没有生命周期 因为他没有继承React.Component 所以也不需要render() 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌…

openOCD安装 极简教程

1、下载openOCD 官网下载&#xff1a;https://gnutoolchains.com/arm-eabi/openocd/我的FTP&#xff1a;openOCD 2、解压 3、添加环境变量 ->path 4、CMD运行openOCD 安装完成。

一起谈.NET技术,.NET4.0 之 Dynamic VS Reflection 效率

在我先前的文章中&#xff0c;不断的推广.NET4.0新特性。特别是.NET4.0 Dynamic 这个新特性。随之而来的问题也出现了—Dynamic 执行效率如何&#xff1f; 我们做开发的不光需要代码简洁&#xff0c;能够希望自己能够写出好的架构。还有一点非常重要的就是&#xff0c;我们的写…

在windows下写makefile编译代码

From: http://blog.163.com/xjming487126/blog/static/212951352007625114849843/ 在windows下写makefile编译代码 1.下载minGW 下载MinGW-5.0.0.exe&#xff0c;选择全安装。将minGW安装到F:\MinGW目录下。安装后将直接生成MSYS。运行MSYS即进入了一个linux模拟环境。如果是…

Javascript中函数声明与函数表达式的不同

定义函数的方式有两种&#xff1a;一种是函数声明&#xff0c;另一种是函数表达式。 函数声明的语法如下&#xff1a; 1 function functionName(arg0,arg1,arg2){ 2 //函数体 3 } 函数表达式的语法如下&#xff1a; 1 var functionName function(arg0,arg1,arg2){ 2 //函数…

arm-none-eabi-gcc 嵌入式交叉编译器安装 极简教程

1、下载arm-none-eabi-gcc win10 官网下载&#xff1a;https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads我的FTP&#xff1a;arm-none-eabo-gcc 2、解压 3、添加环境变量 4、CMD运行 安装完毕&#xff0c…

[react] 路由切换时同一组件无法重新渲染的有什么方法可以解决?

[react] 路由切换时同一组件无法重新渲染的有什么方法可以解决&#xff1f; componentWillReceiveProps 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

Oracle:使用ASM自动存储管理, 严重推荐

ASM 是Oracle 公司推出的专门用于oracle数据库系统的一种数据存储解决方案. 类似于OS的 软RAID,不过其在系统构架中的层次比较特殊,是直接服务于上层软件(asm)应用的,可以理解为 上下横跨 {硬件分区RAIDOS卷管理OS文件系统}的复合产物. 因其精简和优化了存储系统构架的实现,因而…

Ruby 的环境搭建及安装

上面粗略的介绍了下Ruby&#xff0c;本来不想安装这个的&#xff0c;原因是我是通过网站学习的&#xff0c;可在线编译。不过考虑到内容的全面性&#xff0c;还是尝试下。 参考了下别人的安装&#xff0c;try 一try. 首先因为我是windows 7 &#xff0c;所以就下在相关的版本。…

vscode openOCD 配置Jlink 下载和调试STM32 教程

1、修改openOCD 的配置文件jlink.cfg 由于手头上的jlink 是swd接口&#xff0c;需要将openOCD的jlink.cfg修改&#xff0c;指定接口类型为swd。这里直接复制一份&#xff0c;然后修改&#xff0c;jlink-swd.cfg内容如下&#xff1a; adapter driver jlink transport select s…

[react] 组件卸载前,加在DOM元素的监听事件和定时器要不要手动清除?为什么?

[react] 组件卸载前&#xff0c;加在DOM元素的监听事件和定时器要不要手动清除&#xff1f;为什么&#xff1f; 定时器要在 componentWillUnmount 手动清除&#xff0c;直接绑定在JSX里的事件监听器不用&#xff0c;使用ref绑定的要清除 因为如果不清除定时器&#xff0c;组件…

Ansi、Unicode、UTF8字符串之间的转换和写入文本文件

转载请注明出处http://www.cppblog.com/greatws/archive/2008/08/31/60546.html 最近有人问我关于这个的问题&#xff0c;就此写一篇blog Ansi字符串我们最熟悉&#xff0c;英文占一个字节&#xff0c;汉字2个字节&#xff0c;以一个\0结尾&#xff0c;常用于txt文本文件 Uni…

小女也爱c#(3)--俄罗斯方块练习数组

学完c了&#xff0c;总算是有点收获了&#xff0c;自己写了个俄罗斯方块练习数组&#xff0c;在vc6.0控制台环境下编译通过. makehead.h int Makepanel(char Ary_Panel[][10]);void gotoxy(int x, int y);void BrushsScreen(char ary[][20]);int initializationShape();void Sh…

放松时刻——C#分割字符串

让我们来练习一下字符串的分割~把话倒过来说&#xff1a; private void change_button_Click(object sender, EventArgs e) {var after_text before_TextBox.Text?.Select(x>x.ToString()).ToArray();string result "";for (int i after_text.Length - 1; i &…