Yahoo!ローカルサーチAPIを使って最寄り駅を表示させるアプリを作成します。Yahoo!ローカルサーチAPIで調べることができる場所であれば、最寄りの駅の名称、路線名、駅からの距離(メートル)、徒歩で何分かかるかもわかります。
ローカルサーチAPIを使えばリクエストパラメータ(query)に施設名称やカテゴリー名称などのキーワードを指定して、地域・拠点情報を検索できます。
そこで https://map.yahooapis.jp/search/local/V1/localSearch?query=<調べたい場所>&appid=<あなたのアプリケーションID>のレスポンスを解析すれば各種情報を取得できます。
このような結果が返ってきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 |
<?xml version="1.0" encoding="utf-8"?> <YDF xmlns="http://olp.yahooapis.jp/ydf/1.0" totalResultsReturned="10" totalResultsAvailable="15" firstResultPosition="1"> <ResultInfo> <Count>10</Count> <Total>15</Total> <Start>1</Start> <Status>200</Status> <Description> </Description> <Copyright> </Copyright> <Latency>0.026</Latency> </ResultInfo> <Feature> <Id>09005</Id> <Gid>FRHDTUOuzTw</Gid> <Name>東京タワー水族館</Name> <Geometry> <Type>point</Type> <Coordinates>139.745551943779,35.658616919465985</Coordinates> </Geometry> <Category>水族館</Category> <Description>東京タワー水族館は東京のシンボルである東京タワーの1Fにあり、世界中の美しい魚・珍しい魚を約900種類、5万匹展示する水族館。観賞魚は生息地別に分類・展示してあり、それぞれのコーナーで異なったBGMを流し、音楽と共に地域ごとの魚の違いを見学することができる。館内にはおみやげコーナーがあり、ユニークなことに魚やディスプレー用品も購入することができ、飼育ファンにも興味深い施設だ。もちろんカワイイぬいぐるみなどもあるので、お土産もばっちり。</Description> <Style/> <Property> <Uid>e885f8ff2fcc8dc4500dbb475db9988e26524bc9</Uid> <CassetteId>cd5b7a902ece45051ba05cbb9f064077</CassetteId> <Yomi>トウキョウタワースイゾクカン</Yomi> <Country> JP <Name>日本</Name> </Country> <Address>東京都港区芝公園4‐2‐8 東京タワー1F</Address> <GovernmentCode>13103</GovernmentCode> <AddressMatchingLevel>6</AddressMatchingLevel> <Tel1>03-3433-5111</Tel1> <Genre> 0303003 <Name>水族館</Name> </Genre> <Station> <Id>29341</Id> <SubId>2934101</SubId> <Name>赤羽橋</Name> <Railway>都営大江戸線</Railway> <Exit>赤羽橋口</Exit> <ExitId>16675</ExitId> <Distance>567</Distance> <Time>7</Time> <Geometry> <Type>point</Type> <Coordinates>139.744689,35.654857</Coordinates> </Geometry> </Station> <Station> <Id>22584</Id> <SubId>2258401</SubId> <Name>御成門</Name> <Railway>都営三田線</Railway> <Exit>A1</Exit> <ExitId>3607</ExitId> <Distance>605</Distance> <Time>7</Time> <Geometry> <Type>point</Type> <Coordinates>139.750445,35.659440</Coordinates> </Geometry> </Station> <Station> <Id>22610</Id> <SubId>2261001</SubId> <Name>神谷町</Name> <Railway>東京メトロ日比谷線</Railway> <Exit>1</Exit> <ExitId>3707</ExitId> <Distance>630</Distance> <Time>7</Time> <Geometry> <Type>point</Type> <Coordinates>139.744843,35.662532</Coordinates> </Geometry> </Station> <Access1>電車 JR山手線・京浜東北線:浜松町駅から徒歩15分/東京メトロ日比谷線:神谷町駅から徒歩6分/都営大江戸線:赤羽橋駅から徒歩5分/都営三田線:御成門駅から徒歩6分/都営浅草線:大門駅から徒歩10分/都営バス:東京駅→等々力行きタワー前下車/新橋駅→目黒行きタワー前下車/浜松町駅→東京タワー行き 車 首都高速都心環状線:芝公園出口より7分</Access1> <CatchCopy>東京タワー1F。世界中の美しい魚・珍しい魚を約900種類、5万匹展示する水族館</CatchCopy> <LeadImage>http://park.tachikawaonline.jp/aquarium/22_tower/1.jpg</LeadImage> <SmartPhoneCouponFlag>false</SmartPhoneCouponFlag> <KeepCount>39</KeepCount> </Property> </Feature> <Feature> ・・・他にもたくさんあるが省略 </Feature> </YDF> |
このように多くの情報が取得できますが、今回は最寄り駅に関する情報だけ取得します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
public partial class Form1 : Form { public Form1() { InitializeComponent(); } const string AppKey = "アプリケーションIDの取得は各自でお願いします"; private void button1_Click(object sender, EventArgs e) { string xmlText = GetResponseXml(textBox1.Text); System.Xml.XmlDocument xmlDoc = new System.Xml.XmlDocument(); xmlDoc.LoadXml(xmlText); var featureNodes = xmlDoc.SelectNodes("//*[local-name()='Feature']"); StringBuilder sb = new StringBuilder(); foreach(System.Xml.XmlNode featureNode in featureNodes) { string placeName = GetPlaceName(featureNode); sb.Append(placeName + "\n\n"); System.Xml.XmlDocument xmlDoc1 = new System.Xml.XmlDocument(); xmlDoc.LoadXml(featureNode.OuterXml); var stationNodes = xmlDoc.SelectNodes("//*[local-name()='Station']"); foreach(System.Xml.XmlNode node in stationNodes) { string stationName = "", railway = "", distance = "", time = ""; GetStationInfo(node, ref stationName, ref railway, ref distance, ref time); string str = String.Format("最寄りの駅:{0}\n路線名:{1}\n駅からの距離:{2}メートル\n徒歩で{3}分\n", stationName, railway, distance, time); sb.Append(str + "\n"); } sb.Append("\n"); } richTextBox1.Text = sb.ToString(); } } |
まずリクエストをするためのurlを作成します。urlは、https://map.yahooapis.jp/search/local/V1/localSearch?query=<調べたい場所>&appid=<あなたのアプリケーションID>ですが、調べたい場所はエンコードしなければなりません。System.Web.dllを参照設定に追加してHttpUtility.UrlEncodeメソッドでエンコードします。そしてレスポンスが返されたらこれを取得します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
public partial class Form1 : Form { string GetResponseXml(string placeName) { // HttpUtilityクラスを使用するには、System.Web.dllを参照設定に追加 string enc = System.Web.HttpUtility.UrlEncode(placeName); string url = "https://map.yahooapis.jp/search/local/V1/localSearch?query=" + enc + "&appid=" + AppKey; string htmlText = ""; System.Net.WebRequest req = System.Net.WebRequest.Create(url); using(System.Net.WebResponse res = req.GetResponse()) using(System.IO.Stream stream = res.GetResponseStream()) using(System.IO.StreamReader sr = new System.IO.StreamReader(stream)) { htmlText = sr.ReadToEnd(); } return htmlText; } } |
XMLが返されたら、これを解析します。上記のレスポンスをみてみると複数の<Feature>~</Feature>が存在するので、XPathを使ってまずこれを取得します。そのあとforeach文のなかで<Feature>~</Feature>のなかにある<Name>~</Name>と<Station>~</Station>を取得します。
<Name>~</Name>はGetPlaceName(XmlNode featureNode)メソッドで取得しています。<Station>~</Station>はvoid GetStationInfo(XmlNode node, ref string stationName, ref string railway, ref string distance, ref string time)メソッドで取得しています。
取得された文字列を連結させ、その結果をテキストボックスに表示させています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
public partial class Form1 : Form { string GetPlaceName(System.Xml.XmlNode featureNode) { string xmlText = featureNode.OuterXml; System.Xml.XmlDocument xmlDoc1 = new System.Xml.XmlDocument(); xmlDoc1.LoadXml(xmlText); System.Xml.XmlNode nameNode = xmlDoc1.SelectSingleNode("//*[local-name()='Name']"); if(nameNode != null) return nameNode.InnerText; else return ""; } void GetStationInfo(System.Xml.XmlNode node, ref string stationName, ref string railway, ref string distance, ref string time) { string xmlText = node.OuterXml; System.Xml.XmlDocument xmlDoc1 = new System.Xml.XmlDocument(); xmlDoc1.LoadXml(xmlText); System.Xml.XmlNode nameNode = xmlDoc1.SelectSingleNode("//*[local-name()='Name']"); System.Xml.XmlNode railwayNode = xmlDoc1.SelectSingleNode("//*[local-name()='Railway']"); System.Xml.XmlNode distanceNode = xmlDoc1.SelectSingleNode("//*[local-name()='Distance']"); System.Xml.XmlNode timeNode = xmlDoc1.SelectSingleNode("//*[local-name()='Time']"); stationName = railway = distance = time = ""; if(nameNode != null) stationName = nameNode.InnerText; if(railwayNode != null) railway = railwayNode.InnerText; if(distanceNode != null) distance = distanceNode.InnerText; if(timeNode != null) time = timeNode.InnerText; } } |