2012-10-15 4 views
0

지도에 점을 그리기 위해 내 GeoPoint를 itemizedOverlay 배열에 추가하려고했습니다. 불행히도,이 시점에서 응용 프로그램이 충돌합니다.ItemizedOverlay 배열에 지포 포인트를 추가하지 못했습니다.

내 코드 : package com.example.phooogle;

public class GoogleMapsAppActivity extends MapActivity { 

    private MapView mapView; 
    private MapController mc; 
    private MyLocationOverlay myLocationOverlay; 
    private myMapService mms; 
    String[] ms; 
    private LocationManager lm; 
    private LocationListener locationListener; 
    private MyLocationOverlay myLocOverlay; 

    GeoPoint p; 
    GeoPoint progress1[]; 
    List<GeoPoint> geoPointsArray = new ArrayList<GeoPoint>(); 

    int latitude; 
    int longitude; 
    private ProgressDialog progress; 
    MotionEvent event; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 

     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_cool_map); 

     progress= new ProgressDialog(this); 
     progress.setIndeterminate(true); 
     progress.setMessage("I am thinking"); 

     InitTask init_task= new InitTask(); 
     init_task.execute("144.963620993985", "-37.8140023779914", "20", "Litter Bin"); 
try { 
     String[] arrs = init_task.strArr2; 
     //Log.d(" print points", " Array Size " + arrs.length); 



     Drawable makerDefault = this.getResources().getDrawable(R.drawable.poke); 
     MirItemizedOverlay itemizedOverlay = new MirItemizedOverlay(makerDefault); 

     for(int j=0; j<arrs.length ;j++) 
     { 
      double y =0; 
      double x =0; 

      if(j == 1) 
      { 
       /// x 
       //Log.d("Results", "2If statem " + strArr2[j]); 
       x = Double.parseDouble(arrs[j]); 
       y = Double.parseDouble(arrs[j+1]); 

       //Log.d(" print points", "lat " + x + " long" + y); 

       itemizedOverlay.addOverlayItem((int) x , (int) y , "La trobe"); 
       mapView.getOverlays().add(itemizedOverlay); 

      } 


     } 

     MapController mc = mapView.getController(); 
     mc.setCenter(new GeoPoint((int) (1E6 * -37.720754), (int) (1E6 * 145.048798))); // Some where . 
     mc.zoomToSpan(itemizedOverlay.getLatSpanE6(), itemizedOverlay.getLonSpanE6()); 
} finally {} 

     initMap(); 
     initMyLocation(); 
     // theRouteDraw(); 
     /* 

     Drawable makerDefault = this.getResources().getDrawable(R.drawable.poke); 
     MirItemizedOverlay itemizedOverlay = new MirItemizedOverlay(makerDefault); 
     itemizedOverlay.addOverlayItem(init_task.geoPointsArray, "La trobe"); 
     mapView.getOverlays().add(itemizedOverlay); 

     MapController mc = mapView.getController(); 
     mc.setCenter(new GeoPoint((int) (1E6 * -37.720754), (int) (1E6 * 145.048798))); // Some where . 
     mc.zoomToSpan(itemizedOverlay.getLatSpanE6(), itemizedOverlay.getLonSpanE6()); 


     for (int i = 0; i < geoPointsArray.size() ; i++) 
     { 
      Log.d(" print points", " points " + geoPointsArray.get(i)); 
     }*/ 
     // Log.d(" print points", " Size " + init_task.geoPointsArray.size()); 
     /* 

     mapView = (MapView) findViewById(R.id.mapview); 
     List<Overlay> mapOverlays = mapView.getOverlays(); 
     //add any icon here for the marker 
     Drawable drawable = GoogleMapsAppActivity.this.getResources().getDrawable(R.drawable.poke); 
     MapViewItemizedOverlay itemizedOverlay = new MapViewItemizedOverlay(drawable,this); 
     //use your array here instead 
     //GeoPoint point1 = new GeoPoint(lat,lng); 
     OverlayItem overlayitem1 = new OverlayItem(point1, "Info", "You are here!"); 
     itemizedOverlay.addOverlay(overlayitem1); 
     mapOverlays.add(itemizedOverlay); 
     */ 


    } 


    private void initMap() 
    { 
     mapView = (MapView) findViewById(R.id.mapview); 
     mapView.setBuiltInZoomControls(true); 
     // mapView.setStreetView(true); 
     mc = mapView.getController(); 
    } 
    public void theRouteDraw(GeoPoint p){ 
     mc.animateTo(p); 
     mc.setZoom(13);     
     mapView.invalidate(); 
     mapView.setSatellite(true); 

    } 

    private void initMyLocation() { 
     myLocOverlay = new MyLocationOverlay(this, mapView); 
     myLocOverlay.enableMyLocation(); 
     mapView.getOverlays().add(new myLocOverlay()); 

    } 

    @Override 
    protected boolean isRouteDisplayed() { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    class myLocOverlay extends Overlay{ 

     public void draw(Canvas canvas, MapView mapv, boolean shadow){ 
      super.draw(canvas, mapv, shadow); 

      Projection projection = mapView.getProjection(); 
      Path p1 = new Path(); 
      for (int i = 0; i < geoPointsArray.size(); i++) { 
       if (i == geoPointsArray.size() - 1) { 
        break; 
       } 
       Point from = new Point(); 
       Point to = new Point(); 
       projection.toPixels(geoPointsArray.get(i), from); 
       projection.toPixels(geoPointsArray.get(i + 1), to); 

       p1.moveTo(from.x, from.y); 
       p1.lineTo(to.x, to.y); 

      } 

      Paint mPaint = new Paint(); 
      mPaint.setStyle(Style.STROKE); 
      mPaint.setColor(Color.BLACK); 
      mPaint.setAntiAlias(true); 
      mPaint.setStrokeWidth(4); 
      canvas.drawPath(p1, mPaint); 
      super.draw(canvas, mapView, shadow); 

     } 


    } 

    private class InitTask extends AsyncTask<String, GeoPoint, List<GeoPoint>> { 
     List<GeoPoint> geoPointsArray = new ArrayList<GeoPoint>(); 

     GeoPoint p; 
     private ProgressDialog progressDialog; 
     private String rst = " " ; 
     private String[] strArr1; 
     private String[] strArr2; 

     protected void onPreExecute() { 
      //progress.show(); 
     } 


     @Override 
     protected List<GeoPoint> doInBackground(String... arg0) { 


      String result = ""; 
      int responseCode = 0; 
      int executeCount = 0; 
      HttpResponse response; 

      StringBuilder sb = new StringBuilder(); 
      String line; 
      try 
      { 
       HttpClient client = new DefaultHttpClient(); 
       HttpGet httppost = new HttpGet("http://xxxx/ccvo/mel-asset-data/query.php?lon="+ arg0[0].toString() + "&lat="+ arg0[1].toString() +"&within=" + arg0[2].toString() + "&keyword="+ arg0[3].toString().replace(" ", "%20")); 

       do 
       { 
        // progressDialog.setMessage("Passing paratmeters.. ("+(executeCount+1)+"/5)"); 
        // Execute HTTP Post Request 
        executeCount++; 
        response = client.execute(httppost); 
        responseCode = response.getStatusLine().getStatusCode();       

       } while (executeCount < 5 && responseCode == 408); 

       BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent())); 
       while ((line = rd.readLine()) != null) 
       { 
        result = line.trim(); 
        sb.append(line); 


       } 
      }catch (Exception e2) { 
       responseCode = 408; 
       e2.printStackTrace(); 
      } 
      rst = result.toString(); 


      // splits everything   
      if(rst != null && rst.length() > 0) 
      { 
       strArr1 = rst.split("\\|"); 
       for(int i=0;i<strArr1.length;i++) 
       { 
        // Log.d("Results", "Array size1.1 " + i); 
        Log.v("Results", "Array split1.2 " + strArr1[i]); 
        if(strArr1[i] != null && strArr1[i].length() >0 && strArr1[i].contains(",")) 
        { 

         strArr2 = strArr1[i].split(","); 
         for(int j=0; j<strArr2.length ;j++) 
         { 
          double y =0; 
          double x =0; 

          if(j == 1) 
          { 
           /// x 
           //Log.d("Results", "2If statem " + strArr2[j]); 
           x = Double.parseDouble(strArr2[j]); 
           y = Double.parseDouble(strArr2[j+1]); 
           geoPointsArray.add(new GeoPoint((int)(x*1e6), (int)(y*1e6))); 
           Log.d("geoPointsArray", "geoPointsArray " + geoPointsArray.toString()); 


          } 


         } 
        } 
       } 
      } 



      return geoPointsArray; 
     } 


     @Override 
     protected void onProgressUpdate(GeoPoint... progress1) { 


      theRouteDraw(progress1[0]); 

      geoPointsArray.add(progress1[0]); 

      int lon=progress1[0].getLongitudeE6(); 
      int lat=progress1[0].getLatitudeE6(); 

      GeoPoint p2=new GeoPoint(lon,lat); 

      geoPointsArray.add(p2); 

      initMyLocation(); 

     } 
     @Override 
     protected void onPostExecute(List<GeoPoint> geoPointsArray) 
     { 
      //super.onPostExecute(geoPointsArray); 
      progress.dismiss(); 



      //startActivity(i); 
      //i.getCharExtra("Geop", geoPointsArray); 

      Log.d("Lista", " check " + geoPointsArray.size()); 
      // theRouteDraw(geoPointsArray); 


     } 



    } 



} 

내 MirItemizedOverlay 등급 :

class MirItemizedOverlay extends ItemizedOverlay { 

    private List<OverlayItem> mOverlays = new ArrayList<OverlayItem>(); 

    public MirItemizedOverlay(Drawable defaultMarker) { 
     super(boundCenterBottom(defaultMarker)); 
     // TODO Auto-generated constructor stub 
    } 
    @Override 
    protected OverlayItem createItem(int i) { 
     return mOverlays.get(i); 
    } 

    @Override 
    public int size() { 
     return mOverlays.size(); 
    } 

    public void addOverlayItem(OverlayItem overlayItem) { 
     mOverlays.add(overlayItem); 
     populate(); 
    } 


    @Override 
    public boolean onTouchEvent(MotionEvent event, MapView mapView) 
    { 
     //---when user lifts his finger--- 
     if (event.getAction() == 1) { 
      GeoPoint p = mapView.getProjection().fromPixels(
        (int) event.getX(), 
        (int) event.getY()); 
      Toast.makeText(getBaseContext(), 
        p.getLatitudeE6()/1E6 + "," + 
          p.getLongitudeE6() /1E6 , 
          Toast.LENGTH_SHORT).show(); 
     } 
     return false; 
    } 

    private Context getBaseContext() { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    public void addOverlayItem(int lat, int lon, String title) { 
     GeoPoint point = new GeoPoint(lat, lon); 
     OverlayItem overlayItem = new OverlayItem(point, title, null); 
     addOverlayItem(overlayItem); 
    } 


/* public void addOverlayItem(GeoPoint point , String title) { 


      OverlayItem overlayItem = new OverlayItem(point, title, null); 
      addOverlayItem(overlayItem); 


     //GeoPoint point = new GeoPoint(lat, lon); 

    }*/ 
} 

오류 : 나는에서 GeoPoitns을 허용하도록 addOverlayItem 방법을 변경하려고처럼 내가 할 수있는 몇 가지 방법을 시도했습니다

: E/AndroidRuntime(2752): FATAL EXCEPTION: main 
: E/AndroidRuntime(2752): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.phooogle/com.example.phooogle.GoogleMapsAppActivity}: java.lang.NullPointerException 
: E/AndroidRuntime(2752): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059) 
: E/AndroidRuntime(2752): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084) 
: E/AndroidRuntime(2752): at android.app.ActivityThread.access$600(ActivityThread.java:130) 
: E/AndroidRuntime(2752): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195) 
: E/AndroidRuntime(2752): at android.os.Handler.dispatchMessage(Handler.java:99) 
: E/AndroidRuntime(2752): at android.os.Looper.loop(Looper.java:137) 
: E/AndroidRuntime(2752): at android.app.ActivityThread.main(ActivityThread.java:4745) 
: E/AndroidRuntime(2752): at java.lang.reflect.Method.invokeNative(Native Method) 
: E/AndroidRuntime(2752): at java.lang.reflect.Method.invoke(Method.java:511) 
: E/AndroidRuntime(2752): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786) 
: E/AndroidRuntime(2752): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553) 
: E/AndroidRuntime(2752): at dalvik.system.NativeStart.main(Native Method) 
: E/AndroidRuntime(2752): Caused by: java.lang.NullPointerException 
: E/AndroidRuntime(2752): at com.example.phooogle.GoogleMapsAppActivity.onCreate(GoogleMapsAppActivity.java:68) 

AsyncTask가 반환되지만 실패했습니다. 나는 거의 이것에 관해 나에게 줬다. :)

업데이트 문제가 해결되었습니다. 여기에 수정은 다음과 같습니다

try { 
      //String[] arrs = init_task.strArr2; 
      List<GeoPoint> geoL = init_task.get(); 
      //Log.d(" Get the size " , " Geo List " + geoL.get(1).toString()); 
      mapView = (MapView) findViewById(R.id.mapview); 
      mapView.setBuiltInZoomControls(true); 
      mc = mapView.getController(); 
      List<Overlay> listOfOverlays = mapView.getOverlays(); 
      Drawable drawable = this.getResources().getDrawable(R.drawable.poke); 
      MyItemizedOverlay itemizedoverlay = new MyItemizedOverlay(drawable, this); 

      for (int i = 0; i < geoL.size() ; i++) 
      { 
       OverlayItem overlayitem1 = new OverlayItem(geoL.get(i), Selectedword + "s found! " , "It's withing " + selectedDistance + " To your position"); 
       itemizedoverlay.addOverlay(overlayitem1); 
       listOfOverlays.add(itemizedoverlay); 
      } 
      //mc.animateTo(geoL.get(1)); 

      mc.setCenter(new GeoPoint((int) (1E6 * gps.getLatitude()), (int) (1E6 * gps.getLongitude()))); // Some where . 

     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } catch (ExecutionException e) { 
      e.printStackTrace(); 
     } finally {} 

     initMap(); 
     initMyLocation(); 
     // theRouteDraw(); 
+0

그래서 'NullPointerException'은 어디에 있습니까? (줄 번호가 표시되지 않습니다 ... GoogleMapsAppActivity에서 68 번째 줄을 찾고 있습니다) – shkschneider

+0

문제는 프리스트 루프 내부에 있습니다. ** (int j = 0; j iAziz

답변

0

문제가 mapView가 null이다, 당신은 아직 initMap()라고하지 않았습니다. 이로 인해 mapView.getOverlays().add(itemizedOverlay);이 실패합니다.

+0

답장을 보내 주셔서 감사합니다. 실제로 문제는 아니지만 첫 번째 루프 내부의 코드 줄이있었습니다. geoPoints를 적절한 방법으로 listOfOverlays에 추가하지 않았습니다. 이제 해결되었습니다. :) – iAziz

관련 문제