create every day - 福野泰介の一日一創

5分でできるオリジナル鯖江論手川排水機場水位表示iPhoneアプリ / Swift2入門

2015/11/18 23:55:00
#KidsIT #opendata #swift #sparql 

5分でつくった前回のアプリ、複数の画面を持つタブアプリにして、河川水位を追加します。 今回は、SPARQLを使いますが、コピペするだけなので、とりあえずつくるだけなら簡単です。


前回は、Single View Application を選びましたが、今回は Tabbed Applictaion を選択します。

FirstViewController には、PM2.5を表示する形にして、SecondViewController に鯖江市からリアルタイムオープンデータとして公開されている「論手川排水機場」の水位を表示させましょう。

まずは、超簡単な SPARQL にアクセスするテストを動かしてみます。viewDidLoad 内に、下記を書いて実行してみます。

let sparql = "select * { ?s ?p ?o } limit 10" let base = "http://sparql.odp.jig.jp/data/sparql?output=json&app=dev2&query=" let surl = base + sparql.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())! if let url = NSURL(string: surl) { let session = NSURLSession.sharedSession() let task = session.dataTaskWithURL(url, completionHandler: { (data, response, error) in if let ns = NSString(data: data!, encoding: NSUTF8StringEncoding) { let s = String(ns) print(s) } }) task.resume() }

ポイント
- sparql.odp.jig を前回手順を参考に、アクセスできるようにしておきましょう
- sparql.stringByAdd.. で、URLのパラメータ用に変換しています (例 ? -> %3F)
あとは、前回の通信方法と一緒です。実行すると、JSONという構造化されたデータで結果が返ってきます。

最新の水位データを取得するSPARQLに差し替えて、実行してみましょう。
※SPARQLについて気になったら、SPARQL入門をどうぞ!

let sparql = "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>\n" + "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n" + "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>\n" + "PREFIX dct: <http://purl.org/dc/terms/>\n" + "PREFIX odp: <http://odp.jig.jp/odp/1.0#>\n" + "\n" + "select ?created ?value {\n" + " ?s rdf:next rdf:nil;\n" + " rdf:type odp:WaterLevel;\n" + " <http://schema.org/spatial> <http://odp.jig.jp/jp/fukui/sabae/waterlevelsensor/1>;\n" + " dct:created ?created;\n" + " rdf:value ?value.\n" + "}\n"

返って来たJSONから特定の値を取得するためのコードを、通信後呼び出される completionHandler 内に追加します。

let s = String(ns) print(s) do { let json = try NSJSONSerialization.JSONObjectWithData(data!, options: []) as! [String: AnyObject] if let results = json["results"] as? NSDictionary { if let bindings = results["bindings"] as? NSArray { if let value = bindings[0]["value"] as? NSDictionary { if let value2 = value["value"] as? String { print(value2) dispatch_async(dispatch_get_main_queue()) { self.rmeter.text = value2 + "cm" } } } } } } catch let error as NSError { print("Failed to load: \(error.localizedDescription)") }

ポイント
- NSJSONSerialization というものを使ってJSONデータをプログラムに取り込みます
- if let を使ってツリー構造を順番にほどいていって、目的の値を取得し、表示しています

PM2.5と水位、タブで切り替えて最新データが見られるアプリ「sabaenow」の第一弾のできあがりです。

Swiftを使って、SPARQLでいろいろとデータを取得しアプリがつくれそうな気がしてきましたね!
odp SPARQLコンソールを使って、あれこれクエリーをお試しください!
データをざっと見てみるには、SPARQLKnockerがオススメです。

Swift2入門
- 5分でできるオリジナル鯖江PM2.5濃度表示iPhoneアプリ
- 5分でできるオリジナル鯖江論手川排水機場水位表示iPhoneアプリ

参考図書
- Amazon.co.jp: Swiftではじめる iPhoneアプリ開発の教科書 【Swift 2&Xcode 7対応】【特典PDF付き】 (教科書シリーズ): 森 巧尚: 本
- Amazon.co.jp: オープンデータ時代の標準Web API SPARQL (NextPublishing) 電子書籍: 加藤 文彦, 川島 秀一, 岡別府 陽子, 山本 泰智, 片山 俊明: Kindleストア

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY 福野泰介 - Taisuke Fukuno / @taisukef / high-res profile image