気象情報APIを使ってアプリを作ってみた -Visualizer編-

気象情報APIを使ってアプリを作ってみた -Visualizer編-

#目次
1. 概要
2. Visualizerでアプリケーションを作ろう -画面編-
3. Visualizerでアプリケーションを作ろう -コーディング編-
4. まとめ

#概要
Kony PlatformでYahoo!JAPANデベロッパーネットワークの[__気象情報API__](https://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/weather.html#response_field)を使った各県の降水の有無をお知らせしてくれるWebアプリケーションを作っていきたいと思います。
まずVisualizerで画面を作成し、必要なパラメータを考慮し[Integration Service](https://qiita.com/Kony2/private/4e564da3dec846a9c704)と[Object Service](https://qiita.com/Kony2/private/686346f5283df7794ae1)を作成していきます。本記事ではKony VisualizerにてアプリケーションのUIとフロントエンドのロジックを作っていきます。

#Visualizerでアプリケーションを作ろう -画面編-
ここではまず作成しているアプリケーションのUIを作成していきます。Kony Visualizerでのアプリケーションの作成については下記の記事を参考にしてみてください。
・[基本的なプロパティの説明](https://qiita.com/Kony3/private/2504b1983726a6363dda)
・[Widgetの説明 Part1](https://qiita.com/Kony3/private/e96c69210ef3570946f3)
・[Widgetの説明 Part2](https://qiita.com/Kony_Team/private/2e4f9e77ac8af6f2a919)
・[Widgetの説明 Part3](https://qiita.com/Kony_Team/private/3293efc1fe33893825ec)
・[Widgetの説明 Part4](https://qiita.com/Kony_Team/private/edd2f5daf74c88aa0634)
・[Exercise -Widget編-](https://qiita.com/Kony2/private/7f83a36b12b712b20efa)
・[Exercise -Segment編-](https://qiita.com/Kony_Team/private/6642d176bc914b9eca3f)
作成するアプリのUIはセグメントウィジェットの各行に都道府県の名前が入っており、その都道府県名をクリックするとポップアップが表示され降水の強さを表示するようなものです。今回作成するアプリはYahoo!JAPANデベロッパーネットワークの[__気象情報API__](https://developer.yahoo.co.jp/webapi/map/openlocalplatform/v1/weather.html#response_field)を使用しているので、各都道府県の緯度経度をあらかじめセグメントのマスターデータとして保持しておく必要があります。
下図はVisualizerのEdit画面と完成したWebアプリケーションのスクリーンショットです。
しかしこちらはあくまでサンプルなので、上記の記事と併せて参考にしていただき自分なりのUIを作ってみましょう。
![図16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598032/e9cfef0d-97c3-3f4c-c7a6-274beafb0506.png)
![図17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598032/9698818c-b3bb-2c5b-3500-0857ff84cd48.png)
![図18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598032/6b5b4139-7e0a-35b2-192e-f26238aeebc4.png)
※今回利用するAPIでは緯度経度の情報をリクエストパラメータとして送信する必要があるため、各都道府県の県庁所在地の緯度経度をセグメントのマスターデータに入力して値を保持しています。
![スクリーンショット 2020-03-30 12.28.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598032/99e906f6-d3e0-bae8-74cc-27aac16908ae.png)

#Visualizerでアプリケーションを作ろう -コーディング編-
メインとなる画面のコントローラーにコーディングしていきます。functionの名前はあくまで一例であるので、自分のわかりやすいもの、プロジェクトの命名規則に則ったものを使用しましょう。

・function「__preShow__」

```javascript:preShow
  preShow : function(){
    this.view.flxPopup.isVisible = false;
  }
```
このファンクションにより画面に出ているポップアップを画面遷移時に隠すことができます。

・function「__onRowClick__」

```javascript:onRowClick
  onRowClick : function(){
    var self = this;
    var segInfo = this.view.segWeatherContent.selectedRowItems[0];
    var name = segInfo.lblContent;
    var location = segInfo.lblLocation;
    var date = this.getCurrentDate();//後述
    const headers = {};
    const params = {
      date : date,
      appid : this.APPID,
      coordinates : location,
      past : "0",
      output : "json"
    };   

    //オブジェクトサービスの呼び出し
    CmnUtilObjService.invokeCustom(
      'Weather','getWeather',
      headers,
      params,
      function(results){
        var Rainfall = results.Weather[0].Rainfall;
        kony.print("___"+Rainfall);
        self.weatherCheck(Rainfall);//後述
        self.view.flxPopup.isVisible = true;//ポップアップの表示
      },
      function(err){
        kony.print("____error");
      });
  }
```
「var segInfo」には各都道府県の名前や緯度経度の情報が入っています。
このファンクションによりセグメントの行をクリックした際にObject Serviceを呼び出しています。Object Serviceを呼び出し、疎通が成功すると「function(results)」がコールバックとして呼び出され、疎通が失敗すると「function(err)」が呼び出されます。
また同時にポップアップを表示する処理も行なっています。


・function「__getCurrentDate__」

```javascript:getCurrentDate
  //現在の時刻を取得
  getCurrentDate : function(){
    //YYYYMMDDHHMMに変換
    var nowDate = new Date();
    var year = nowDate.getFullYear();
    var month = ("00" + (nowDate.getMonth()+1)).slice(-2);
    var day = ("00" + nowDate.getDate()).slice(-2);
    var hour = ("00" + nowDate.getHours()).slice(-2);
    var minutes = ("00" + nowDate.getMinutes()).slice(-2);
    var result = year + month + day + hour + minutes;
    return result;
  }
```
このファンクションにより現在の時刻を取得し、またその表示方法を変換しています。
今回利用するAPIのリクエストパラメータの指定が「yyyy/mm/dd/hh/mm」のためです。

・function「__weatherCheck__」

```javascript:weatherCheck
  //降水量に応じて文言変更
  weatherCheck : function(res){
    if(res >= 0.1){
      this.view.lblPopupWeather.text="今は小雨が降っています。";
      kony.print("___rain1");
    }else if(res >= 1.0){
      this.view.lblPopupWeather.text="今は雨が降っています。";
      kony.print("___rain2");
    }else{
      this.view.lblPopupWeather.text="今は雨は降っていません。";
      kony.print("___rain3");
    }
  }
```
このファンクションにより気象情報APIから受け取ったレスポンス値によって、降水量ごとに文言を変更して表示させます。

・fuction「__onClickClose__」

```javascript:onClickClose
  onClickClose : function(){
    this.view.flxPopup.isVisible = false;
  }
```
このファンクションによりポップアップの閉じるボタンをクリックした時にポップアップを閉じます。

これらのファンクションを記載後、動作を行うウィジェットについてアクションを設定する必要があります。
またこれだけではObject Serviceを呼び出すことはできません。function「onRowClick」にあるようにObject Serviceにはそれを呼び出すための専用のモジュール(今回は「CmnUtilObjService」という名前とします)を追加する必要があります。
下図にあるようにVisualizerの左側にあるProjectタブの__Modules__の右クリックメニューから「__New JS module__」を選択しObject Serviceを呼び出すモジュールを作成しましょう。
![図19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598032/f5a120c7-f2af-06ad-a4ff-c52572b189e7.png)
・module「CmnUtilObjService」

```javascript:CmnUtilObjService
const CmnUtilObjService = function () {
  const SERVICE_NAME = "WeatherReport";
  const invokeCustom = function(objectName, verbName, headers, params, onSuccess, onFailure) {
    var serviceType = "online";
    var objSvc = kony.sdk.getCurrentInstance().getObjectService(SERVICE_NAME, {"access": serviceType});
    var dataObject = new kony.sdk.dto.DataObject(objectName);

    // params を dataObjectに追加
    Object.keys(params).forEach(function(key) {
      var val = this[key];
      dataObject.addField(key, val);
    },params);
    var options = {
      "dataObject": dataObject
    };
    objSvc.customVerb(
      verbName,
      options,
      function(results) {
        kony.print("____ customVerb suc : " +  JSON.stringify(results));
        execSuccess(onSuccess, onFailure, results);
      },
      function(err) {
        kony.print("____ customVerb err : " + JSON.stringify(err));
        execFailure(onFailure, err);
      }
    );
  };
  const setCommonParams = function(params) {
    if (!params) {
      params = {};
    }
    // common parameter add
    return params;
  };
  const execSuccess = function(onSuccess, onFailure, results) {
    if (!results) {
      execFailure(onFailure);
    }
    // 成功時コールバック
    if(onSuccess) onSuccess(results);
  };
  const execFailure = function(onFailure, err) {
    // TODO: 共通エラー処理
    // 失敗時コールバック
    if(onFailure) onFailure(err);
  };

  return {
    invokeCustom : invokeCustom,
    setCommonParams : setCommonParams
  };
}();
```
このモジュールの「const SERVICE_NAME」は自分が作成したObject Serviceの名前を入力します。

では実際にビルドして動作するのかを確かめて見ましょう。
ビルド時の注意点として、まずはVisualizerの環境設定、下図の「__Project Settings__」をクリックし__Kony Fabric__タブでの環境選択、下図の「__Kony Fabric__」で自分が作成した__Fabric Apps__の選択を行うことです。
![図20.1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/598032/0e1ef023-8bc3-6fef-bfbd-2b4398b4e1b7.png)
ビルド後、好きな都道府県を選択し、得られた降水の結果と気象情報を調べて得られた結果が同じならば成功です。
※Chromeの場合検証モードを開き、Consoleタブからアプリをクリックした際にAPIとの通信が正常かどうか確認できるので、レスポンスパラメータがどうなっているのか確認を推奨します。

#まとめ
今回は気象情報APIを使用した簡単なサンプルアプリの作成を行いました。
このアプリ作成でKony公式ドキュメントだけではわかりにくかった部分や、落とし穴となり得る部分も見つかりました。しかし通常のWebアプリケーションの作成では画面の構成などもソースコードで書かなければならない上に、複数のプログラミング言語を駆使しなければいけない場面もあると思いますが、Kony PlatformではそれらをGUIベースで設定・作成することができ、使用するプログラミング言語もJavaScriptだけと非常に手軽にアプリ作成ができるツールです。アプリ作成が初めてという方なら尚更Kony Platformでアプリ作成を行う方が楽だと思います。
本記事が皆さんのKony Platformでのアプリ作成の手助けになれば幸いです。
本アプリの完成例はこちらとなります。
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">気象情報アプリ <a href="https://t.co/BmiVWKR5WJ">pic.twitter.com/BmiVWKR5WJ</a></p>&mdash; Kony (@Kony12763790) <a href="https://twitter.com/Kony12763790/status/1244525369182437376?ref_src=twsrc%5Etfw">March 30, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>