Autore Topic: Calcolo di informazioni stradali  (Letto 604 volte)

Offline gomo

  • Nuovo arrivato
  • *
  • Post: 1
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    EMULATORE
  • Sistema operativo:
    UBUNTU 12.04
Calcolo di informazioni stradali
« il: 13 Febbraio 2013, 00:38:00 CET »
0
Salve, sto sviluppando un'applicazione che tra le varie funzioni fa uso delle google maps per calcolare il percorso tra alcuni punti selezionati dall'utente. Ho trovato diversi post su internet che trattano l'argomento con esempi di codice ma non riesco ad ottenere i risultati cercati.

questa è la classe dove visualizzo la mappa
Codice: [Seleziona]
public class RoutePath extends MapActivity {
        /** Called when the activity is first created. */

        MapView mapView;

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_map);

                MapView mapView = (MapView) findViewById(R.id.mapview);
                mapView.setBuiltInZoomControls(true);
               
                double src_lat = 25.04202;
                double src_long = 121.534761;
                //double src_lat = 39.224823;
                //double src_long = 91.27165;
                //double dest_lat =39.240062;
            //double dest_long = 90.98576;
               
                double dest_lat = 25.05202;
                double dest_long = 121.554761;
                               
                               
                GeoPoint srcGeoPoint = new GeoPoint((int) (src_lat * 1E6),
                                (int) (src_long * 1E6));
                GeoPoint destGeoPoint = new GeoPoint((int) (dest_lat * 1E6),
                                (int) (dest_long * 1E6));

                DrawPath(srcGeoPoint, destGeoPoint, Color.GREEN, mapView);

                mapView.getController().animateTo(srcGeoPoint);
                mapView.getController().setZoom(15);

        }

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

        private void DrawPath(GeoPoint src, GeoPoint dest, int color,
                        MapView mMapView01) {

                // connect to map web service
                StringBuilder urlString = new StringBuilder();
                urlString.append("[url=http://maps.google.com/maps?f=d&hl=en"]Google Maps[/url]);
                urlString.append("&saddr=");// from
                urlString.append(Double.toString((double) src.getLatitudeE6() / 1.0E6));
                urlString.append(",");
                urlString
                                .append(Double.toString((double) src.getLongitudeE6() / 1.0E6));
                urlString.append("&daddr=");// to
                urlString
                                .append(Double.toString((double) dest.getLatitudeE6() / 1.0E6));
                urlString.append(",");
                urlString.append(Double
                                .toString((double) dest.getLongitudeE6() / 1.0E6));
                urlString.append("&ie=UTF8&0&om=0&output=kml");

                Log.d("xxx", "URL=" + urlString.toString());

                // get the kml (XML) doc. And parse it to get the coordinates(direction
                // route).
                Document doc = null;
                HttpURLConnection urlConnection = null;
                URL url = null;
                try {
                        url = new URL(urlString.toString());
                        urlConnection = (HttpURLConnection) url.openConnection();
                        urlConnection.setRequestMethod("GET");
                        urlConnection.setDoOutput(true);
                        urlConnection.setDoInput(true);
                        urlConnection.connect();

                        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
                        DocumentBuilder db = dbf.newDocumentBuilder();
                        doc = db.parse(urlConnection.getInputStream());

                        if (doc.getElementsByTagName("GeometryCollection").getLength() > 0) {

                                 //String path =
                                 //doc.getElementsByTagName("GeometryCollection").item(0).getFirstChild().getFirstChild().getNodeName();
                                String path = doc.getElementsByTagName("GeometryCollection")
                                                .item(0).getFirstChild().getFirstChild()
                                                .getFirstChild().getNodeValue();

                                Log.d("xxx", "path=" + path);

                                String[] pairs = path.split(" ");
                                String[] lngLat = pairs[0].split(","); // lngLat[0]=longitude
                                                                                                                // lngLat[1]=latitude
                                                                                                                // lngLat[2]=height

                                // src
                                GeoPoint startGP = new GeoPoint((int) (Double
                                                .parseDouble(lngLat[1]) * 1E6), (int) (Double
                                                .parseDouble(lngLat[0]) * 1E6));
                                mMapView01.getOverlays()
                                                .add(new MyOverLay(startGP, startGP, 1));

                                GeoPoint gp1;
                                GeoPoint gp2 = startGP;
                                for (int i = 1; i < pairs.length; i++) // the last one would be
                                                                                                                // crash
                                {
                                        lngLat = pairs[i].split(",");
                                        gp1 = gp2;
                                        // watch out! For GeoPoint, first:latitude, second:longitude
                                        gp2 = new GeoPoint(
                                                        (int) (Double.parseDouble(lngLat[1]) * 1E6),
                                                        (int) (Double.parseDouble(lngLat[0]) * 1E6));
                                        mMapView01.getOverlays().add(
                                                        new MyOverLay(gp1, gp2, 2, color));

                                        Log.d("xxx", "pair:" + pairs[i]);

                                }
                                mMapView01.getOverlays().add(new MyOverLay(dest, dest, 3)); // use
                                                                                                                                                        // the
                                                                                                                                                        // default
                                                                                                                                                        // color
                        }
                } catch (MalformedURLException e) {

                        e.printStackTrace();
                } catch (IOException e) {

                        e.printStackTrace();
                } catch (ParserConfigurationException e) {

                        e.printStackTrace();

                } catch (SAXException e) {

                        e.printStackTrace();
                }

        }

}



e questa è la mia ridefinizione di overlay che tra le varie cose si dovrebbe occupare di disegnare il percorso sulla mappa
Codice: [Seleziona]
public class MyOverLay extends Overlay
{
  private GeoPoint gp1;
  private GeoPoint gp2;
  private int mRadius=6;
  private int mode=0;
  private int defaultColor;
  private String text="";
  private Bitmap img = null;
     

  public MyOverLay(GeoPoint gp1,GeoPoint gp2,int mode) //  GeoPoint is a int. (6E)
  {
         
    this.gp1 = gp1;
    this.gp2 = gp2;
    this.mode = mode;
    defaultColor = 999; // no defaultColor

  }
 

  public MyOverLay(GeoPoint gp1,GeoPoint gp2,int mode, int defaultColor)
  {
    this.gp1 = gp1;
    this.gp2 = gp2;
    this.mode = mode;
    this.defaultColor = defaultColor;
  }
 
  public void setText(String t)
  {
          this.text = t;
  }
 
  public void setBitmap(Bitmap bitmap)
  {
          this.img = bitmap;
  }
 
  public int getMode()
  {
          return mode;
  }

  @Override
  public boolean draw
  (Canvas canvas, MapView mapView, boolean shadow, long when)
  {
         
    Projection projection = mapView.getProjection();
    if (shadow == false)
    {     
     
      Paint paint = new Paint();
      paint.setAntiAlias(true);
     
     
      Point point = new Point();
      projection.toPixels(gp1, point);
      // mode=1�Gstart
      if(mode==1)
      {
            if(defaultColor==999)
                    paint.setColor(Color.BLUE);   
            else
                     paint.setColor(defaultColor);   
                   
                 
        RectF oval=new RectF(point.x - mRadius, point.y - mRadius, 
                             point.x + mRadius, point.y + mRadius);
        // start point
        canvas.drawOval(oval, paint);
      }
      // mode=2�Gpath
      else if(mode==2)
      {
              if(defaultColor==999)
                    paint.setColor(Color.RED);   
            else
                     paint.setColor(defaultColor);   
             
        Point point2 = new Point();
        projection.toPixels(gp2, point2);
        paint.setStrokeWidth(5);
        paint.setAlpha(120);       
        canvas.drawLine(point.x, point.y, point2.x,point2.y, paint);       
      }
      /* mode=3�Gend */
      else if(mode==3)
      {
        /* the last path */

              if(defaultColor==999)
                    paint.setColor(Color.GREEN);   
            else
                     paint.setColor(defaultColor);   
             
        Point point2 = new Point();
        projection.toPixels(gp2, point2);
        paint.setStrokeWidth(5);
        paint.setAlpha(120);
        canvas.drawLine(point.x, point.y, point2.x,point2.y, paint);
       
       
        RectF oval=new RectF(point2.x - mRadius,point2.y - mRadius, 
                             point2.x + mRadius,point2.y + mRadius);
        /* end point */
        paint.setAlpha(255);
        canvas.drawOval(oval, paint);
      }
      /* mode=4�Gcar */
      else if(mode==4)
      {
             
                     if(defaultColor==999)
                    paint.setColor(Color.GREEN);   
            else
                     paint.setColor(defaultColor);   
             
        Point point2 = new Point();
        projection.toPixels(gp2, point2);
        paint.setTextSize(20);
        paint.setAntiAlias(true);
        canvas.drawBitmap(img, point2.x, point2.y,paint);     
        canvas.drawText(this.text, point2.x, point2.y, paint);
    //    Log.d(TAG, "Draw the text="+this.text+ " at point="+point2.x + "," + point2.y);
      }
     
      else if(mode==5)
      {
             
                     if(defaultColor==999)
                    paint.setColor(Color.GREEN);   
            else
                     paint.setColor(defaultColor);   
             
        Point point2 = new Point();
        projection.toPixels(gp2, point2);
        paint.setTextSize(20);
        paint.setAntiAlias(true);
        canvas.drawBitmap(img, point2.x, point2.y,paint);
   
     
       
    //    Log.d(TAG, "Draw the text="+this.text+ " at point="+point2.x + "," + point2.y);
      }
     
     
     
    }
    return super.draw(canvas, mapView, shadow, when);
  }
 

}


il codice viene eseguito è la mappa disegnata. Dal log cat sembrerebbe che il problema abbia a che fare con
org.xml.sax.SAXParseException: unterminated entity ref (position:ENTITY_REF &@1:908 in java.io.InputStreamReader@4503f0e0)

qualcuno ha già fatto qualcosa si simile e sa come muoversi?