2011-04-05 16 views
3

私はそれにロードしたい何千ものアイテムを持つマップビューを持っています。明らかに私はビューを作成するときにそれらをすべて読み込むことができません。 私は非同期に現在表示されている内容に応じてそれらをロードする必要があることを推測アンドロイドはオーバーレイアイテムの非同期読み込みを行います

..

どのように私は、画面上に表示された地図の部分に位置する項目のみを読み込むことができますか?

答えて

8

AsyncTaskを使用して、画面ごとに個別のレイヤーを読み込みます。 MapView APIを使用して現在表示されている地図の緯度/経度を取得します。バックエンドで緯度/経度の境界ボックスを送信して、必要な項目を取得します。だから、おおよそ次のようなものになります:

public class LoadMapItems extends AsyncTask<Integer,Integer,List<ItemizedOverlay>> { 
    private MapView view; 

    public LoadMapItems(MapView view) { 
     this.view = view; 
    } 

    public List<ItemizedOverlay> doInBackground(Integer... params) { 
     int left = params[0]; 
     int top = params[1]; 
     int right = params[2]; 
     int bottom = params[3]; 

     return convertToItemizedOverlay(someService.loadSomething(left, top, right, bottom)); 
    } 

    private List<ItemizedOverlay> convertToItemizedOverlay(List<SomeObject> objects) { 
     // ... fill this out to convert your back end object to overlay items 
    } 

    public void onPostExecute(List<ItemizedOverlay> items) { 
     List<Overlay> mapOverlays = mapView.getOverlays(); 
     for(ItemizedOverlay item : items) { 
     mapOverlays.add(item); 
     } 
    } 
} 

// somewhere else in your code you do this: 

GeoPoint center = someMap.getMapCenter(); 
new LoadMapItems(someMap).execute( 
     center.getLongitude() - someMap.getLongitudeSpan()/2, 
     center.getLatitude() - someMap.getLatitudeSpan()/2, 
     center.getLongitude() + someMap.getLongitudeSpan()/2, 
     center.getLatitude() + someMap.getLatitudeSpan()/2); 
+0

ありがとう!これは非常に役に立ちます。 しかし、現在表示されている地図の変更をどのように処理できますか? – Matteo

+0

MapViewは、誰かが移動したときにイベントを送出します。このイベントハンドラ中、このAsyncTaskを使用してバックエンドサービスからデータをロードします。私はそれが動作したら、それが動作したら、データ構造(おそらくMap >)でこれらのロードをキャッシュすることを検討したいと思います。それは少しトリッキーになるが、それははるかに速くすることができます。次に、ユーザーがマップをドラッグして、そのタイルを既にロードしているかどうかを確認するときに、そのデータ構造をチェックします。 – chubbsondubs

+0

...実際には、オーバーレイを固定グリッドセルに割り当てて、 MapViewの現在の緯度/経度と交差するグリッドセルを示しています。これにより、固定グリッドセグメントのキャッシュが容易になります。可視領域外に存在するフィーチャを読み込むことはできますが、それは小さくなります。ロードするグリッド・セルの最大数は4です。データベースが固定キーで索引付けできるため、バックエンドで最適化する方が簡単です。 lat/longをグリッドセル番号に変換し、そのグリッドセル番号に割り当てられた機能をロードするだけで済みます。 – chubbsondubs

関連する問題