나는 몇 주 전에 같은 상황에 직면했다.
각기 다른 드로어 블에 대해 하나의 ItemizedOverlay를 사용하고 ItemizedOverlay에 overlayItems를 추가해야합니다.
가장 편리한 방법은 ItemizedOverlay를 확장하여 필요한 각 스타일에 마커 및 클릭 비헤이비어를 정의하는 것입니다.
두 번째 부분에서는 성능 문제 때문에 한 번에 한 번씩 500 개의 항목을 모두 채우지 않아야합니다. 표시된 맵 범위에 속한 맵 마커에 동적으로 추가하는 시스템을 사용했습니다. 성능이 아주 나쁜 것 같은
private class MarkerItemized_Overlay extends ItemizedOverlay<OverlayItem> {
private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
Context mContext;
public MarkerItemizedOverlay(Drawable marker, Context context) {
super(boundCenterBottom(marker));
mContext = context;
}
public void addOverlay(OverlayItem overlay) {
if (!mOverlays.contains(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(final int index) {
OverlayItem item = mOverlays.get(index);
AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
dialog.setTitle(item.getTitle());
dialog.setMessage(item.getSnippet());
dialog.setNegativeButton("Annuler",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton){}
});
dialog.setPositiveButton("Naviguer",
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton){ showDirections(mOverlays.get(index).getPoint()); }
});
dialog.setInverseBackgroundForced(true);
dialog.show();
return true;
}
public boolean contains(Store store) {
return mOverlays.contains(store);
}
@Override
public boolean onTouchEvent(MotionEvent e, MapView mapView) {
if (e.getAction() == MotionEvent.ACTION_UP) {
GeoPoint newCenter = mapView.getMapCenter();
int minLat, maxLat, minLng, maxLng;
minLat = mapCenter.getLatitudeE6() - mapView.getLatitudeSpan()/2;
maxLat = mapCenter.getLatitudeE6() + mapView.getLatitudeSpan()/2;
minLng = mapCenter.getLongitudeE6() - mapView.getLongitudeSpan()/2;
maxLng = mapCenter.getLongitudeE6() + mapView.getLongitudeSpan()/2;
if (newCenter.getLatitudeE6() > maxLat ||
newCenter.getLatitudeE6() < minLat ||
newCenter.getLongitudeE6() > maxLng ||
newCenter.getLongitudeE6() < minLng)
{
mapCenter = mapView.getMapCenter();
Location mapCenterLoc = new Location(providerName);
mapCenterLoc.setLatitude(newCenter.getLatitudeE6()/1E6);
mapCenterLoc.setLongitude(newCenter.getLongitudeE6()/1E6);
Store[] newClosestStores = storeDB.getClosestStores(mapCenterLoc);
for (int i = 0; i < newClosestStores.length; i++)
if (! itemizedOverlay.contains(newClosestStores[i]))
setMarker(newClosestStores[i]);
}
}
return super.onTouchEvent(e, mapView);
}
}
그것은 한 번지도 500 개 항목을 표시하는 나쁜 생각입니다 : 여기
는 질문 모두에 유용 할 수 있습니다 내 ItemizedOverlay의 조각입니다. 필터링을 시도해보고 그 중 일부만 표시하면 좋은 질문이됩니다. – Craigy특히 특정 확대/축소 수준에서 포인트를 클러스터링하는 것을 고려한 경우 특히 그렇습니다. 더 높은 줌 레벨에서 많은 포인트를 표시해야하는 경우 오버레이를 하나로 클러스터링하고 확대 할 때 클러스터를 확장하는 것이 좋습니다. – topwik