SQL Server 2008空间数据应用系列十:使用存储过程生成GeoRSS聚合空间信息

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介:

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聚合格式

  相信很多朋友多玩过RSS订阅的,其聚合数据的格式以XML方式承载,主要包括头信息和体信息,体信息可能是一项或多项的数据组成。以下为RSS的聚合格式:

<? xml version=“1.0” en coding=“gb2312” ?>  
< rss  version =“2.0”> 
   
<channel >  
      
< title > 网站或栏目的名称 </ title >  
      
< link > 网站或栏目的URL地址 </ link >  
      
< description > 网站或栏目的简要介绍 </ description >  
      
< item >  
         
< title > 新闻标题 </ title >  
         
< link > 新闻的链接地址 </ link >  
         
< description > 新闻简要介绍 </ description >  
         
< pubDate > 新闻发布时间 </ pubDate >  
         
< author > 新闻作者名称 </ author >  
      
</ item >  
      
< item >  
        …… 
       
</ item >  
   
</ channel >  
</ rss >

 

  而GeoRSS的XML数据格式和RSS几乎相同,只是在RSS的基础上使用GML扩展了对于地理空间数据的描述信息,如下GeoRSS数据。

< feed
  
xmlns ="http://www.w3.org/2005/Atom"
  xmlns:georss
="http://www.georss.org/georss"
  xmlns:gml
="http://www.opengis.net/gml"
  
>
  
< entry >
    
< id > urn:uuid:7e8ee974-9181-4eae-ad65-55d29175d942 </ id >
    
< link  href ="http://example.org/entries/1" />
    
< title > Cedarburg Trip </ title >
    
< summary > We went to visit downtown Cedarburg before the
    conference. Had some great sandwiches at Joe's. If you
    haven't been to Cedarburg, Wisconsin, then you haven't
    really experienced the MidWest...
</ summary >
    
< content  type ="html"  src ="http://example.org/entries/1" />
  
</ entry >
  
< entry >
    
< id > urn:uuid:53664db3-4598-45d4-a727-022c6203322e </ id >
    
< link  rel ="related"  href ="http://example.org/entries/1" />
    
< title > Downtown Cedarburg, Wis. </ title >
    
< summary > Went to visit downtown Cedarburg... </ summary >
    
< georss:where >
      
< gml:Point >
        
< gml:pos > 43.296700 -87.98750 </ gml:pos >
      
</ gml:Point >
    
</ georss:where >
  
</ entry >
  
< entry >
    
< id > urn:uuid:2528d1b4-b5a9-415c-be69-f83974e3e6af </ id >
    
< link  rel ="related"  href ="http://example.org/entries/1" />
    
< title > Convention Center </ title >
    
< georss:where >
      
< gml:LineString >
        
< gml:posList > 43.296700 -87.987500 43.3 -88 -44 -89 </ gml:posList >
      
</ gml:LineString >
    
</ georss:where >
  
</ entry >
</ feed >

        

二、GeoRSS空间编码

  通常有三种GeoRSS编码,既简单编码、GML编码和W3C编码。详细请查阅:http://www.georss.org/Encodings

 

  简单编码通常用于定义点、线、多边形等规则的空间数据,GML则通常适用于定义不规则的空间数据,如地市区域。

 

三、定义GeoRSS数据

  定义GeoRSS数据其实主要就是在玩GeoRSS空间编码,知道如何定义点、线、多边形以及不规则的空间图形。如下GeoRSS定义了一个点(重庆)坐标。

<? xml version="1.0" encoding="utf-8" ?>
< feed  xmlns ="http://www.w3.org/2005/Atom"  
  xmlns:georss
="http://www.georss.org/georss" >
  
< title > 重庆 </ title >
  
< subtitle > 重庆坐标 </ subtitle >
  
< link  href ="http://example.org/" />
  
< updated > 2011-3-25 23:34:26 </ updated >
  
< author >
    
< name > Beniao </ name >
    
< email > beniao@live.cn </ email >
  
</ author >
  
< id > urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6 </ id >
  
< entry >
    
< title > ChongQing </ title >
    
< link  href ="http://example.org/2005/09/09/atom01" />
    
< id > urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a </ id >
    
< updated > 2011-3-25 23:35:00 </ updated >
    
< summary > summary>
    
< georss:point > 29.5076372217973 106.489384971208 </ georss:point >
  
</ entry >
</ feed >

 

  同样的定义一条空间线段,只是使用的GeoRSS编码不同,如下定义了【成都--重庆】的空间线段示例。

< georss:line > 30.6666587469201 104.062021177233 29.5076372217973 106.489384971208 </ georss:line >

 

四、创建GeoRSS聚合存储过程

  创建GeoRSS聚合存储过程的作用就是将空间数据格式化为GeoRSS的数据格式,存储过程中实现查询空间数据,转换空间数据为GML后并构造为GeoRSS的数据输出。《SQL Server 2008空间数据应用系列九:使用空间工具(Spatial Tools)导入ESRI格式地图数据》一文中实现了将shp数据导入到SQL Server 2008中,本篇以此数据为例创建存储过程发布GeoRSS。

        

 

USE   [ BingMapsDB ]
GO

SET  ANSI_NULLS  ON
GO
SET  QUOTED_IDENTIFIER  ON
GO
CREATE   PROCEDURE   [ dbo ] . [ CQGeoRSSFeeder ]
AS
BEGIN

SET  NOCOUNT  ON ;

--  定义XML类型变量用于存储GeoRSS内容
DECLARE   @GeoRSS  xml;

WITH  XMLNAMESPACES (
  
' http://www.opengis.net/gml '   AS  gml,
  
' http://www.georss.org/georss '   AS  georss
)
SELECT   @GeoRSS   =
  (
SELECT
    
[ NAME ]   AS  title,
    
[ NAME ]   AS  description,
    
' http://www.beginningspatial.com/ '   +   CAST ( [ ID ]   AS   varchar ( 8 ))  AS  link,
    geom.AsGml() 
AS   [ georss:where ]
  
FROM
    CQ_Region
  
FOR  XML PATH( ' item ' ), ROOT( ' channel ' )
)

/* *
 * 使用XQuery格式化XML结果 
 *
*/
SELECT   @GeoRSS .query( '
<rss version="2.0"
  xmlns:georss="http://www.georss.org/georss"
  xmlns:gml="http://www.opengis.net/gml">
<channel>
  <title>SQL Server 2008 GeoRSS</title>
  <description>GeoRSS数据描述</description>
  <link>http://www.beginningspatial.com</link>
  {
    for $e in channel/item
    return
    <item>
    <title> { $e/title/text() }</title>
    <description> { $e/description/text() }</description>
    <link> { $e/link/text() }</link>
    <pubDate>  { $e/pubDate/text() }</pubDate>
    <georss:where>
      {
        for $child in $e/georss:where/*
        return
        if (fn:local-name($child) = "Point") then  <gml:Point> { $child/* } </gml:Point>
        else  if (fn:local-name($child) = "LineString") then  <gml:LineString> { $child/* } </gml:LineString>
        else  if (fn:local-name($child) = "Polygon") then  <gml:Polygon> { $child/* } </gml:Polygon>
        else  if (fn:local-name($child) = "MultiPoint") then  <gml:MultiPoint> { $child/* } </gml:MultiPoint>
        else  if (fn:local-name($child) = "MultiCurve") then  <gml:MultiCurve> { $child/* } </gml:MultiCurve>
        else  if (fn:local-name($child) = "MultiSurface") then  <gml:MultiSurface> { $child/* } </gml:MultiSurface>
        else  if (fn:local-name($child) = "MultiGeometry") then  <gml:MultiGeometry> { $child/* } </gml:MultiGeometry>
        else  ()
      }
    </georss:where>
  </item>
  }
</channel>
</rss>
' AS  GeoRSSFeed;
end

 

  注:执行该存储过程后的就可以将表中所有的空间数据建立GeoRSS输出,输出内容比较大,这里就不贴XML结果了,随本文末的示例代码一起提供给大家下载。

 

五、.NET发布GeoRSS订阅

  .NET服务端可以通过ASPX、ASHX等方式来发布GeoRSS订阅服务,这一步其实非常简单,就是直接调用上面的存储过程,见数据库中的空间数据以GeoRSS的数据格式输出到客户端呈现即可。以下为详细的代码实现:

using  System;
using  System.Collections.Generic;
using  System.Linq;
using  System.Web;
using  System.Data.SqlClient;

namespace  GeoRSSService
{
    
///   <summary>
    
///  发布SQL Server 2008中的空间数据为GeoRSS。
    
///   </summary>
     public   class  GeoRSSHandler : IHttpHandler
    {
        
public   void  ProcessRequest(HttpContext context)
        {
            context.Response.ContentType 
=   " text/xml " ;
            context.Response.Charset 
=   " iso-8859-1 " ;
            context.Response.CacheControl 
=   " no-cache " ;
            context.Response.Expires 
=   0 ;

            SqlConnection myConn 
=   new  SqlConnection(
                
@" server=.;database=BingMapsDB;uid=sa;pwd=beniao; " );
            myConn.Open();

            
string  myQuery  =   " exec dbo.CQGeoRSSFeeder " ;
            SqlCommand myCMD 
=   new  SqlCommand(myQuery, myConn);
            SqlDataReader myReader 
=  myCMD.ExecuteReader();

            
while  (myReader.Read())
            {
                
// 输出GeoRSS到客户端
                context.Response.Write(myReader[ " GeoRSSFeed " ].ToString());
            }

            myReader.Close();
            myConn.Close();
        }

        
public   bool  IsReusable
        {
            
get
            {
                
return   false ;
            }
        }
    }
}




本文转自 beniao 51CTO博客,原文链接:http://blog.51cto.com/beniao/528539,如需转载请自行联系原作者

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
目录
相关文章
|
13天前
|
SQL 人工智能 算法
【SQL server】玩转SQL server数据库:第二章 关系数据库
【SQL server】玩转SQL server数据库:第二章 关系数据库
52 10
|
1月前
|
SQL 数据库 数据安全/隐私保护
Sql Server数据库Sa密码如何修改
Sql Server数据库Sa密码如何修改
|
23天前
|
SQL
启动mysq异常The server quit without updating PID file [FAILED]sql/data/***.pi根本解决方案
启动mysq异常The server quit without updating PID file [FAILED]sql/data/***.pi根本解决方案
17 0
|
1月前
|
存储 SQL 数据库
sql serve存储过程
sql serve存储过程
14 0
|
13天前
|
SQL 算法 数据库
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
78 6
|
1天前
|
SQL 关系型数据库 MySQL
:“You have an error in your SQL syntax; check the manual that corresponds to your MySQL server versi
:“You have an error in your SQL syntax; check the manual that corresponds to your MySQL server versi
6 0
|
8天前
|
SQL 安全 网络安全
IDEA DataGrip连接sqlserver 提示驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接的解决方法
IDEA DataGrip连接sqlserver 提示驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接的解决方法
19 0
|
12天前
|
SQL 人工智能 自然语言处理
NL2SQL进阶系列(2):DAIL-SQL、DB-GPT开源应用实践详解Text2SQL
NL2SQL进阶系列(2):DAIL-SQL、DB-GPT开源应用实践详解Text2SQL
NL2SQL进阶系列(2):DAIL-SQL、DB-GPT开源应用实践详解Text2SQL
|
13天前
|
SQL 存储 数据挖掘
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
服务器数据恢复环境: 一台安装windows server操作系统的服务器。一组由8块硬盘组建的RAID5,划分LUN供这台服务器使用。 在windows服务器内装有SqlServer数据库。存储空间LUN划分了两个逻辑分区。 服务器故障&初检: 由于未知原因,Sql Server数据库文件丢失,丢失数据涉及到3个库,表的数量有3000左右。数据库文件丢失原因还没有查清楚,也不能确定数据存储位置。 数据库文件丢失后服务器仍处于开机状态,所幸没有大量数据写入。 将raid5中所有磁盘编号后取出,经过硬件工程师检测,没有发现明显的硬件故障。以只读方式将所有磁盘进行扇区级的全盘镜像,镜像完成后将所
数据库数据恢复—RAID5上层Sql Server数据库数据恢复案例
|
17天前
|
SQL 数据安全/隐私保护
SQL Server 2016安装教程
SQL Server 2016安装教程
19 1