1

我必须使用 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);
    }
}

}

4

1 回答 1

2

您正在创建一个带有latitude但 ' i' 而不是经度的地理点。

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

代替:

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

因此,所有点都非常接近。

我假设您使用 ' i' 在您的位置附近创建单独的点,并且在最终产品中您将使用 ATM 点数据库。我建议您创建一个应该检索 ATM 位置的函数,并出于测试目的返回固定(但真实)的位置,或者在您的 lat/lng 周围随机化。(这也是一种更好的编码实践。)

出于调试目的,请在创建它们之后记录您正在创建的实际点。如果所有 lat/lng 数字看起来都一样,你就会知道发生了什么。如果只记录两点......那是一个不同的问题。:-)

于 2012-09-16T08:18:43.340 回答