Search code examples
androiddictionaryoverlayitem

Android multiple overlay dynamically on map


I would like some help regarding getting the lat and lon. What I mean is: I have lat and lon parsed from the web (using XMLPullParser). Now, my biggest problem is to get all the values (lat and lon) and plot them on the map. Please, help!

Here's my Parser class:

public class Parser {

//Feed Parsing Method
public ArrayList<Bakery> parse(String url) {

    //Array of Episode Objects
    ArrayList<Bakery> bakeries = null;

    try {
        //Encode the URL into a URL Object
        URL bakery_feed_url = new URL(url);

        //Open a Connection to the feed
        XmlPullParser parser = Xml.newPullParser();

        try {
            parser.setInput(bakery_feed_url.openConnection().getInputStream(), null);
        } finally {

        }

        int event_type = parser.getEventType();
        Bakery current_bakery = null;
        boolean done = false;

        //Parse the feed, start reading throughout the feed from top to bottom
        while (event_type != XmlResourceParser.END_DOCUMENT && !done){

            String tag_name = null;
          /*  
            lat = Integer.parseInt(parser.getAttributeValue(null,"lat"));
            lon = Integer.parseInt(parser.getAttributeValue(null,"lon"));
            grade = Integer.parseInt(parser.getAttributeValue(null,"grade"));
            */
            switch (event_type){
                //Found the start of the feed
                case XmlResourceParser.START_DOCUMENT:
                    bakeries = new ArrayList<Bakery>();
                    break;
                //Found a start tag
                case XmlResourceParser.START_TAG:
                    //apply the data to our Episode object based on the tag name
                    tag_name = parser.getName();
                    if(tag_name.equalsIgnoreCase("place")){
                        current_bakery = new Bakery();
                    }else if(current_bakery != null){
                        if (tag_name.equalsIgnoreCase("phone_number")){
                            current_bakery.setPhone(parser.nextText());
                        }else if(tag_name.equalsIgnoreCase("city")){
                            current_bakery.setCity(parser.nextText());
                        }else if(tag_name.equalsIgnoreCase("province")){
                            current_bakery.setState(parser.nextText());
                        }else if(tag_name.equalsIgnoreCase("address")){
                            current_bakery.setAddress(parser.nextText());
                        }else if(tag_name.equalsIgnoreCase("lat")){
                            current_bakery.setLatitude(parser.nextText());
                             //double lat = Integer.parseInt(parser.getAttributeValue(null,"lat"));
                            // current_bakery.setLater(Integer.parseInt(parser.getAttributeValue(null, "lat")));
                        }else if(tag_name.equalsIgnoreCase("postal_code")){
                            current_bakery.setZip(parser.nextText());
                        }else if(tag_name.equalsIgnoreCase("lng")){
                            current_bakery.setLongitude(parser.nextText());
                        }else if(tag_name.equalsIgnoreCase("name")){
                            current_bakery.setPlace_name(parser.nextText());
                        }
                    }

                    break;
                //An end tag has been reached
                case XmlResourceParser.END_TAG:
                    tag_name = parser.getName();
                    //End of an Episode Item
                    if (tag_name.equalsIgnoreCase("place") && current_bakery != null){
                        bakeries.add(current_bakery);
                    //Reached the end of all bakeries, no more data to collect
                    } else if (tag_name.equalsIgnoreCase("places")){
                        done = true;
                    }
                    break;
            }
            event_type = parser.next();
        }
    } catch (Exception e) {
        throw new RuntimeException(e);
    }

    //Return the Episode Array
    return bakeries;
}

}

As you see, I am parsing the lat and the lon alright, but again, since I am getting it all as strings, I am having troubles converting it into int and then feed it to the OverlayItems class. I hope I am not making this too complicated.


Solution

  • I use ItemizedOverlay like this:

    import java.util.ArrayList;
    
    import android.app.AlertDialog;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.graphics.drawable.Drawable;
    
    import com.google.android.maps.OverlayItem;
    
    public class ItemizedOverlay extends com.google.android.maps.ItemizedOverlay<OverlayItem> {
    
        private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
        private Context mContext;
    
        public csItemizedOverlay(Drawable defaultMarker) {
            super(boundCenterBottom(defaultMarker));
        }
    
        public csItemizedOverlay(Drawable defaultMarker, Context context) {
              super(boundCenterBottom(defaultMarker));
              mContext = context;
        }
    
        public void addOverlay(OverlayItem 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(int index) {
          OverlayItem item = mOverlays.get(index);
          AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
          dialog.setTitle(item.getTitle());
          dialog.setMessage(item.getSnippet());
          dialog.setPositiveButton("Ok", new DialogInterface.OnClickListener() {
              public void onClick(DialogInterface dialog, int id) {
              }
          });
          dialog.show();
          return true;
        }
    }
    

    And then when I need to apply the items to the overlay I do it like this:

    public void drawOverlay(MapView mapView) {
        List<Overlay> mapOverlays = mapView.getOverlays();
        mapOverlays.clear();
        mapView.invalidate();
    
        int zoomLevel = mapView.getZoomLevel();
    
        Drawable drawable = this.getResources().getDrawable(R.drawable.myDrawable);
        ItemizedOverlay itemizedoverlay[] = new ItemizedOverlay[myList.size()];
        for (int i = 0; i < myList.size(); i++) {
            Foo foo = myList.get(i);
            GeoPoint point = new GeoPoint((int)(foo.lattitude * 1E6),
                                          (int)(foo.longtitude * 1E6));
    
            OverlayItem overlayItem = new OverlayItem(point, foo.titel, foo.description);
            itemizedoverlay[i].addOverlay(overlayItem);
            mapOverlays.add(itemizedoverlay[i]);
        }
    }
    

    Hope this was what you was looking for.