2011-12-02 5 views
2

Mapview, Overlay 및 ItemizedOverlay에 대한 경험이 매우 부족합니다. 오버레이 및 itemizedOverlays에 하나의 드로어 블을 사용하는 몇 가지 간단한 코드 예제를 보았습니다. 그러나 이러한 요구 사항에 어떻게 접근해야하는지 확신 할 수 없습니다.지도 뷰에 드로어 블을 두 개 이상 추가해야합니다 (예 :지도 센터의 스타 아이콘 및 다른 오버레이 항목에 대한 다른 아이콘)하지만 하나는 unclickable (스타) 싶습니다. 오버레이와 ItemizedOverlay를 모두 사용해야합니까?지도보기에 다중 drawable 사용

내 다음 문제는 발표의 문제입니다.지도에 표시 할 항목이 500 개인 경우 해당 정보를 표시하는 실제 방법은 무엇입니까? 다시 한 번지도 응용 프로그램을 개발하고 사용하는 데 경험이 거의 없습니다.

+1

그것은 한 번지도 500 개 항목을 표시하는 나쁜 생각입니다 : 여기

는 질문 모두에 유용 할 수 있습니다 내 ItemizedOverlay의 조각입니다. 필터링을 시도해보고 그 중 일부만 표시하면 좋은 질문이됩니다. – Craigy

+0

특히 특정 확대/축소 수준에서 포인트를 클러스터링하는 것을 고려한 경우 특히 그렇습니다. 더 높은 줌 레벨에서 많은 포인트를 표시해야하는 경우 오버레이를 하나로 클러스터링하고 확대 할 때 클러스터를 확장하는 것이 좋습니다. – topwik

답변

1

나는 몇 주 전에 같은 상황에 직면했다.

각기 다른 드로어 블에 대해 하나의 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); 
    } 
} 
관련 문제