将Geopoints添加到ItemizedOverlay数组失败

时间:2012-10-15 14:50:23

标签: android itemizedoverlay geopoints

我一直在尝试将我的GeoPoints添加到itemizedOverlay数组中,以便在地图上绘制点。不幸的是,此时应用程序崩溃了。

我的代码: 包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);

    }*/
}

错误:

: 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)

我尝试了几种方法,比如我尝试更改addOverlayItem方法以接受来自AsyncTask返回的GeoPoit,但也失败了。我差不多给了我这个。 :)

更新 问题解决了。这是修复:

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();

1 个答案:

答案 0 :(得分:0)

您的问题是mapView为空,您尚未调用initMap()。这会导致mapView.getOverlays().add(itemizedOverlay );失败。