2017年9月6日水曜日

MapViewに表示できるpinの数

1000個くらい一度に表示できないものか、できるなら表示速度はどんなもんじゃろうと試してみた。

横並びの制限?

経度1度ごとに横に並べるようにしたら、なぜか411個という中途半端な個数が最大だった。
なぜか411個が限界

ランダム配置なら制限なし?

しかし世界中のランダムな位置に刺すようにしたところ、1000個でも表示できた
1000個でもいけた
昔のパソコンのスプライトじゃあるまいし、横位置に並べられる制限があるのかしら?

なお表示速度はどちらも一瞬で、目立った遅延もないようなので気にしなくて良さそう。

10,000個でも大丈夫

10,000個にもチャレンジしたら、表示できたが、さすがにspanを広くしてpinがいっぱい表示されるようにしたら重くなった。(iPad Air2)
でもちょっと引っかかる程度で、実用上さほど問題あるとも思えなかった。spanを狭く取ればスイスイだし。
10,000個もpinを表示する機会は滅多にないよね。
10,000個でもいけたがちょっと重い


override func viewDidLoad() {
        super.viewDidLoad()
        
        //pin1000個追加
        var annotationArr = Array<MKAnnotation>()
        for i in 1...1000 {
            let anno = MKPointAnnotation()
            let longi = Double(arc4random() % UInt32(360)) - Double(180)
            let lat   = Double(arc4random() % UInt32(180)) - Double(90)
            print(i)
            anno.coordinate = CLLocationCoordinate2DMake(Double(lat), Double(longi))
            anno.title = "経度:\(longi) 緯度:\(lat)"
            anno.subtitle = "番号 \(i)"
            annotationArr.append(anno)
        }
        self.myMapView.addAnnotations(annotationArr)

        //1000番目のpinの位置をマップのデフォルト位置に
        let lat = annotationArr.last?.coordinate.latitude
        let lng = annotationArr.last?.coordinate.longitude
        let coordinate = CLLocationCoordinate2DMake(lat!, lng!)
        let span = MKCoordinateSpanMake(0.05, 0.05) //表示範囲(拡大)
        let region = MKCoordinateRegionMake(coordinate, span)
        self.myMapView.setRegion(region, animated: true)

    }


ちなみに以前勉強した時はMKPointAnnotationを使わずにカスタムクラスを作ってannotationを管理するようにって読んだんだけど、単純に表示するだけならMKPointAnnotationで事足りるよね? よくわかんないけどいいか。

色を変えてみる

1000個表示でも少し重い
ピンの色を変えるにはMapViewのdelegateメソッドを使う必要がある。

ピンの緯度経度、タイトル/サブタイトル、色やアイコンのデザインまで一括してプロパティに持つクラスがありゃいいのにと思うけど、Appleの技術者様の考えることはわからない。
しょうがないので、みんなカスタムクラスを作ってるみたい。

表示は少し重くなる。ピンを表示するごとにdelegateメソッドが呼ばれるせいだろう。
数が少なければ気にならないと思う。


//pin1000個追加の後あたりに以下を追加
self.myMapView.delegate = self

さらにメソッドを追加。
    //pinのデザインを変えるにはdelegateメソッドを使う
    func mapView(_ mapView: MKMapView, viewFor annotation: MKAnnotation) -> MKAnnotationView? {
        let annoView = MKPinAnnotationView()
        annoView.annotation = annotation
        let r = Float(Double(arc4random() % 10) / 10)
        let g = Float(Double(arc4random() % 10) / 10)
        let b = Float(Double(arc4random() % 10) / 10)
        annoView.pinTintColor = UIColor.init(colorLiteralRed: r, green: g, blue: b, alpha: 1.0)
        annoView.canShowCallout = true
        
        return annoView
    }

画像を変えてみる

画像2種類+色を変えたピン
意外と軽い
今度は画像を変更して見たところ、動きが軽い。
色を変えないピンよりは引っかかるが、色を様々に変えたものよりは軽いのだ。
delegateメソッドを繰り返し呼ぶのがボトルネックになっているのではなく、新たに色が違う画像を生成するか、キャッシュされた画像を再利用するかの点で違いが出てるのかも?
もっと画像の種類を増やすと違いが出てくるだろう。

なお、画像の中心(9*9の画像なら5,5の位置)が設定した緯度経度の位置になるようだ。
同じ緯度経度のデフォルトのピンと重ねてみるとよくわかる。

0 件のコメント:

コメントを投稿