使ってみよう! Windows Live SDK/API

第5回 Virtual Earth,VECollection and GeoRSS

この記事を読むのに必要な時間:およそ 6 分

GeoRSSサービスの作成

作成するGeoRSSのサービス内容を考えます。livedoor天気情報では天気予報用に拡張されたRSSフィードが提供されています。このフィードに経緯度の情報を付加したものはどうでしょうか。⁠全国の天気(主要14ヵ所⁠⁠」のRSSを利用してGeoRSSサービスを作成してみましょう。提供されているフィードの各項目の構造は次のようになっています。

<item>
        <title>[ 今日の天気 ] 札幌 - 晴れ - 最高気温14℃ - 4月6日(日)</title>
        <ldWeather:lwws id="4" />
        <link>http://weather.livedoor.com/area/1b/4.html?r=rss</link>
        <date>Sun, 06 Apr 2008 00:00:00 +0900</date>
        <category type="forecast">天気予報</category>
        <day>Sunday</day>
        <telop>晴れ</telop>
        <image>
                <title>晴れ - livedoor 天気情報</title>
                <link>http://weather.livedoor.com/area/1b/4.html?r=rss</link>
                <url>http://image.weather.livedoor.com/img/icon/1.gif</url>
                <width>50</width>
                <height>31</height>
        </image>
        <description>06日(日)の天気は晴れ,最高気温は14℃ 最低気温は2℃でしょう。</description>
        <source url="http://weather.livedoor.com/forecast/rss/1b/4.xml" />
        <pubDate>Sun, 06 Apr 2008 11:00:00 +0900</pubDate>
</item>

まず,拡張された要素に使用されているXMLの名前空間をインポートします。Feed1.vbの先頭に以下を記述します。

Imports <xmlns:ldWeather="http://weather.livedoor.com/ns/rss/2.0">

ここからはCreateFeedメソッドの内容を変更していきます。最初にメソッドの内容を一度すべて削除してから取り掛かります。フィードを抽象的に表すSyndicationFeedオブジェクトを作成し,それをシリアル化するSyndicationFeedFormatterオブジェクトを返すことがCreateFeedメソッドの処理になります。実際には,SyndicationFeedFormatterは抽象クラスのため派生クラスであるAtom10FeedFormatterまたはRss20FeedFormatterオブジェクトを返します。

提供されているフィードには地域を表すIDが付いています(<ldWeather:lwws id="4" />など⁠⁠。そのIDと経緯度を関連付けるコレクションを作成しておきます。

Dim latlongs = New Dictionary(Of String, String)
latlongs.Add("4", "43.062089 141.354507")   ' 札幌
latlongs.Add("11", "42.984906 144.381688")  ' 釧路
latlongs.Add("20", "39.72158 140.115595")   ' 秋田
latlongs.Add("25", "38.269993 140.874038")  ' 仙台
latlongs.Add("50", "37.910211 139.05241")   ' 新潟
latlongs.Add("63", "35.68693 139.701805")   ' 東京
latlongs.Add("72", "36.65225 138.180861")   ' 長野
latlongs.Add("38", "35.180508 136.913896")  ' 名古屋
latlongs.Add("81", "34.695755 135.530262")  ' 大阪
latlongs.Add("107", "33.560315 133.535428") ' 高知
latlongs.Add("90", "34.397225 132.461579")  ' 広島
latlongs.Add("110", "33.607543 130.429516") ' 福岡
latlongs.Add("132", "31.52997 130.604439")  ' 鹿児島
latlongs.Add("136", "26.212319 127.685938") ' 那覇

次にRSSフィードのURLからXMLドキュメントの作成とSyndicationFeedオブジェクトを生成します。フィードに含まれる各項目を表すSyndicationItemオブジェクトを格納するコレクションも作成します。

Dim doc = XDocument.Load("http://weather.livedoor.com/forecast/rss/index.xml")
Dim feed = New SyndicationFeed("Weather GeoRSS", "", Nothing)
Dim items = New List(Of SyndicationItem)

XMLドキュメントから各<item>要素を取得します。<category>要素の値が⁠PR⁠の場合,天気情報が含まれていませんので処理を飛ばします。

For Each e In doc...<item>
    If e.<category>.Value = "PR" Then
        Continue For
    End If
    ' ここにSyndicationItemオブジェクト作成する処理を記述
Next

SyndicationItemクラスのコンストラクタには,項目のタイトル・説明・リンクを指定できます。基本的にはフィードの値をそのまま使用していますが,GeoRSSを取得したときに利用できるように説明の中に画像のURLを含めています。

Dim item = New SyndicationItem(e.<title>.Value, _
                               e.<description>.Value & e.<image>.<url>.Value, _
                               New Uri(e.<link>.Value))
item.PublishDate = New DateTimeOffset(DateTime.Parse(e.<pubDate>.Value))

<georss:point>のようにSyndicationItemの要素として用意されてないものを追加する場合は,ElementExtensionsプロパティを使います。作成したSyndicationItemオブジェクトをコレクションに追加してForループ内の処理は完了です。

Dim id = e.<ldWeather:lwws>.@id
Dim point = <georss:point xmlns:georss="http://www.georss.org/georss">
                <%= latlongs(id) %></georss:point>
item.ElementExtensions.Add(point)

items.Add(item) ' コレクションへ追加

最後にURLのパラメータに応じてAtomまたはRSS用のSyndicationFeedFormatterオブジェクトを返します。

Dim query As String = WebOperationContext.Current.IncomingRequest.UriTemplateMatch.QueryParameters.Get("format")
If (query = "atom") Then
    Return New Atom10FeedFormatter(feed)
Else
    Return New Rss20FeedFormatter(feed)
End If

以上でGeoRSSサービスの完成です。実行してフィードが表示されたでしょうか? 上記のコードをまとめたものは以下のファイル(Feed1.vb)をダウンロードして確認してください。

著者プロフィール

松江祐輔(まつえゆうすけ)

日本システムウエア株式会社 勤務。現在,ハードウェア設計・検証業務を担当。大学生・大学院生時代はベンチャー企業 有限会社ミレニアムシステムズにプログラマーとして従事。趣味はプログラミング。好きな言語はVisual Basic。Microsoft MVP for Windows Live Platform(Jul 2010 - Jun 2011),Windows Live(Jul 2011 - Jun 2013)。

URL:http://katamari.jp