共計 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 訂閱源相同??梢暂p松地將 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 的數據輸出?!禨QL 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 行業資訊頻道,感謝各位的閱讀!