2011-05-07 4 views
0

위도와 경도를 얻는 데 도움이 필요합니다. 내 말은 : 나는 XMLPullParser를 사용하여 웹에서 위도와 경도를 파싱했다. 이제 가장 큰 문제는 모든 값 (위도와 경도)을 가져 와서지도에 그려 보는 것입니다. 도와주세요!지도에 동적으로 Android 오버레이 표시

여기 내 파서 클래스의 :

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

} 

내가, 내가 INT로 변환 문제를 데 문자열로 모든 것을 얻고 이후, 나는 다시하지만, 좋아, 위도와 경도를 분석하고있다시피 그런 다음이를 OverlayItems 클래스에 제공하십시오. 나는 이것을 너무 복잡하게하지 않기를 바란다.

+0

안녕하세요! 나는 그것이 잠시 였음을 안다. 그러나 나는 여전히 @CornFlakesDK에 대한 빠른 질문을 가지고있다. myList.size가 무엇입니까? Foo는 위도와 경도를 얻는 클래스라고 생각합니까? 이 빌어 먹을 질문에 대해 미안하지만 알 필요가 있습니다. – ito

+0

후속 질문이있는 경우 새로운 질문을 답안에 편집하는 대신 새로운 질문을 게시하는 것이 좋습니다. 더 많은 사람들이 당신의 질문을 그런 식으로보고 대답하려고 노력할 것입니다. – sth

답변

3

나는이 같은 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]); 
    } 
} 

희망이 당신이 찾고 있던 무슨이었다 .

+0

고마워요 @CornflakesDK! – ito

+0

이것은 정말로 도움이됩니다. 대단히 감사합니다. 여기까지는 괜찮습니다.하지만 주된 질문은 "foo.latitude * 1e6"부분입니다. 나는 당신이 어딘가에서 위도와 경도를 얻고 있다는 것을 알고있다. (파싱 된 값이나 하드 코딩 된 값). 내 문제는 파싱 된 lon과 lat를 "foo.latitude ..."로 가져 와서 모든 위치가지도에 그려지도록하는 것입니다. 어쩌면 어떤 코드가 내가 가지고있는 문제를 보는 데 도움이 될 것입니다. 여기 내 파서 수업이 있습니다 : – ito

+0

중복 게시물에 대해 유감스럽게 생각합니다! : 나는 여기에서 새거야! 내 사과 :) – ito

관련 문제