7

iPhone に既に存在する Android アプリに取り組んでいます。

アプリには、4 つの異なる色で描画可能でマークされた 4 つのグループに約 800 個のマーカーがある (私が数えた) Map アクティビティがあります。各グループは、オンまたはオフにすることができます。リスト内にあるマーカーに関する情報。グループごとに mapOverlay を作成し、そのオーバーレイを地図に添付します。コーディング部分は適切に行ったと強く信じています。とにかくコードを添付します...

問題は、私の Nexus One がこれらすべてのマーカーを含むマップを処理できないことです。500 個のマーカーを描画するだけで約 15 秒かかります。次に、すべてを描画すると、マップはあまり滑らかではありません。ズームして移動するのはちょっと難しいです。できますが、経験が乏しく、そこで何かできないか見てみたいと思います。String > Double 変換を回避すれば、時間を節約できることはわかっていますが、それが重要であるとは思えません。

iPhone では、これらすべてのマーカーを表示するのに問題はないようです。それらすべてを表示するのに約 1 ~ 2 秒かかり、ズームとパンはそれほど悪くありません。速度低下は目立ちますが、それでも許容範囲です。個人的にはマーカーをたくさん描くのは良くないと思いますが、アプリは他人がデザインしたものであり、大幅な変更を加えることは想定されていません。

ここで何をすべきかわかりません。さまざまな機能を考え出す必要があるようです。既知の場合は GPS の位置を使用し、半径内のマーカーのみを描画するか、位置が不明な場合は画面の中心 (地図) を使用してその周りにマーカーを描画します。これらの変更を行う場合は、上司に合理的な説明をする必要があります。

誰かがidasを持っているかどうかに感謝します。

そしてコード:

    List<Overlay> mapOverlays = mapView.getOverlays();
    Drawable drawable = this.getResources().getDrawable(R.drawable.pin_blue);
    drawable = this.getResources().getDrawable(R.drawable.pin_blue);
    ArrList = appState.GetSleepArrList();
    ItemizedOverlay itemizedoverlay = new ItemizedOverlay(drawable, this); 
    ...
    ...
       for (int m = 0; m < ArrList.size(); m++) {
            tName = ArrList.get(m).get("name").toString();
            tId = ArrList.get(m).get("id").toString();
            tLat = ArrList.get(m).get("lat").toString();;
            tLng = ArrList.get(m).get("lng").toString();;
            try {
                lat = Double.parseDouble(tLat);
                lng = Double.parseDouble(tLng);
                p1 = new GeoPoint(
                        (int) (lat * 1E6), 
                        (int) (lng * 1E6));
                OverlayItem overlayitem = new OverlayItem(p1, tName, tId);
                itemizedoverlay.addOverlay(overlayitem);
            } catch (NumberFormatException e) {
                Log.d(TAG, "NumberFormatException" + e);    
            }
        }
        mapOverlays.add(itemizedoverlay);
        mapView.postInvalidate();

................................................

public class ItemizedOverlay extends ItemizedOverlay<OverlayItem>
{
    private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
    private Context mContext;
    public HelloItemizedOverlay(Drawable defaultMarker, Context context)
    {
        super(boundCenterBottom(defaultMarker));
        mContext = context;
    }

    public void addOverlay(OverlayItem overlay)
    {
        mOverlays.add(overlay);
        populate();
    }
    @Override
    protected OverlayItem createItem(int i)
    {
        return mOverlays.get(i);
    }
    @Override
    public int size()
    {
        return mOverlays.size();
    }
    @Override
    protected boolean onTap(int index)
    {
        final OverlayItem item = mOverlays.get(index);
                    ... EACH MARKER WILL HAVE ONCLICK EVENT THAT WILL PRODUCE CLICABLE 
                    ... BALOON WITH MARKER'S NAME.          
        return true;
    }       
}    
4

3 に答える 3

3

上手。マーカーを追加した後、毎回populate()を呼び出すことがわかりました。addOverlay()メソッドからpopulate()を取り出し、ループの終了後に呼び出しています。すべてのマーカーがほぼ瞬時に表示されるようになりました。現在の唯一の問題は、ズームを下げるとマップが非常に応答しなくなることです(一度に多くのマーカーが表示されます)。マップがズームアウトされたときにマップ上のマーカーの数を減らす方法を理解しない限り、これに対する解決策はわかりません...何らかの方法でそれらをグループ化することを考えています....現在これに取り組んでいます...

于 2011-01-18T23:22:31.083 に答える
2

このルートの単純化を行う方法は 2 つあります。

1) すべてのポイントのヘディングを取得した場合。point A and Bたとえば、間の見出しの違いが0.5AからBに線を引き、その間の点を無視する場合など、見出しの許容範囲を維持できます。

2) 見出しがない場合。図のように三角形を作ります。h が制限の間にある場合は、その間のポイントをスキップしてから線を引きます。A to B ここに画像の説明を入力

他のルート単純化アルゴリズムを使用することもできます。


も参照してください。

ルートの簡素化 - Douglas Puecker Algorithm

于 2011-01-28T07:34:57.873 に答える
0

マップへの複数のマーカーの読み込みで同じ問題が発生していますが、マーカーの読み込みとマップの表示に多少の遅延がありました。最初にマップを表示し、しばらくするとすべてのマーカーが読み込まれます。これにより、ロードがある程度速くなります。

于 2011-01-17T05:41:41.210 に答える