SQL Server 2008空间数据应用中GeoRSS的用法
创始人
2024-12-20 08:21:51
0次

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


  
      网站或栏目的名称
      网站或栏目的URL地址
      网站或栏目的简要介绍
     
         新闻标题
         新闻的链接地址
         新闻简要介绍
         新闻发布时间
         新闻作者名称
     

     
        ……
      

  


 
  而GeoRSS的XML数据格式和RSS几乎相同,只是在RSS的基础上使用GML扩展了对于地理空间数据的描述信息,如下GeoRSS数据。
  xmlns=""
  xmlns:georss=""
  xmlns:gml=""
  >
 
    urn:uuid:7e8ee974-9181-4eae-ad65-55d29175d942
   
  xmlns:georss="">
  重庆
  重庆坐标
 
    urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a
    2011-3-25 23:35:00
   

summary>
    29.5076372217973 106.489384971208
 

 
  同样的定义一条空间线段,只是使用的GeoRSS编码不同,如下定义了【成都--重庆】的空间线段示例。
30.6666587469201 104.062021177233 29.5076372217973 106.489384971208
 
四、创建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('
  xmlns:georss=""
  xmlns:gml="">

  SQL Server 2008 GeoRSS
  GeoRSS数据描述
  http://www.beginningspatial.com
  {
    for $e in channel/item
    return
   
    { $e/title/text() }
    { $e/description/text() }
    { $e/link/text() }
      { $e/pubDate/text() }
   
      {
        for $child in $e/georss:where/*
        return
        if (fn:local-name($child) = "Point") then  { $child/* }
        else  if (fn:local-name($child) = "LineString") then  { $child/* }
        else  if (fn:local-name($child) = "Polygon") then  { $child/* }
        else  if (fn:local-name($child) = "MultiPoint") then  { $child/* }
        else  if (fn:local-name($child) = "MultiCurve") then  { $child/* }
        else  if (fn:local-name($child) = "MultiSurface") then  { $child/* }
        else  if (fn:local-name($child) = "MultiGeometry") then  { $child/* }
        else  ()
      }
   

 

  }


') 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
{
    ///


    /// 发布SQL Server 2008中的空间数据为GeoRSS。
    ///

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

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...