共计 5332 个字符,预计需要花费 14 分钟才能阅读完成。
SQL Server 2008 空间数据应用中 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 聚合格式
相信很多朋友多玩过 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
hellip; hellip;
/item
/channel
/rss
而 GeoRSS 的 XML 数据格式和 RSS 几乎相同,只是在 RSS 的基础上使用 GML 扩展了对于地理空间数据的描述信息,如下 GeoRSS 数据。
feed
xmlns=
xmlns:georss=
xmlns:gml=
entry
id urn:uuid:7e8ee974-9181-4eae-ad65-55d29175d942 /id
link href=
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=
/entry
entry
id urn:uuid:53664db3-4598-45d4-a727-022c6203322e /id
link rel= related href=
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=
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 编码。详细请查阅:。
简单编码通常用于定义点、线、多边形等规则的空间数据,GML 则通常适用于定义不规则的空间数据,如地市区域。
三、定义 GeoRSS 数据
定义 GeoRSS 数据其实主要就是在玩 GeoRSS 空间编码,知道如何定义点、线、多边形以及不规则的空间图形。如下 GeoRSS 定义了一个点(重庆)坐标。
?xml version= 1.0 encoding= utf-8 ?
feed xmlns=
xmlns:georss=
title 重庆 /title
subtitle 重庆坐标 /subtitle
link href=
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=
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=
xmlns: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;
}
}
}
}
看完上述内容,你们掌握 SQL Server 2008 空间数据应用中 GeoRSS 的用法的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注丸趣 TV 行业资讯频道,感谢各位的阅读!