android - Android动态叠加并解析XML经纬度

标签 android markers

我正在编写一个主要使用 Fwix's 解析 XML 数据的 Android 应用程序应用程序接口(interface)。解析部分工作正常。这是我的类(class),Parser:

package com.magadistudio_student_connect_2011.com;

import java.net.URL;
import java.util.ArrayList;

import org.xmlpull.v1.XmlPullParser;

import android.content.res.XmlResourceParser;
import android.util.Xml;

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;

                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());
                                //lat = 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());
                                //lon = Integer.parseInt(parser.getAttributeValue(null,"lng"));
                            }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;
    }
}

这是我的覆盖类,Overlay:

package com.magadistudio_student_connect_2011.com;

import java.util.ArrayList;

import android.app.AlertDialog;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.widget.Toast;

import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.OverlayItem;

public class StudentItemizedOverlay extends ItemizedOverlay<OverlayItem> {
    private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();
    private Context mContext;

    public StudentItemizedOverlay(Drawable defaultMarker) {
          super(boundCenterBottom(defaultMarker));
        // TODO Auto-generated constructor stub
    }
    public void addOverlay(OverlayItem overlay) {
        mOverlays.add(overlay);
        populate();
    }

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

    @Override
    public int size() {
        // TODO Auto-generated method stub
        return mOverlays.size();
    }

    public StudentItemizedOverlay(Drawable defaultMarker, Context context){
          super(boundCenterBottom(defaultMarker));
          mContext = context;
    }

    @Override
    protected boolean onTap(int index) {
        OverlayItem item = mOverlays.get(index);

        // Toast.makeText(StudentItemizedOverlay.this, "Hello", Toast.LENGTH_LONG).show();
        AlertDialog.Builder dialog = new AlertDialog.Builder(mContext);
        dialog.setTitle(item.getTitle());
        dialog.setMessage(item.getSnippet());
        dialog.show();

        return true;
    }
}

这是 BakeryActivity 类:

package com.magadistudio_student_connect_2011.com;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.Toast;

public class BakeryActivity extends Activity implements OnItemClickListener {
    //RSS Feed URL
    private final String CGR_FEED_URL = "http://www.codinggreenrobots.com/episodes/rss.xml";
    //xml new feed
    private final String SCHOOLS_URL = "http://www.fizber.com/xml_data/xml_school_data.xml?state=wa&city=spokane";

    private final String BAKERY_RSS = "apigoeshere";

    //XML Widgets
    private ListView listview_bakery;
    private ProgressBar progress_bar;

    //Arrays of Episode Data
    private ArrayList<String> bakery_name;
    private ArrayList<String> bakery_address;
    private ArrayList<String> bakery_phone;
    private ArrayList<String> bakery_latitude;
    private ArrayList<String> bakery_longitude;
    private ArrayList<String> bakery_state;
    private ArrayList<String> bakery_zip;
    private ArrayList<String> bakery_city;
    /*private ArrayList<String> school_latitude;
    private ArrayList<String> school_longitude;
    */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.bakery_view);

        //XML Widgets by ID
        listview_bakery = (ListView) findViewById(R.id.listview_bakeries);
        listview_bakery.setOnItemClickListener(this);
        /* ColorDrawable sage = new ColorDrawable(this.getResources().getColor(R.drawable.colors));
        listview_bakery.setDivider(sage);
        listview_bakery.setDividerHeight(1);*/

        progress_bar = (ProgressBar) findViewById(R.id.progress_bar_bakery);
        //Make Progress Bar Invisible
        progress_bar.setVisibility(ProgressBar.INVISIBLE);

        //Initialize Arrays
        bakery_name = new ArrayList<String>();
        bakery_address = new ArrayList<String>();

        bakery_phone = new ArrayList<String>();
        bakery_latitude = new ArrayList<String>();
        bakery_longitude = new ArrayList<String>();
        bakery_state = new ArrayList<String>();
        bakery_zip = new ArrayList<String>();
        bakery_city  = new ArrayList<String>();
        //school_latitude = new ArrayList<String>();
        //school_longitude = new ArrayList<String>();

        downloadBakeries(BAKERY_RSS);
    }

    private void downloadBakeries(String Url) {
        //Make Progress Bar Visible While Downloading Feed
        progress_bar.setVisibility(ProgressBar.VISIBLE);
        Log.d("CGRParser", "Downloading Feed");
        //Start an ASync Thread to take care of Downloading Feed
        new DownloadBakeries().execute(Url);
    }

    private class DownloadBakeries extends AsyncTask<String, Integer, ArrayList<Bakery>> {
        @Override
        protected ArrayList<Bakery> doInBackground(String... url) {

            //Download and Parse Feed
            Parser parser = new Parser();
            ArrayList<Bakery> bakeries = new ArrayList<Bakery>();
            bakeries = parser.parse(url[0]);

            return bakeries;
        }

        @Override
        protected void onPostExecute(ArrayList<Bakery> result) {
            //Feed has been Downloaded and Parsed, Display Data to User
            Log.d("CGRParser", "Feed Download Complete");
            //Toast.makeText(BakeryActivity.this, "onPost", Toast.LENGTH_SHORT).show();

            displayBakeries(result);
        }
    }

    private void displayBakeries(ArrayList<Bakery> bakeries) {
        //Create String Arrays to seperate titles and dates
        Log.d("CGRParser", "Displaying Episode Titles To User");
        ArrayList<String> bakery_name = new ArrayList<String>();
        ArrayList<String> bakery_address = new ArrayList<String>();
        ArrayList<String> bakery_phone = new ArrayList<String>();
        ArrayList<String> bakery_latitude = new ArrayList<String>();
        ArrayList<String> bakery_longitude = new ArrayList<String>();
        ArrayList<String> bakery_state = new ArrayList<String>();
        ArrayList<String> bakery_zip = new ArrayList<String>();
        ArrayList<String> bakery_city = new ArrayList<String>();
        //ArrayList<String> school_longitude = new ArrayList<String>();

        for (Bakery bakery : bakeries) {
            //Log.d("CGRParser", "Episode Title: " + episode.getTitle());
            bakery_phone.add(bakery.getPhone());
            bakery_name.add(bakery.getPlace_name());
            bakery_address.add(bakery.getAddress());
            bakery_latitude.add(bakery.getLatitude());
            bakery_longitude.add(bakery.getLongitude());
            bakery_state.add(bakery.getState());
            bakery_zip.add(bakery.getZip());
            bakery_city.add(bakery.getCity());
            //school_longitude.add(episode.getLongitude());
        }

        //Toast.makeText(BakeryActivity.this, "DisplayBakeries", Toast.LENGTH_SHORT).show();

        this.bakery_phone     = bakery_phone;
        this.bakery_name      = bakery_name;
        this.bakery_address   = bakery_address;
        this.bakery_latitude  = bakery_latitude;
        this.bakery_longitude = bakery_longitude;
        this.bakery_state     = bakery_state;
        this.bakery_zip       = bakery_zip;
        this.bakery_city      = bakery_city;

        //int myNum = 0; try { myNum = Integer.parseInt(bakery_latitude.getText().toString()); } catch(NumberFormatException nfe) { System.out.println("Could not parse " + nfe); }

        //Create a ListAdapter to Display the Titles in the ListView
        ListAdapter adapter = new ArrayAdapter<String>(this, R.layout.bakery_row, R.id.title, bakery_name);
        listview_bakery.setAdapter(adapter);

        //Set Progress Bar Invisible since we are done with it
        progress_bar.setVisibility(ProgressBar.INVISIBLE);
    }

    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
         startActivity(new Intent(BakeryActivity.this, Map.class));
        //Display the Title and Date to the user when they click on an episode
        Toast.makeText(this, "Name:" + bakery_name.get(position) + "\nphone: " + bakery_phone.get(position)+
                "\nState: "+ bakery_state.get(position) + "\nAddress: "+ bakery_address.get(position)
                + "\nZip: "+ bakery_zip.get(position)+ "\nLat: " +bakery_latitude.get(position)+ "\nlon: "+ bakery_longitude.get(position), Toast.LENGTH_LONG).show();
    }
}

我能够很好地完成 XML 解析工作,但问题是我无法弄清楚如何获取我解析过的“lat”和“lng”(然后放入字符串的 ArrayList 中)和将它们转换为整数,以便我可以在 map 上显示相应纬度和经度位置的标记。

最佳答案

好的,Android 的 Google Maps native 位置 API 使用小数点后 6 位整数。因此,您想删除“。”从您解析出的整数字符串中。然后,只需执行 parseInt 即可获得坐标。这样,将它们放入 GeoPoints 并将它们添加到叠加层。应该没问题。

除非我在这里遗漏了什么,这是可能的。

关于android - Android动态叠加并解析XML经纬度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6224428/

相关文章:

android - 获取 SQLiteDatabase 中的特定行不起作用

android - 为什么下面会拖Fragment Shader的性能(Open GL ES 2.0)

android - 代码优化。 (建筑学)

zooming - map 盒 : how to fit the zoom to all the markers of a map?

java - eclipse PDE : Custom QuickFix only available in Problems View?

python - 条件标记 matplotlib

android - Horizo​​ntalScrollView,自动滚动结束动画

android - 如何正确组合两个实时数据对象

android - 如何在 Android 中使用 Google map 按类别隐藏/显示标记组?

openlayers - 将数据添加到开放图层标记