SlideShare una empresa de Scribd logo
1 de 25
Descargar para leer sin conexión
位置情報と連携したアプリ開発

              http://www.flickr.com/photos/normanbleventhalmapcenter/2674845313/

12年1月22日日曜日
今回の狙い
  ✤   位置情報と連携したアプリ開発
      を通じてMapViewの使い方に
      ついて学びます
  ✤   今回作るアプリをベースにし
      て、次回各自でオリジナル機能
      の実装にチャレンジしてもらい
      たいと考えてます




                         http://www.flickr.com/photos/alanant/4483533096/

12年1月22日日曜日
今回作るアプリのイメージ

  ✤   過去の勉強会で取り上げたTableView
      の機能を使ってお店の一覧情報を表示
  ✤   今回説明するMapView機能も活用し、
      お店の情報をクリックしたら該当する
      場所の地図を表示するアプリを作成




12年1月22日日曜日
はじめに位置情報の基礎
              http://www.flickr.com/photos/avlxyz/4999120709/

12年1月22日日曜日
位置情報基礎知識①
  緯度経度と単位


                                            緯度(latitude)は赤道を0度として
                                            北:+(プラス)
                                            南:ー(マイナス)
                                            の数字で表現



              経度(longitude)はグリニッジ天文台跡を南北へ
              通る子午線を0度として                   緯度経度を10進法で示すDegree単位でパソナ
              東:+(プラス)                      テック丸の内オフィスは以下のようになります
              西:ー(マイナス)                     +35.679113
              の数字で表現                        +139.763137
                                            ※ 60進で表現する度分秒(DMS)というのもあ
                                            るそうですがインターネット上ではDegree単位
                                            が利用されることが多いそうです


12年1月22日日曜日
位置情報基礎知識②
  測地系
  ✤   同じ場所でも利用する測地系(datum)によって緯度経度の値が変わる。日本で気に
      する必要があるのは以下2つ
      ✤   日本測地系
      ✤   世界測地系
  ✤   日本では2002年4月1日まで日本測地系が使われてきた経緯があり、サービスによっ
      てはまだ日本測地系を利用しているものもあるそうです
      ✤   日本測地系に基づいた緯度経度と世界測地系のそれとでは、約400mのズレが生じ
          るそうです




12年1月22日日曜日
位置情報基礎知識③
  位置情報取得方法
                            測位方式

              GPS          基地局測位           Wi-Fi測位
              高                                  低

     場所の精度

    バッテリ消費

 計測に要する時間

              プログラムから測位方式指定不可      プログラムから測位方式指定可能




12年1月22日日曜日
MapViewって何?

  ✤   スマートフォンならではの地図表示を行
      える機能
  ✤   Titanium Mobileでは
      Titanium.Map.createViewというAPI
      にて簡単に実装可能
      ✤   ただし、地図のズームイン/ズームア
          ウトのボタン配置/制御や、画面上
          のピンの表示などはそれなりに大変

      ✤   現在位置の取得を順次処理するよう
          なナビゲーション的な機能を実装し
          ようとするともっと大変。(http://
          hamasyou.com/blog/archives/
          000398)

12年1月22日日曜日
MapViewを使ったアプリ①

  ✤   TitaniumStudioを起動した後、
      File→New→Titanium Mobile Projectと
      進みます
  ✤   右記画面が表示されますので今回は以下入
      力してプロジェクトの設定を行います
      ✤   Project name:
          20120125TiStudy
      ✤   App Id:
          jp.co.pasonatech.20120125TiStudy

      ✤   補足)今回はローカルでの作業のため
          App Idを仮にこのようにしましたが
          AppStoreで配布する場合、他のアプリ
          ケーションと重複することは出来ませ
          ん。


12年1月22日日曜日
MapViewを使ったアプリ②

  app.js                                               ui/styles.js
  Titanium.UI.setBackgroundColor('#000');              var prop = {
  var tabGroup = Titanium.UI.createTabGroup();            win: {
  var $$ = require('ui/styles').prop;                       backgroundColor: '#999'
  var win1 = Titanium.UI.createWindow($$.win);            },
  win1.title = '地図表示サンプル';                                tab1:{
                                                            icon: 'KS_nav_views.png',
  var tab1 = Titanium.UI.createTab($$.tab1);                title:'MapView'
  tab1.window = win1;                                     },
                                                          mapView:{
  var mapView = Titanium.Map.createView($$.mapView);        width: 320,
                                                            height:480,
  win1.add(mapView);                                        top:0,
  tabGroup.addTab(tab1);                                    left:0,
  tabGroup.open();                                          mapType: Titanium.Map.STANDARD_TYPE,
                                                            region: {
                                                               latitude:35.676564,
                                                               longitude:139.765076,
                                                               latitudeDelta:0.01,
                                                               longitudeDelta:0.01
                                                             },
                                                            animate:true,
                                                            regionFit:true,
                                                            userLocation:true
                                                          }
                                                       };

                                                       var exports = {
                                                          prop:prop
                                                       };



12年1月22日日曜日
MapViewを使ったアプリ③

   MapViewのプロパティ解説
   ※説明する都合上、下記のソースコードに適宜改行を入れています
   //中略
        mapView:{
          width: 320,
          height:480,
          top:0,                                   STANDARD_TYPE以外に
          left:0,                                  Titanium.Map.SATELLITE_TYPE
                                                   Titanium.Map.HYBRID_TYPE
            mapType: Titanium.Map.STANDARD_TYPE,
                                                   も指定出来ます


            region: {
              latitude:35.676564,                  latitude(緯度)longitude(経度)をDegree
              longitude:139.765076,                単位で指定します

              latitudeDelta:0.01,                  latitudeDelta、longitudeDeltaは縮尺尺度で
              longitudeDelta:0.01
            },                                     1.0から0.001で指定可能
            animate:true,
            regionFit:true,
            userLocation:true
        }
   };



12年1月22日日曜日
MapViewを使ったアプリ④

  latitudeDelta、longitudeDeltaの数値を大きくすると広域表示になります


              1.0       0.5          0.1            0.05




12年1月22日日曜日
サンプルアプリを少しBrushUP

              http://www.flickr.com/photos/craigsd/4687453830/

12年1月22日日曜日
ズームイン/ズームアウトボタン配置&ピンの
  表示
  ✤   機能解説のために、あえてズームイン、
      ズームアウトさせるためのボタンを配
      置します

      ✤   iPhoneシミュレータでoptionキー
          を押しながらタッチパッドを操作す
          るとピンチイン/ピンチアウト出来
          るので本来不要・・
  ✤   パソナテックオフィスのある場所が地
      図上で判断しやすいように、ピンを配
      置します




12年1月22日日曜日
ズームイン/ズームアウトボタン配置&ピンの
  表示(app.js)
   ※先ほど作った20120125TiStudyプロジェクトをそのまま流用して作業を進めます
   Titanium.UI.setBackgroundColor('#000');
   var tabGroup = Titanium.UI.createTabGroup();
   var $$ = require('ui/styles').prop;
   var win1 = Titanium.UI.createWindow($$.win);
   win1.title = '地図表示サンプル';

   var ui = require('ui/ui');                                    後述するui.jsを読み込みます
   var mapView = Titanium.Map.createView($$.mapView);

   var pin = Titanium.Map.createAnnotation($$.pin);
                                                                 地図上にピンを表示するために
   mapView.addAnnotation(pin);                                   Titanium.Map.createAnnotationというAPIを
   var zoominPosition = 50;                                      使います。ピンの設定情報はui/styles.jsに記述
   var zoomoutPosition = 100;
                                                                 します


   var zoomin = ui.createZoomInBtn(zoominPosition,mapView);      後述するcreateZoomInBtnメソッドを使って
   var zoomout = ui.createZoomOutBtn(zoomoutPosition,mapView);   ズームイン、ズームアウトのボタンをそれぞれ生
                                                                 成します
   win1.add(mapView);
   win1.add(zoomin);
   win1.add(zoomout);                                            上記生成したズームイン、ズームアウトのボタン
   win1.open();                                                  をwindowに配置します



12年1月22日日曜日
ズームイン/ズームアウトボタン配置&ピンの
  表示(ui/ui.js)
   uiフォルダを作成して、その配下にui.jsを配置。以下ソースコードを記述します


   var exports = {
     createZoomInBtn:function(topPosition,obj){              TitaniumUI.createImageViewを利用してボタ
       var zoomin = Ti.UI.createImageView($$.zoomBtn);
       zoomin.text = '+';                                    ンの画像を配置します
       zoomin.top = topPosition;
       zoomin.image = 'images/zoomin.png';
       zoomin.addEventListener('click',function(){           ImageViewに対してクリックした時に発火させ
         obj.zoom(1);
       });                                                   るイベントを設定。
       return zoomin;
                                                             引数として渡されたTitanium.MapView(引数
        },                                                   名はobj)のzoomメソッドを使ってズームイン
        createZoomOutBtn:function(topPosition,obj){
          var zoomout = Ti.UI.createImageView($$.zoomBtn);   処理を実現してます。(マイナス1を指定する
           zoomout.text = '-';
           zoomout.top = topPosition;                        とズームアウトになります)
           zoomout.image = 'images/zoomout.png';
           zoomout.addEventListener('click',function(){
             obj.zoom(-1);                                   ※ createZoomInBtn() 、
           });
          return zoomout;
                                                             createZoomOutBtn()とも似た処理なのでリ
        }                                                    ファクタリングしたほうがよさそうなのですが
   };
                                                             説明やりやすくするために今回このようなコー
                                                             ドにしました


12年1月22日日曜日
ズームイン/ズームアウトボタンとピンのプロ
  パティの設定(ui/styles.js)
   styles.jsに以下追記します

   // mapView:{..}の後に以下追記します

    pin:{
       latitude: 35.676564,                         latitude(緯度)longitude(経度)をDegree
       longitude:139.765076,
       title:"文字が表示されます",                           単位で指定します
          pincolor:Titanium.Map.ANNOTATION_GREEN,
          animate:true
        },
        zoomBtn:{
          width:30,
          height:30,
          left:10
        }
   };




12年1月22日日曜日
Coffee Break!

                  http://www.flickr.com/photos/windsordi/3273502072/

12年1月22日日曜日
最終的に作るアプリのポイント

   var shopAddress = [
     {                                    Titanium.UI.TableViewを
       name:'地ビールダイニング神楽坂ラ・カシェット',
             address:'東京都新宿区神楽坂1-10',     利用して緯度経度以外の
             latitude:35.700457,          情報を表示します
             longitude:139.742207,
             pict:'pict/001.png'
        },
        {
             name:'イノダコーヒ 東京大丸支店',
             address:'東京都千代田区丸の内1-9-1',
             latitude:35.683016,
             longitude:139.768417,
             pict:'pict/002.png'
        },
        {
             name:'nicoドーナツ 麻布十番店',
             address:'東京都港区麻布十番1-7-9',
             latitude:35.656134,
             longitude:139.734884,
             pict:'pict/003.png'
                                          お店の情報がクリックされ
   ];
        }                                 た際に該当のお店の緯度経
                                          度情報を
        お店の名前、住所、緯度、経度、
                                          Titanium.MapViewの
        お店の画像の保存先のパスの情報
                                          setLocationメソッドを
        を配列で保持しておきます
                                          使ってlatitude,longitudeを
                                          設定しなおす


12年1月22日日曜日
app.jsの編集

   // 省略                             // 続き
   win1.title = 'レストランブック';          var container = [];
   var shopAddress = [
                                     var len = shopAddress.length;
     {
       name:'地ビールダイニング神楽坂ラ・カシェット',
                                     for(var i=0;i<len;i++){
        address:'東京都新宿区神楽坂1-10',
      latitude:35.700457,                var row = ui.createAddressRow(shopAddress[i]);
      longitude:139.742207,
      pict:'pict/001.png'                container.push(row);
    },
    {                                }
      name:'イノダコーヒ 東京大丸支店',
                                     var tableView    = ui.createTableView(container);
        address:'東京都千代田区丸の内1-9-1',
      latitude:35.683016,            win1.add(tableView);                  後述する
      longitude:139.768417,
      pict:'pict/002.png'                                                  ui.createAddressRowを使っ
    },
    {                                                                      てお店の名前、画像、住所が配
      name:'nicoドーナツ 麻布十番店',         var ui = require('ui/ui');
                                                                           置されたTableViewRowを順次
        address:'東京都港区麻布十番1-7-9',    // 省略                                 生成しそれらを配列container
        latitude:35.656134,
        longitude:139.734884,                                              に格納しておきます
        pict:'pict/003.png'
    }
   ];                                                      後述するui.createTableViewに上記生成した
   // 右に続きます
                                                           containerを渡しお店の一覧情報が含まれた
                                                           TableViewを生成します

12年1月22日日曜日
ui/ui.jsの編集①

    var $$ = require('ui/styles').prop;
    var exports = {
      createAddressRow:function(address){                              TableViewRowをクリックした際に緯度、経度
        var row = Ti.UI.createTableViewRow($$.viewRow);                情報を取得できるようにまずはdataプロパティ
        row.data = address;                                            に引数のaddressをそのまま代入します
        row.addEventListener('click', function(e){                     クリック時に発火するイベントを設定します。
          var pin = Titanium.Map.createAnnotation($$.mapAnnotation);   ※このメソッドの引数であるaddressは上記
          pin.latitude = e.rowData.data.latitude;
          pin.longitude = e.rowData.data.longitude;
                                                                       dataプロパティに代入してあるため
          pin.title = e.rowData.data.name;                             e.rowData.data.xxx で取得可能になってます

          setMapView(pin,e.rowData.data.latitude,e.rowData.data.longitude);

        });                                                            後述するsetMapView関数を利用して該当のお
        var shopName = Ti.UI.createLabel($$.shopName);
        shopName.text = address.name,
                                                                       店の場所にピンを配置&地図上の表示を行いま
        row.add(shopName);                                             す
        var addressInfo = Ti.UI.createLabel($$.address);               お店の名前、住所はTitanium.UI.Labelを利用
        addressInfo.text = address.address,                            し、お店の写真については
        row.add(addressInfo);
                                                                       Titanium.UI.ImaveViewを利用して生成しそれ
        var pict = Ti.UI.createImageView($$.pict);
         pict.image = address.pict;                                    ら全てTableViewRowに配置します
         row.add(pict);
        return row;
      },


12年1月22日日曜日
ui/ui.jsの編集②

         createTableView:function(rows){                          お店の一覧情報が含まれたTableViewRowが複
           var len = rows.length;
           var tableView = Ti.UI.createTableView($$.tableView);   数入っている配列を引数に取り、それを順番に
           for(var i=0;i<len;i++){
             tableView.appendRow(rows[i]);                        TableViewのRowにセットします
           }
           return tableView;
         }
    };
                                                                  exportsしてないこのsetMapView関数について
    // private method                                             はモジュール呼び出し側のapp.jsからはアクセ
    function setMapView(pin,latitude,longitude){
      mapView.addAnnotations([pin]);                              ス出来ないプライベートなメソッドになりま
         mapView.setLocation({                                    す。
           latitude :latitude,
           longitude:longitude,
           latitudeDelta:0.01,                                    Titanium.MapViewのsetLocationメソッドを
           longitudeDelta:0.01                                    利用して、緯度経度情報を再設定&該当の場所
         });
    }                                                             まで自動的にスクロールします




12年1月22日日曜日
ui/styles.jsの編集

   // zoomBtn:{..}の後に以下追記します
        tableView:{
          width: 320,
          height:200,
          top:0,
          left:0
        },
        viewRow:{
          width:320,
          height:'auto'
        },
        shopName:{
          font:{fontSize:14},
          color:'#000',
          left:80,
          top:5,
          width:230,
          height:20
        },
        address:{
          font:{fontSize:10},
          left:80,
          top:30,
          width:230,
          height:20
        },
        pict:{
          left:5,
          top:5,
          width:60,
          height:60
        }
   };
12年1月22日日曜日
オリジナル機能実装
  にむけてのアイデア
  ✤   過去取り上げてない機能もあるが、以
      下のような視点でオリジナル機能実装
      にチャレンジしてみてください
      ✤   お店の情報
          ✤   住所→緯度経度情報変換してく
              れるサービスを活用(http://
              www.geocoding.jp/api/)
          ✤   SQLiteを使ってお店の情報の読
              み書き可能にする
      ✤   ユーザインタフェース
          ✤   お店情報クリック→画面遷移し
              て地図を表示

                                       http://www.flickr.com/photos/craigsd/4687453830/

12年1月22日日曜日
参考資料

  ✤   WEB+DB PRESS Vol.57 特集3スマートフォンでもケータイでも![速習]位置情
      報サービス
      ✤   http://amzn.to/zAHI46
  ✤   On HTML5 Field  [第4回] DEVICE ACCESS (Geolocation API /
      DeviceOrientation Event)




12年1月22日日曜日

Más contenido relacionado

Similar a 20120125 titanium study

Meetup tokyo.20120924
Meetup tokyo.20120924Meetup tokyo.20120924
Meetup tokyo.20120924
Kosuke Isobe
 
Pf部2012年1月勉強会.androidsola
Pf部2012年1月勉強会.androidsolaPf部2012年1月勉強会.androidsola
Pf部2012年1月勉強会.androidsola
android sola
 
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGLMedia Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
Atsushi Tadokoro
 

Similar a 20120125 titanium study (15)

SysML実習20220822SC_GA.pdf
SysML実習20220822SC_GA.pdfSysML実習20220822SC_GA.pdf
SysML実習20220822SC_GA.pdf
 
Meetup tokyo.20120924
Meetup tokyo.20120924Meetup tokyo.20120924
Meetup tokyo.20120924
 
OpenStreetMap(地物情報の入力方法編)
OpenStreetMap(地物情報の入力方法編)OpenStreetMap(地物情報の入力方法編)
OpenStreetMap(地物情報の入力方法編)
 
Pf部2012年1月勉強会.androidsola
Pf部2012年1月勉強会.androidsolaPf部2012年1月勉強会.androidsola
Pf部2012年1月勉強会.androidsola
 
Open streetmap(地物情報の入力方法編)
Open streetmap(地物情報の入力方法編)Open streetmap(地物情報の入力方法編)
Open streetmap(地物情報の入力方法編)
 
Gdg geo2
Gdg geo2Gdg geo2
Gdg geo2
 
RからGoogle Cloud Vision API を利用する
RからGoogle Cloud Vision API を利用するRからGoogle Cloud Vision API を利用する
RからGoogle Cloud Vision API を利用する
 
Titanium勉強会
Titanium勉強会Titanium勉強会
Titanium勉強会
 
タイル地図がおもしろい
タイル地図がおもしろいタイル地図がおもしろい
タイル地図がおもしろい
 
ももち浜TECHカフェ:OpenCVとKinectで作ろう壁面タッチパネル
ももち浜TECHカフェ:OpenCVとKinectで作ろう壁面タッチパネルももち浜TECHカフェ:OpenCVとKinectで作ろう壁面タッチパネル
ももち浜TECHカフェ:OpenCVとKinectで作ろう壁面タッチパネル
 
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGLMedia Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
Media Art II 2013 第7回 : openFrameworks 3Dグラフィクス、OpenGL
 
Xamarin基礎講座 Xamarinハンズオン(2016.09 浜松) #JXUG #jaghama
Xamarin基礎講座 Xamarinハンズオン(2016.09 浜松) #JXUG #jaghamaXamarin基礎講座 Xamarinハンズオン(2016.09 浜松) #JXUG #jaghama
Xamarin基礎講座 Xamarinハンズオン(2016.09 浜松) #JXUG #jaghama
 
Android Lecture #02 @PRO&BSC Inc.
Android Lecture #02 @PRO&BSC Inc.Android Lecture #02 @PRO&BSC Inc.
Android Lecture #02 @PRO&BSC Inc.
 
[Cloud OnAir] BigQuery の一般公開データセットを 利用した実践的データ分析 2019年3月28日 放送
[Cloud OnAir] BigQuery の一般公開データセットを 利用した実践的データ分析 2019年3月28日 放送[Cloud OnAir] BigQuery の一般公開データセットを 利用した実践的データ分析 2019年3月28日 放送
[Cloud OnAir] BigQuery の一般公開データセットを 利用した実践的データ分析 2019年3月28日 放送
 
Xamarinで作る 「オリジナルタイル地図」アプリ
Xamarinで作る「オリジナルタイル地図」アプリXamarinで作る「オリジナルタイル地図」アプリ
Xamarinで作る 「オリジナルタイル地図」アプリ
 

Más de Hiroshi Oyamada

2014 02-19-titanium meetupvol16
2014 02-19-titanium meetupvol162014 02-19-titanium meetupvol16
2014 02-19-titanium meetupvol16
Hiroshi Oyamada
 
勉強会主催者のための勉強会
勉強会主催者のための勉強会勉強会主催者のための勉強会
勉強会主催者のための勉強会
Hiroshi Oyamada
 
20130613 titanium meetupvol9
20130613 titanium meetupvol920130613 titanium meetupvol9
20130613 titanium meetupvol9
Hiroshi Oyamada
 
2013 06-11-craft beerfanlt
2013 06-11-craft beerfanlt2013 06-11-craft beerfanlt
2013 06-11-craft beerfanlt
Hiroshi Oyamada
 
2013 06-05-web-career-talk-at-coedo
2013 06-05-web-career-talk-at-coedo2013 06-05-web-career-talk-at-coedo
2013 06-05-web-career-talk-at-coedo
Hiroshi Oyamada
 
20130412 titanium meetupvol7
20130412 titanium meetupvol720130412 titanium meetupvol7
20130412 titanium meetupvol7
Hiroshi Oyamada
 
2013 02-28-bussiness-plan-about-titanium
2013 02-28-bussiness-plan-about-titanium2013 02-28-bussiness-plan-about-titanium
2013 02-28-bussiness-plan-about-titanium
Hiroshi Oyamada
 
20130125 titanium meetupvol5
20130125 titanium meetupvol520130125 titanium meetupvol5
20130125 titanium meetupvol5
Hiroshi Oyamada
 

Más de Hiroshi Oyamada (20)

2016 02-25-crawler-study-01
2016 02-25-crawler-study-012016 02-25-crawler-study-01
2016 02-25-crawler-study-01
 
2016 02-09-co-edo lt
2016 02-09-co-edo lt2016 02-09-co-edo lt
2016 02-09-co-edo lt
 
2015 12-19-ruby rails
2015 12-19-ruby rails2015 12-19-ruby rails
2015 12-19-ruby rails
 
2015 07-04-ruby rails
2015 07-04-ruby rails2015 07-04-ruby rails
2015 07-04-ruby rails
 
育児を支える技術〜クローラーとかスクレイピング
育児を支える技術〜クローラーとかスクレイピング育児を支える技術〜クローラーとかスクレイピング
育児を支える技術〜クローラーとかスクレイピング
 
日々の面倒をプログラミングで解決!【入門編】
日々の面倒をプログラミングで解決!【入門編】日々の面倒をプログラミングで解決!【入門編】
日々の面倒をプログラミングで解決!【入門編】
 
2014 05-17-titanium hamamatsuvol3
2014 05-17-titanium hamamatsuvol32014 05-17-titanium hamamatsuvol3
2014 05-17-titanium hamamatsuvol3
 
20140319 titanium meetupvol17
20140319 titanium meetupvol1720140319 titanium meetupvol17
20140319 titanium meetupvol17
 
2014 02-19-titanium meetupvol16
2014 02-19-titanium meetupvol162014 02-19-titanium meetupvol16
2014 02-19-titanium meetupvol16
 
TitaniumMeetUpVol13
TitaniumMeetUpVol13TitaniumMeetUpVol13
TitaniumMeetUpVol13
 
20130910 titanium meetupvol11
20130910 titanium meetupvol1120130910 titanium meetupvol11
20130910 titanium meetupvol11
 
勉強会主催者のための勉強会
勉強会主催者のための勉強会勉強会主催者のための勉強会
勉強会主催者のための勉強会
 
20130613 titanium meetupvol9
20130613 titanium meetupvol920130613 titanium meetupvol9
20130613 titanium meetupvol9
 
2013 06-11-craft beerfanlt
2013 06-11-craft beerfanlt2013 06-11-craft beerfanlt
2013 06-11-craft beerfanlt
 
2013 06-05-web-career-talk-at-coedo
2013 06-05-web-career-talk-at-coedo2013 06-05-web-career-talk-at-coedo
2013 06-05-web-career-talk-at-coedo
 
20130412 titanium meetupvol7
20130412 titanium meetupvol720130412 titanium meetupvol7
20130412 titanium meetupvol7
 
2013 02-28-bussiness-plan-about-titanium
2013 02-28-bussiness-plan-about-titanium2013 02-28-bussiness-plan-about-titanium
2013 02-28-bussiness-plan-about-titanium
 
20130126 titanium新年会
20130126 titanium新年会20130126 titanium新年会
20130126 titanium新年会
 
20130125 titanium meetupvol5
20130125 titanium meetupvol520130125 titanium meetupvol5
20130125 titanium meetupvol5
 
2012 12-17-titanium meetupvol4
2012 12-17-titanium meetupvol42012 12-17-titanium meetupvol4
2012 12-17-titanium meetupvol4
 

20120125 titanium study

  • 1. 位置情報と連携したアプリ開発 http://www.flickr.com/photos/normanbleventhalmapcenter/2674845313/ 12年1月22日日曜日
  • 2. 今回の狙い ✤ 位置情報と連携したアプリ開発 を通じてMapViewの使い方に ついて学びます ✤ 今回作るアプリをベースにし て、次回各自でオリジナル機能 の実装にチャレンジしてもらい たいと考えてます http://www.flickr.com/photos/alanant/4483533096/ 12年1月22日日曜日
  • 3. 今回作るアプリのイメージ ✤ 過去の勉強会で取り上げたTableView の機能を使ってお店の一覧情報を表示 ✤ 今回説明するMapView機能も活用し、 お店の情報をクリックしたら該当する 場所の地図を表示するアプリを作成 12年1月22日日曜日
  • 4. はじめに位置情報の基礎 http://www.flickr.com/photos/avlxyz/4999120709/ 12年1月22日日曜日
  • 5. 位置情報基礎知識① 緯度経度と単位 緯度(latitude)は赤道を0度として 北:+(プラス) 南:ー(マイナス) の数字で表現 経度(longitude)はグリニッジ天文台跡を南北へ 通る子午線を0度として 緯度経度を10進法で示すDegree単位でパソナ 東:+(プラス) テック丸の内オフィスは以下のようになります 西:ー(マイナス) +35.679113 の数字で表現 +139.763137 ※ 60進で表現する度分秒(DMS)というのもあ るそうですがインターネット上ではDegree単位 が利用されることが多いそうです 12年1月22日日曜日
  • 6. 位置情報基礎知識② 測地系 ✤ 同じ場所でも利用する測地系(datum)によって緯度経度の値が変わる。日本で気に する必要があるのは以下2つ ✤ 日本測地系 ✤ 世界測地系 ✤ 日本では2002年4月1日まで日本測地系が使われてきた経緯があり、サービスによっ てはまだ日本測地系を利用しているものもあるそうです ✤ 日本測地系に基づいた緯度経度と世界測地系のそれとでは、約400mのズレが生じ るそうです 12年1月22日日曜日
  • 7. 位置情報基礎知識③ 位置情報取得方法 測位方式 GPS 基地局測位 Wi-Fi測位 高 低 場所の精度 バッテリ消費 計測に要する時間 プログラムから測位方式指定不可 プログラムから測位方式指定可能 12年1月22日日曜日
  • 8. MapViewって何? ✤ スマートフォンならではの地図表示を行 える機能 ✤ Titanium Mobileでは Titanium.Map.createViewというAPI にて簡単に実装可能 ✤ ただし、地図のズームイン/ズームア ウトのボタン配置/制御や、画面上 のピンの表示などはそれなりに大変 ✤ 現在位置の取得を順次処理するよう なナビゲーション的な機能を実装し ようとするともっと大変。(http:// hamasyou.com/blog/archives/ 000398) 12年1月22日日曜日
  • 9. MapViewを使ったアプリ① ✤ TitaniumStudioを起動した後、 File→New→Titanium Mobile Projectと 進みます ✤ 右記画面が表示されますので今回は以下入 力してプロジェクトの設定を行います ✤ Project name: 20120125TiStudy ✤ App Id: jp.co.pasonatech.20120125TiStudy ✤ 補足)今回はローカルでの作業のため App Idを仮にこのようにしましたが AppStoreで配布する場合、他のアプリ ケーションと重複することは出来ませ ん。 12年1月22日日曜日
  • 10. MapViewを使ったアプリ② app.js ui/styles.js Titanium.UI.setBackgroundColor('#000'); var prop = { var tabGroup = Titanium.UI.createTabGroup(); win: { var $$ = require('ui/styles').prop; backgroundColor: '#999' var win1 = Titanium.UI.createWindow($$.win); }, win1.title = '地図表示サンプル'; tab1:{ icon: 'KS_nav_views.png', var tab1 = Titanium.UI.createTab($$.tab1); title:'MapView' tab1.window = win1; }, mapView:{ var mapView = Titanium.Map.createView($$.mapView); width: 320, height:480, win1.add(mapView); top:0, tabGroup.addTab(tab1); left:0, tabGroup.open(); mapType: Titanium.Map.STANDARD_TYPE, region: { latitude:35.676564, longitude:139.765076, latitudeDelta:0.01, longitudeDelta:0.01 }, animate:true, regionFit:true, userLocation:true } }; var exports = { prop:prop }; 12年1月22日日曜日
  • 11. MapViewを使ったアプリ③ MapViewのプロパティ解説 ※説明する都合上、下記のソースコードに適宜改行を入れています //中略 mapView:{ width: 320, height:480, top:0, STANDARD_TYPE以外に left:0, Titanium.Map.SATELLITE_TYPE Titanium.Map.HYBRID_TYPE mapType: Titanium.Map.STANDARD_TYPE, も指定出来ます region: { latitude:35.676564, latitude(緯度)longitude(経度)をDegree longitude:139.765076, 単位で指定します latitudeDelta:0.01, latitudeDelta、longitudeDeltaは縮尺尺度で longitudeDelta:0.01 }, 1.0から0.001で指定可能 animate:true, regionFit:true, userLocation:true } }; 12年1月22日日曜日
  • 13. サンプルアプリを少しBrushUP http://www.flickr.com/photos/craigsd/4687453830/ 12年1月22日日曜日
  • 14. ズームイン/ズームアウトボタン配置&ピンの 表示 ✤ 機能解説のために、あえてズームイン、 ズームアウトさせるためのボタンを配 置します ✤ iPhoneシミュレータでoptionキー を押しながらタッチパッドを操作す るとピンチイン/ピンチアウト出来 るので本来不要・・ ✤ パソナテックオフィスのある場所が地 図上で判断しやすいように、ピンを配 置します 12年1月22日日曜日
  • 15. ズームイン/ズームアウトボタン配置&ピンの 表示(app.js) ※先ほど作った20120125TiStudyプロジェクトをそのまま流用して作業を進めます Titanium.UI.setBackgroundColor('#000'); var tabGroup = Titanium.UI.createTabGroup(); var $$ = require('ui/styles').prop; var win1 = Titanium.UI.createWindow($$.win); win1.title = '地図表示サンプル'; var ui = require('ui/ui'); 後述するui.jsを読み込みます var mapView = Titanium.Map.createView($$.mapView); var pin = Titanium.Map.createAnnotation($$.pin); 地図上にピンを表示するために mapView.addAnnotation(pin); Titanium.Map.createAnnotationというAPIを var zoominPosition = 50; 使います。ピンの設定情報はui/styles.jsに記述 var zoomoutPosition = 100; します var zoomin = ui.createZoomInBtn(zoominPosition,mapView); 後述するcreateZoomInBtnメソッドを使って var zoomout = ui.createZoomOutBtn(zoomoutPosition,mapView); ズームイン、ズームアウトのボタンをそれぞれ生 成します win1.add(mapView); win1.add(zoomin); win1.add(zoomout); 上記生成したズームイン、ズームアウトのボタン win1.open(); をwindowに配置します 12年1月22日日曜日
  • 16. ズームイン/ズームアウトボタン配置&ピンの 表示(ui/ui.js) uiフォルダを作成して、その配下にui.jsを配置。以下ソースコードを記述します var exports = { createZoomInBtn:function(topPosition,obj){ TitaniumUI.createImageViewを利用してボタ var zoomin = Ti.UI.createImageView($$.zoomBtn); zoomin.text = '+'; ンの画像を配置します zoomin.top = topPosition; zoomin.image = 'images/zoomin.png'; zoomin.addEventListener('click',function(){ ImageViewに対してクリックした時に発火させ obj.zoom(1); }); るイベントを設定。 return zoomin; 引数として渡されたTitanium.MapView(引数 }, 名はobj)のzoomメソッドを使ってズームイン createZoomOutBtn:function(topPosition,obj){ var zoomout = Ti.UI.createImageView($$.zoomBtn); 処理を実現してます。(マイナス1を指定する zoomout.text = '-'; zoomout.top = topPosition; とズームアウトになります) zoomout.image = 'images/zoomout.png'; zoomout.addEventListener('click',function(){ obj.zoom(-1); ※ createZoomInBtn() 、 }); return zoomout; createZoomOutBtn()とも似た処理なのでリ } ファクタリングしたほうがよさそうなのですが }; 説明やりやすくするために今回このようなコー ドにしました 12年1月22日日曜日
  • 17. ズームイン/ズームアウトボタンとピンのプロ パティの設定(ui/styles.js) styles.jsに以下追記します // mapView:{..}の後に以下追記します pin:{ latitude: 35.676564, latitude(緯度)longitude(経度)をDegree longitude:139.765076, title:"文字が表示されます", 単位で指定します pincolor:Titanium.Map.ANNOTATION_GREEN, animate:true }, zoomBtn:{ width:30, height:30, left:10 } }; 12年1月22日日曜日
  • 18. Coffee Break! http://www.flickr.com/photos/windsordi/3273502072/ 12年1月22日日曜日
  • 19. 最終的に作るアプリのポイント var shopAddress = [ { Titanium.UI.TableViewを name:'地ビールダイニング神楽坂ラ・カシェット', address:'東京都新宿区神楽坂1-10', 利用して緯度経度以外の latitude:35.700457, 情報を表示します longitude:139.742207, pict:'pict/001.png' }, { name:'イノダコーヒ 東京大丸支店', address:'東京都千代田区丸の内1-9-1', latitude:35.683016, longitude:139.768417, pict:'pict/002.png' }, { name:'nicoドーナツ 麻布十番店', address:'東京都港区麻布十番1-7-9', latitude:35.656134, longitude:139.734884, pict:'pict/003.png' お店の情報がクリックされ ]; } た際に該当のお店の緯度経 度情報を お店の名前、住所、緯度、経度、 Titanium.MapViewの お店の画像の保存先のパスの情報 setLocationメソッドを を配列で保持しておきます 使ってlatitude,longitudeを 設定しなおす 12年1月22日日曜日
  • 20. app.jsの編集 // 省略 // 続き win1.title = 'レストランブック'; var container = []; var shopAddress = [ var len = shopAddress.length; { name:'地ビールダイニング神楽坂ラ・カシェット', for(var i=0;i<len;i++){ address:'東京都新宿区神楽坂1-10', latitude:35.700457, var row = ui.createAddressRow(shopAddress[i]); longitude:139.742207, pict:'pict/001.png' container.push(row); }, { } name:'イノダコーヒ 東京大丸支店', var tableView = ui.createTableView(container); address:'東京都千代田区丸の内1-9-1', latitude:35.683016, win1.add(tableView); 後述する longitude:139.768417, pict:'pict/002.png' ui.createAddressRowを使っ }, { てお店の名前、画像、住所が配 name:'nicoドーナツ 麻布十番店', var ui = require('ui/ui'); 置されたTableViewRowを順次 address:'東京都港区麻布十番1-7-9', // 省略 生成しそれらを配列container latitude:35.656134, longitude:139.734884, に格納しておきます pict:'pict/003.png' } ]; 後述するui.createTableViewに上記生成した // 右に続きます containerを渡しお店の一覧情報が含まれた TableViewを生成します 12年1月22日日曜日
  • 21. ui/ui.jsの編集① var $$ = require('ui/styles').prop; var exports = { createAddressRow:function(address){ TableViewRowをクリックした際に緯度、経度 var row = Ti.UI.createTableViewRow($$.viewRow); 情報を取得できるようにまずはdataプロパティ row.data = address; に引数のaddressをそのまま代入します row.addEventListener('click', function(e){ クリック時に発火するイベントを設定します。 var pin = Titanium.Map.createAnnotation($$.mapAnnotation); ※このメソッドの引数であるaddressは上記 pin.latitude = e.rowData.data.latitude; pin.longitude = e.rowData.data.longitude; dataプロパティに代入してあるため pin.title = e.rowData.data.name; e.rowData.data.xxx で取得可能になってます setMapView(pin,e.rowData.data.latitude,e.rowData.data.longitude); }); 後述するsetMapView関数を利用して該当のお var shopName = Ti.UI.createLabel($$.shopName); shopName.text = address.name, 店の場所にピンを配置&地図上の表示を行いま row.add(shopName); す var addressInfo = Ti.UI.createLabel($$.address); お店の名前、住所はTitanium.UI.Labelを利用 addressInfo.text = address.address, し、お店の写真については row.add(addressInfo); Titanium.UI.ImaveViewを利用して生成しそれ var pict = Ti.UI.createImageView($$.pict); pict.image = address.pict; ら全てTableViewRowに配置します row.add(pict); return row; }, 12年1月22日日曜日
  • 22. ui/ui.jsの編集② createTableView:function(rows){ お店の一覧情報が含まれたTableViewRowが複 var len = rows.length; var tableView = Ti.UI.createTableView($$.tableView); 数入っている配列を引数に取り、それを順番に for(var i=0;i<len;i++){ tableView.appendRow(rows[i]); TableViewのRowにセットします } return tableView; } }; exportsしてないこのsetMapView関数について // private method はモジュール呼び出し側のapp.jsからはアクセ function setMapView(pin,latitude,longitude){ mapView.addAnnotations([pin]); ス出来ないプライベートなメソッドになりま mapView.setLocation({ す。 latitude :latitude, longitude:longitude, latitudeDelta:0.01, Titanium.MapViewのsetLocationメソッドを longitudeDelta:0.01 利用して、緯度経度情報を再設定&該当の場所 }); } まで自動的にスクロールします 12年1月22日日曜日
  • 23. ui/styles.jsの編集 // zoomBtn:{..}の後に以下追記します tableView:{ width: 320, height:200, top:0, left:0 }, viewRow:{ width:320, height:'auto' }, shopName:{ font:{fontSize:14}, color:'#000', left:80, top:5, width:230, height:20 }, address:{ font:{fontSize:10}, left:80, top:30, width:230, height:20 }, pict:{ left:5, top:5, width:60, height:60 } }; 12年1月22日日曜日
  • 24. オリジナル機能実装 にむけてのアイデア ✤ 過去取り上げてない機能もあるが、以 下のような視点でオリジナル機能実装 にチャレンジしてみてください ✤ お店の情報 ✤ 住所→緯度経度情報変換してく れるサービスを活用(http:// www.geocoding.jp/api/) ✤ SQLiteを使ってお店の情報の読 み書き可能にする ✤ ユーザインタフェース ✤ お店情報クリック→画面遷移し て地図を表示 http://www.flickr.com/photos/craigsd/4687453830/ 12年1月22日日曜日
  • 25. 参考資料 ✤ WEB+DB PRESS Vol.57 特集3スマートフォンでもケータイでも![速習]位置情 報サービス ✤ http://amzn.to/zAHI46 ✤ On HTML5 Field  [第4回] DEVICE ACCESS (Geolocation API / DeviceOrientation Event) 12年1月22日日曜日