0

こんにちは、すべてのボディiamは、数百のマーカーを含むGoogleマップを含むAndroidアプリケーションを使用しています。ここでは、マップ上のすべてのマーカーを表示できます。ただし、ここでの要件は、Googleマップの最初の5つのマーカーのみを表示する必要があることです。最大ズームレベル。緯度と経度が現在表示されている5つのマーカーの間にあるマーカーは免除されます。この要件は、マーカーが数千あると地図が曇ってしまうためです。以下は私のコードです。

public void displayMapView(final Vector<MapData> retVector){

  mapOverlays=mapView.getOverlays();
  Drawable marker = getResources().getDrawable(R.drawable.map_pin);
  marker.setBounds((int) (-marker.getIntrinsicWidth() / 2),-marker.getIntrinsicHeight(),(int) (marker.getIntrinsicWidth() / 2), 0);
  funPlaces = new MyItemizedOverlay(marker,mapView);
  mapView.getOverlays().add(funPlaces);
  GeoPoint pt = funPlaces.getCenterPt();
  int latSpan=funPlaces.getLatSpanE6();
  int longSpan=funPlaces.getLonSpanE6();
  mc=mapView.getController();
  mc.setCenter(pt);
  mc.zoomToSpan((int)(latSpan*1.5),(int)(longSpan*1.5));
  //mc.zoomToSpan((int)(minLatitude-maxLatitude),(int)(minLatitude-maxLatitude));

}

@Override
protected boolean isLocationDisplayed(){
  return false;
}

@Override
protected boolean isRouteDisplayed(){
  return false;
}

public class MyItemizedOverlay extends BalloonItemizedOverlay<OverlayItem> {
  private ArrayList<OverlayItem> m_overlays = new ArrayList<OverlayItem>();
  @SuppressWarnings("unused")
  private Context c;
  private GeoPoint center = null;   
  public MyItemizedOverlay(Drawable marker,MapView mapView){
    super(boundCenter(marker),mapView);
    c = mapView.getContext();
    try{
        String name="",cusine="",distance="",price="",popUpDataNew="";
        for(int pinret=0;pinret<mpDt.size();pinret++){
          MapData retMapData=(MapData)mpDt.get(pinret);
          resId=retMapData.getId();
          name=retMapData.getName();
          cusine=retMapData.getCusine();
          distance=retMapData.getDistance();
          price=retMapData.getPrice();
          popUpDataNew=name+"/"+cusine+"/"+distance+"/"+price;
          try{
            double lat=Double.parseDouble(retMapData.getLatitude());
            double lon=Double.parseDouble(retMapData.getLongitude());
            GeoPoint pointNew= new GeoPoint((int)(lat*1E6),(int)(lon*1E6)); 
            m_overlays.add(new OverlayItem(pointNew,popUpDataNew,resId));
            populate();
          }catch(NumberFormatException nfe){
           nfe.printStackTrace();
          }
        }
       }catch(Exception e){
         e.printStackTrace();
       }    
  }
  public GeoPoint getCenterPt(){
    if(center == null){
      int northEdge = -90000000;
      int southEdge = 90000000;
      int eastEdge = -180000000;
      int westEdge = 180000000;
      Iterator<OverlayItem> iter = m_overlays.iterator();
      while(iter.hasNext()){
        GeoPoint pt = iter.next().getPoint();
        if(pt.getLatitudeE6() > northEdge)
          northEdge = pt.getLatitudeE6();
        if(pt.getLatitudeE6() < southEdge)
          southEdge = pt.getLatitudeE6();
        if(pt.getLongitudeE6() > eastEdge)
          eastEdge = pt.getLongitudeE6();
        if(pt.getLongitudeE6() < westEdge)
          westEdge = pt.getLongitudeE6();
      }
      center = new GeoPoint((int) ((northEdge + southEdge) / 2),(int) ((westEdge + eastEdge) / 2));
     }
        return center;
  }

どんな提案でも大歓迎です。

ありがとうございます。それでは、お元気で、

ベンカット

4

2 に答える 2

1

最初の5つだけを描くことと、最初の5つだけを追加することには違いがあります。最初の5つだけを描くことについてはわかりませんが、5つだけ追加するために、変更pinret < mpDt.size()できpinret < 5ませんか?明らかに、mpDtに含まれるアイテムが5未満の場合、これにより問題が発生する可能性があるため、境界チェックを行う必要があります。

于 2012-04-24T12:50:24.380 に答える
0

これをで変更します

 for(int pinret=0;pinret<mpDt.size();pinret++){ 
}

これ、

 int size = mpDt.size();
 if(size > 5)
    size =5 ;
 for(int pinret=0;pinret<size;pinret++){ 
}
于 2012-04-24T12:53:44.600 に答える