LoginSignup
5
5

More than 5 years have passed since last update.

ti.map をちょっとだけ便利にしちゃう改造

Posted at

はじめに

iOS 用 ti.map モジュールの記事になります。Android な方はごめんなさい。

さて、この記事は ti.map モジュールの基本的な使い方ではなく、Objective-C では存在する機能を有効化するために、ちょっとだけ改造したものの解説になります。

ti.map Gesture Recognizer fork

https://github.com/k0sukey/ti.map/tree/GestureRecognizer

ti.map モジュールへタッチ系イベントを追加するフォークになります。よくある地図をタップした地点にアノテーションを追加したいときなどに使えるかと思います。また、ti.map には pitchEnabledrotateEnabled はあるのですが、なぜか zoomEnabled が存在しません。地図をピンチで拡大縮小するのを許可するかしないか、ですね。このメソッドも追加してあります。

使い方

var Map = require('ti.map'),
    map = Map.createView({
        top: 0,
        right: 0,
        bottom: 0,
        left: 0,
        width: Ti.UI.FILL,
        height: Ti.UI.FILL
    });

map.addEventListener('click', function(e){
    // e.x, e.y, e.latitude, e.longitude
});

map.addEventListener('touchstart', function(e){
    // e.x, e.y, e.latitude, e.longitude
});

map.addEventListener('touchmove', function(e){
    // e.x, e.y, e.latitude, e.longitude
});

map.addEventListener('touchend', function(e){
    // e.x, e.y, e.latitude, e.longitude
});

コールバックでイベントが発火した地点の経度緯度、ビュー自体の xy 座標が返却されます。

ti.map MKDirections fork

https://github.com/k0sukey/ti.map/tree/MKDirections

ti.map モジュールへ MKDirections を追加するフォークになります。MKDirections は Apple のサーバへ問い合わせをして、2地点間のルートを検索してくれます。

使い方

var Map = require('ti.map'),
    map = Map.createView({
        top: 0,
        right: 0,
        bottom: 0,
        left: 0,
        width: Ti.UI.FILL,
        height: Ti.UI.FILL
    }),
    directions = Map.createDirections({
        source: { // 六本木
            latitude: 35.665213,
            longitude: 139.730011
        },
        destination: { // 渋谷
            latitude: 35.658987,
            longitude: 139.702776
        }
    });

directions.addEventListener('success', function(e){
    // e.routes
    var route = Map.createRoute({
        points: e.routes[0].route
    });
    map.addRoute(route);
});

directions.addEventListener('error', function(){
    alert('oops!');
});

コールバックの返却値には Map.route でそのまま使えるオブジェクトが配列で格納されています。また、経路案内とその区間の距離(メートル)も格納されていますので、そのままナビアプリとして利用することができますね。

おまけで、該当ルートが表示している地図へちょうど収まるサンプルコードもどうぞ。

var points = e.routes[0].route,
    maxLat, maxLng, minLat, minLng;

for (var i = 0; i < points.length; i++) {
    maxLat = maxLat ? Math.max(points[i].latitude, maxLat) : points[i].latitude;
    maxLng = maxLng ? Math.max(points[i].longitude, maxLng) : points[i].longitude;
    minLat = minLat ? Math.min(points[i].latitude, minLat) : points[i].latitude;
    minLng = minLng ? Math.min(points[i].longitude, minLng) : points[i].longitude;
}

map.applyProperties({
    region: {
        latitude: (maxLat + minLat) / 2,
        longitude: (maxLng + minLng) / 2,
        latitudeDelta: (maxLat - minLat) * 1.1, // マージン付き
        longitudeDelta: (maxLng - minLng) * 1.1 // マージン付き
    }
});

最後に

八木さんTitaniumとPubNubでリアルタイムサービスと組み合わせると、みんなで集合しながらメッセージが送り合えるアプリが作れちゃいそうですね!これを書いていてちょっと作ってみたくなっちゃいました。冬休みの宿題にしようかな?

さて、明日は八木さんの「Firebaseを使ってリアルタイムサービス」になります。楽しみですね!

5
5
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5