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;
}
}