Android многократное наложение динамически на карте - PullRequest
0 голосов
/ 08 мая 2011

Мне нужна помощь в получении лат и лон. Я имею в виду следующее: я выполнил анализ лата и лона из Интернета (используя XMLPullParser). Теперь моя самая большая проблема - получить все значения (широта и долгота) и нанести их на карту. Пожалуйста, помогите!

Вот мой класс Parser:

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;
}

}

Как видите, я хорошо разбираю lat и lon, но опять же, поскольку я получаю все это как строки, у меня возникают проблемы с преобразованием его в int и передачей его классу OverlayItems. Я надеюсь, что я не делаю это слишком сложным.

1 Ответ

3 голосов
/ 08 мая 2011

Я использую ItemizedOverlay так:

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;
    }
}

А потом, когда мне нужно применить элементы к оверлею, я делаю это так:

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]);
    }
}

Надеюсь, это было то, что выискал.

...