2012-07-20 104 views
1

我必须使用JSON解析制作多标记谷歌地图。任何人在帮助它的代码。这样我就可以获得一个想法。我所做的活动并不完全符合我的要求。 这是我的活动使用JSON的谷歌地图中的多个标记

public class MapsActivity extends MapActivity{ 
private MapController mapControll; 
private GeoPoint geoPoint=null; 
private MapView mapview; 
private MyItemizedOverlay userPicOverlay; 
private MyItemizedOverlay nearPicOverlay; 
private Drawable userPic,atmPic; 
private OverlayItem nearatms[] = new OverlayItem[50]; 
public static Context context; 
public double latitude; 
public double longitude; 


private List<String> lat = new ArrayList<String>(); 
private List<String> lon = new ArrayList<String>(); 
private String[] get_lati; 
private String[] get_long; 

@Override 
protected void onCreate(Bundle icicle) { 
    // TODO Auto-generated method stub 
    super.onCreate(icicle); 
    context = getApplicationContext(); 
    setContentView(R.layout.map); 
    lat.clear(); 
    lon.clear(); 
    Intent in = getIntent(); 
    if(in!=null){ 
    get_lati = in.getStringArrayExtra("LAT_KEY"); 
    get_long = in.getStringArrayExtra("LONG_KEY"); 
    System.out.println("lat===="+get_lati.length+" lon==="+get_long.length); 
    } 
    for(int i = 0;i<get_lati.length;i++){ 
     String lt = null; 
     String ln = null; 
     lt =get_lati[i]; 
     ln =get_long[i]; 

     System.out.println("lt=="+lt+"==ln=="+ln); 
    } 
    showMap(); 
} 

public void showMap() { 
    // TODO Auto-generated method stub 

    try { 
     double lat_dbl = Double.parseDouble(get_lati[0]); 
     double lon_dbl = Double.parseDouble(get_long[0]); 
     geoPoint = new GeoPoint((int)(lat_dbl * 1E6),(int)(lon_dbl * 1E6));  
     mapview = (MapView)findViewById(R.id.mapView); 
     mapControll= mapview.getController(); 
     mapview.setBuiltInZoomControls(true); 
     mapview.setStreetView(true); 
     mapControll.setZoom(16); 
     mapControll.animateTo(geoPoint); 

     userPic = this.getResources().getDrawable(R.drawable.pin); 
     userPicOverlay = new MyItemizedOverlay(userPic); 
     OverlayItem overlayItem = new OverlayItem(geoPoint, "I'm Here!!!", null); 
     userPicOverlay.addOverlay(overlayItem); 
     mapview.getOverlays().add(userPicOverlay); 


     atmPic = this.getResources().getDrawable(R.drawable.pin); 
     nearPicOverlay = new MyItemizedOverlay(atmPic); 
     for (int i = 0; i < 5; i++) { 
      nearatms[i] = new OverlayItem(new GeoPoint((int)((latitude) * 1E6), i),"Name", null);//just check the brackets i just made change here so.... 
      nearPicOverlay.addOverlay(nearatms[i]); 
     } 
     mapview.getOverlays().add(nearPicOverlay); 
     //Added symbols will be displayed when map is redrawn so force redraw now 
     mapview.postInvalidate(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

@Override 
protected boolean isRouteDisplayed() { 
    // TODO Auto-generated method stub 
    return false; 
} 



public class MyItemizedOverlay extends ItemizedOverlay<OverlayItem> { 

    private ArrayList<OverlayItem> myOverlays ; 

    public MyItemizedOverlay(Drawable defaultMarker) { 
     super(boundCenterBottom(defaultMarker)); 
     myOverlays = new ArrayList<OverlayItem>(); 
     populate(); 
    } 

    public void addOverlay(OverlayItem overlay){ 
     myOverlays.add(overlay); 
     populate(); 
    } 

    @Override 
    protected OverlayItem createItem(int i) { 
     return myOverlays.get(i); 
    } 

    // Removes overlay item i 
    public void removeItem(int i){ 
     myOverlays.remove(i); 
     populate(); 
    } 

    // Returns present number of items in list 
    @Override 
    public int size() { 
     return myOverlays.size(); 
    } 


    public void addOverlayItem(OverlayItem overlayItem) { 
     myOverlays.add(overlayItem); 
     populate(); 
    } 


    public void addOverlayItem(int lat, int lon, String title) { 
     try { 
      GeoPoint point = new GeoPoint(lat, lon); 
      OverlayItem overlayItem = new OverlayItem(point, title, null); 
      addOverlayItem(overlayItem);  
     } catch (Exception e) { 
      // TODO: handle exception 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    protected boolean onTap(int index) { 
     // TODO Auto-generated method stub 
     String title = myOverlays.get(index).getTitle(); 
     //Toast.makeText(MapActivity.this, title, Toast.LENGTH_LONG).show(); 
     return super.onTap(index); 
    } 
} 

}

+0

你的问题是什么? – Marcelo 2012-07-20 07:41:10

+0

我的代码是在后台获取纬度日志,但它只显示地图上的两个针脚。 – 2012-07-20 07:49:39

回答

2

您正在创建与latitude一个GeoPoint但 'i',而不是经度。

new GeoPoint((int)((latitude) * 1E6), i) 

代替:

new GeoPoint((int)((latitude) * 1E6), (int)((longitude) * 1E6)) // + some variation based on i 

因此所有的点非常接近下降到对方。

我假设您使用'i'为了在您的位置附近创建单独的点,并且在最终产品中您将使用ATM点数据库。我建议你创建一个应该检索自动取款机位置的函数,并且为了测试的目的,要么返回固定的(但是真实的)位置,要么围绕你的经纬度随机化。 (这也是一个更好的编码实践。)

为了调试,登录实际点要创建,后您创建它们。如果所有的纬度/经度数字看起来都一样,你就会知道发生了什么。如果只记录两点......这是一个不同的问题。 :-)