Autore Topic: Inserire polyline in una google maps  (Letto 1351 volte)

Offline darkmax

  • Utente junior
  • **
  • Post: 62
  • Respect: 0
    • Mostra profilo
    • Emoe - Agenzia di comunicazione Torino
  • Dispositivo Android:
    Samsung Galaxy S 3
  • Sistema operativo:
    Mac OS X
Inserire polyline in una google maps
« il: 26 Gennaio 2012, 00:27:10 CET »
0
Buongiorno a tutti.. Ho provato ad inserire una polyline su una mappa. Questa è la classe che gestisce il disegno:

Codice (Java): [Seleziona]
import java.util.ArrayList;
import java.util.List;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.widget.ImageView;



public class RoadDraw extends ImageView{
private Paint   mPaint = new Paint();
List<ParsedZTLDataSet> pts = new ArrayList<ParsedZTLDataSet>() ;

public RoadDraw(Context context) {
    super(context);

}
//used to send the location of the points to draw on the screen
//must be called before every redraw to update the points on the screen
public void SetPointsToDraw(List<ParsedZTLDataSet> pts)
{
    this.pts = pts;
}


public RoadDraw(Context context, AttributeSet attrs)
{
    super(context,attrs);
}
public RoadDraw(Context context, AttributeSet attrs, int defStyle)
{
    super(context, attrs, defStyle);
}

@Override
public void onDraw(Canvas canvas)
{
    super.onDraw(canvas);

    Paint paintColor = mPaint;
    paintColor.setColor(Color.YELLOW);
    paintColor.setStrokeWidth(3);


    if(pts.size() > 0)
    {
        canvas.drawCircle((float)(pts.get(0).getExtractedLat()), (float)(pts.get(0).getExtractedLng()),7.0f, paintColor);  
    }
    if (pts.size() > 1)
    {
        for (int i = 1 ; i < pts.size(); i++) {
            paintColor.setColor(Color.YELLOW);
            canvas.drawCircle((float)pts.get(i).getExtractedLat(), (float)pts.get(i).getExtractedLng(), 7, paintColor);
            paintColor.setColor(Color.RED);
            canvas.drawLine((float)pts.get(i-1).getExtractedLat(), (float)pts.get(i-1).getExtractedLng(), (float)pts.get(i).getExtractedLat(), (float)pts.get(i).getExtractedLng(), paintColor);
        }
    }


}
}

Le coordinate vengono prese da un xml nel web.. Questo è l'handler..

Codice (Java): [Seleziona]
import java.util.ArrayList;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
 
 
public class ZTLHandler extends DefaultHandler{
 
        private boolean in_point = false;
       
       
        private ParsedZTLDataSet myParsedZTLDataSet;
        private ArrayList<ParsedZTLDataSet> parsedElements = new ArrayList<ParsedZTLDataSet>();

 
        public ArrayList<ParsedZTLDataSet> getParsedData() {
                return this.parsedElements;
        }
 
        @Override
        public void startDocument() throws SAXException {
                //this.myParsedExampleDataSet = new ParsedExampleDataSet();
        }
 
        @Override
        public void endDocument() throws SAXException {
        }
 
        @Override
        public void startElement(String namespaceURI, String localName,
                        String qName, Attributes atts) throws SAXException {
               
                if (localName.equals("point")) {
                    String latitude = atts.getValue("lat");
                    double lat = Double.parseDouble(latitude);
                    String longitude = atts.getValue("lng");
                    double lng = Double.parseDouble(longitude);
                   
                    myParsedZTLDataSet = new ParsedZTLDataSet(lat,lng);
                   
                    parsedElements.add(myParsedZTLDataSet);
                       
                }
        }
       

        @Override
        public void endElement(String namespaceURI, String localName, String qName)
                        throws SAXException {
                //if (localName.equals("traffic_data")) {
                  //      this.in_traffic_data = false;
                //}else if (localName.equals("location_reference")) {
                  //      this.in_location_reference = false;
                if (localName.equals("PK_data")) {
                        this.in_point = false;
                }
        }
       
        @Override
        public void characters(char ch[], int start, int length) {
                if(this.in_point){
                //myParsedZTLDataSet.setExtractedName(new String(ch, start, length));
        }
    }
}

I dati vengono parsificati correttamente e le coordinate acquisite..

In questa classe creo un AsyncTask che mi inserisce dei pinpoint e dovrei poi richiamare il disegno della polyline.. Come si fa?

Codice (Java): [Seleziona]
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;

import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.util.Log;

public class MyAsynTask extends AsyncTask<Context, Integer, String> {
       
        private Context myContext = null;

        private final String MY_DEBUG_TAG = "Prova";
        private final String PARK_TAG = "Lista Park";
        private final String ZTL_TAG = "Lista ZTL";
        private final String GATE_TAG = "Lista Gate";
        private ArrayList<ParsedParkDataSet> listPark = new ArrayList<ParsedParkDataSet>();
        private ArrayList<ParsedZTLDataSet> listZTL = new ArrayList<ParsedZTLDataSet>();
        private ArrayList<ParsedGateDataSet> listGate = new ArrayList<ParsedGateDataSet>();
       
        List<Overlay> overlayList;
        Drawable d;
        ParkPinPoint custom;
        GatePinPoint custom2;
       

        @Override
        protected String doInBackground(Context... params) {
               
        try {
                /* Create a URL we want to load some xml-data from. */
                URL url = new URL("http://park......");
                URL url2 = new URL("http://ztl.......");
                myContext = params[0];

                /* Get a SAXParser from the SAXPArserFactory. */
                SAXParserFactory spf = SAXParserFactory.newInstance();
                SAXParserFactory spf2 = SAXParserFactory.newInstance();
                SAXParserFactory spf3 = SAXParserFactory.newInstance();
                SAXParser sp = spf.newSAXParser();
                SAXParser sp2 = spf2.newSAXParser();
                SAXParser sp3 = spf3.newSAXParser();

                /* Get the XMLReader of the SAXParser we created. */
                XMLReader xr = sp.getXMLReader();
                XMLReader xr2 = sp2.getXMLReader();
                XMLReader xr3 = sp3.getXMLReader();
               
                /* Create a new ContentHandler and apply it to the XML-Reader*/
                ParkHandler myParkHandler = new ParkHandler();
                ZTLHandler myZTLHandler = new ZTLHandler();
                GateHandler myGateHandler = new GateHandler();
               
                xr.setContentHandler(myParkHandler);
                xr2.setContentHandler(myZTLHandler);
                xr3.setContentHandler(myGateHandler);
               
                /* Parse the xml-data from our URL. */
                xr.parse(new InputSource(url.openStream()));
                xr2.parse(new InputSource(url2.openStream()));
                xr3.parse(new InputSource(url2.openStream()));
                /* Parsing has finished. */
                 
                listPark = myParkHandler.getParsedData();
                listZTL = myZTLHandler.getParsedData();
                listGate = myGateHandler.getParsedData();
                               
        } catch (Exception e) {
                /* Display any Error to the GUI. */
                Log.e(MY_DEBUG_TAG, "ParseError", e);
        }      
                return "123";
        }
        @Override
        protected void onPostExecute(String result) {
                super.onPostExecute(result);
                Activity activity=(Activity)myContext;
                MapView m = (MapView) activity.findViewById(R.id.mvMain);
                overlayList = m.getOverlays();
               
                /*
                Log.d(PARK_TAG , ""+ listPark.size());
                Log.d(ZTL_TAG , ""+ listZTL.size());
                Log.d(GATE_TAG , ""+ listGate.size());
                */

                Iterator<ParsedParkDataSet> itr = listPark.iterator();
                while(itr.hasNext()){
               
                        ParsedParkDataSet p = itr.next();
               
                int x = (int)(p.getExtractedLat()*1E6);
                int y = (int)(p.getExtractedLng()*1E6);
                GeoPoint parkPoint = new GeoPoint(x, y);
               
                int riman = p.getExtractedFree();
               
                if(riman != -1){
                        if(riman == 0){
                                d = activity.getResources().getDrawable(R.drawable.pinpoint_rosso);
                        }
                        else if(riman <= 10){
                                d = activity.getResources().getDrawable(R.drawable.pinpoint_giallo);
                        }
                        else{
                                d = activity.getResources().getDrawable(R.drawable.pinpoint_verde);
                        }
                }
                else{
                        d = activity.getResources().getDrawable(R.drawable.pinpoint_na);
                        }
                custom = new ParkPinPoint(d,myContext);
                overlayList.add(custom);
                OverlayItem overlayItem = new OverlayItem(parkPoint,"prova1","prova2");
                custom.addOverlay(overlayItem);
               
        }
                Iterator<ParsedZTLDataSet> itrZ = listZTL.iterator();
                while(itrZ.hasNext()){
               
                        ParsedZTLDataSet p = itrZ.next();
               
                int x = (int)(p.getExtractedLat()*1E6);
                int y = (int)(p.getExtractedLng()*1E6);
                GeoPoint gatePoint = new GeoPoint(x, y);
               
                        d = activity.getResources().getDrawable(R.drawable.pinpoint_ztl);
                       
                custom2 = new GatePinPoint(d,myContext);
                overlayList.add(custom2);
                OverlayItem overlayItem = new OverlayItem(gatePoint, "Prova", "Stringa");
                custom2.addOverlay(overlayItem);
               
        }

        }

}

Aiutatemi.. Grazie
« Ultima modifica: 26 Gennaio 2012, 13:01:12 CET da Ricky` »

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Inserire polyline in una google maps
« Risposta #1 il: 26 Gennaio 2012, 11:31:26 CET »
0
Ciao, non ti conviene usare un'imageView perché, per essere visualizzata sopra la mappa e disegnarci i punti nelle coordinate esatte, devi dargli altezza e larghezza uguale alla mapview, oltre che dover inserirle entrambe in un relativeLayout o frameLayout.
Dando un'occhiata veloce al codice, vedo che aggiungi due overlay (GatePinPoint e ParkPinPoint) alla mappa, giusto?
Per disegnare linee e punti, ti conviene utilizzare uno di questi due overlay oppure crearne un altro e fare il disegno nel metodo draw(). In più, per disegnare sul canvas dell'overlay, devi trasformare le coordinate latitudine e longitudine in coordinate sullo schermo usando i metodi della classe Projection (di cui puoi ottenere un riferimento con MapView.getProjection()).
« Ultima modifica: 26 Gennaio 2012, 11:33:59 CET da Verandi »

Offline darkmax

  • Utente junior
  • **
  • Post: 62
  • Respect: 0
    • Mostra profilo
    • Emoe - Agenzia di comunicazione Torino
  • Dispositivo Android:
    Samsung Galaxy S 3
  • Sistema operativo:
    Mac OS X
Re:Inserire polyline in una google maps
« Risposta #2 il: 26 Gennaio 2012, 11:36:19 CET »
0
Infatti ora sto provando diversamente..

Ho creato una classe per l'overlay:

Codice (Java): [Seleziona]
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.Projection;

public  class DirectionPathOverlay extends Overlay {

    private GeoPoint gp1;
    private GeoPoint gp2;

    public DirectionPathOverlay(GeoPoint gp1, GeoPoint gp2) {
        this.gp1 = gp1;
        this.gp2 = gp2;
    }

    @Override
    public boolean draw(Canvas canvas, MapView mapView, boolean shadow,
            long when) {
        // TODO Auto-generated method stub
        Projection projection = mapView.getProjection();
        if (shadow == false) {

            Paint paint = new Paint();
            paint.setAntiAlias(true);
            Point point = new Point();
            projection.toPixels(gp1, point);
            paint.setColor(Color.BLUE);
            Point point2 = new Point();
            projection.toPixels(gp2, point2);
            paint.setStrokeWidth(2);
            canvas.drawLine((float) point.x, (float) point.y, (float) point2.x,(float) point2.y, paint);
        }
        return super.draw(canvas, mapView, shadow, when);
    }

    @Override
    public void draw(Canvas canvas, MapView mapView, boolean shadow) {
        // TODO Auto-generated method stub

        super.draw(canvas, mapView, shadow);
    }

}

Ora però.. come la passo al codice per poterla inserire? Qui l'Asynctask:

Codice (Java): [Seleziona]
Iterator<ParsedZTLDataSet> itrZ = listZTL.iterator();
                while(itrZ.hasNext()){
               
                        ParsedZTLDataSet p = itrZ.next();
               
                int x = (int)(p.getExtractedLat()*1E6);
                int y = (int)(p.getExtractedLng()*1E6);
               
// cosa devo inserire qui per fargli disegnare una linea ogni volta che riceve latitudine e longitudine?
               
               
        }

Grazie mille
« Ultima modifica: 26 Gennaio 2012, 13:02:40 CET da Ricky` »

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Inserire polyline in una google maps
« Risposta #3 il: 26 Gennaio 2012, 11:50:31 CET »
0
Nell'overlay potresti aggiungere un arraylist di geopoint o altro che contenga i punti da disegnare, e aggiungi un metodo pubblico del tipo addPoint(Geopoint point) oppure addPoint(long x, long y). Lo richiami dall'asynchTask ogni volta che devi aggiungere delle linee da disegnare e, quando tutti i punti sono stati aggiunti, richiami mapView.invalidate() oppure overlay.populate().
Dovresti cambiare il metodo draw, che ora disegna solo due punti, per far sì che disegni le linee in base al contenuto dell'arraylist.
Per aggiungere l'overlay alla mapview, utilizza la stessa logica che utilizzi nel codice che hai postato nel primo post: crei il tuo overlay, ottieni la lista degli overlay della mappa e glielo aggiungi.  ;-)

Offline darkmax

  • Utente junior
  • **
  • Post: 62
  • Respect: 0
    • Mostra profilo
    • Emoe - Agenzia di comunicazione Torino
  • Dispositivo Android:
    Samsung Galaxy S 3
  • Sistema operativo:
    Mac OS X
Re:Inserire polyline in una google maps
« Risposta #4 il: 26 Gennaio 2012, 12:15:04 CET »
0
Ti ringrazio.. Non mi sono chiare 2 cose:

Come modifico il metodo draw nella classe DirectionPathOverlay? Va bene come l'ho modificata?

Codice (Java): [Seleziona]
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.drawable.Drawable;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.ItemizedOverlay;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;
import com.google.android.maps.Projection;

public  class DirectionPathOverlay extends ItemizedOverlay<OverlayItem> {

        public DirectionPathOverlay(Drawable defaultMarker) {
                super(defaultMarker);
                // TODO Auto-generated constructor stub
        }
       
        public DirectionPathOverlay(Drawable m, Context context) {
                super(boundCenter(m));
                c = context;
        }

        private ArrayList<OverlayItem> ztlpoints = new ArrayList<OverlayItem>();
        private Context c;
       
        private GeoPoint gp1;
    private GeoPoint gp2;
/*
    public DirectionPathOverlay(GeoPoint gp1, GeoPoint gp2) {
        this.gp1 = gp1;
        this.gp2 = gp2;
    }
*/

    @Override
    public boolean draw(Canvas canvas, MapView mapView, boolean shadow,
            long when) {
        // TODO Auto-generated method stub
        Projection projection = mapView.getProjection();
        if (shadow == false) {

            Paint paint = new Paint();
            paint.setAntiAlias(true);
            Point point = new Point();
            projection.toPixels(gp1, point);
            paint.setColor(Color.BLUE);
            Point point2 = new Point();
            projection.toPixels(gp2, point2);
            paint.setStrokeWidth(2);
            canvas.drawLine((float) point.x, (float) point.y, (float) point2.x,(float) point2.y, paint);
        }
        return super.draw(canvas, mapView, shadow, when);
    }

    public void insertPinpoint(OverlayItem item){
                ztlpoints.add(item);
                this.populate();
        }

        @Override
        protected OverlayItem createItem(int i) {
                // TODO Auto-generated method stub
                return null;
        }
       
        public void addOverlay(OverlayItem overlay){
                ztlpoints.add(overlay);
                this.populate();
        }

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

}

altra cosa..
Come faccio questo: "Lo richiami dall'asynchTask ogni volta che devi aggiungere delle linee da disegnare e, quando tutti i punti sono stati aggiunti, richiami mapView.invalidate() oppure overlay.populate()."

Ecco il mio AsyncTask:

Codice (Java): [Seleziona]
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;

import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.util.Log;

public class MyAsynTask extends AsyncTask<Context, Integer, String> {
       
        private Context myContext = null;

        private final String MY_DEBUG_TAG = "Prova";
        private final String PARK_TAG = "Lista Park";
        private final String ZTL_TAG = "Lista ZTL";
        private final String GATE_TAG = "Lista Gate";
        private ArrayList<ParsedParkDataSet> listPark = new ArrayList<ParsedParkDataSet>();
        private ArrayList<ParsedZTLDataSet> listZTL = new ArrayList<ParsedZTLDataSet>();
        private ArrayList<ParsedGateDataSet> listGate = new ArrayList<ParsedGateDataSet>();
       
        List<Overlay> overlayList;
        Drawable d;
        ParkPinPoint custom;
        GatePinPoint custom2;
        DirectionPathOverlay custom3;
       
       

        @Override
        protected String doInBackground(Context... params) {
               
        try {
                /* Create a URL we want to load some xml-data from. */
                URL url = new URL("http://opendata.5t.torino.it/get_pk");
                URL url2 = new URL("http://opendata.5t.torino.it/get_access_control");
                myContext = params[0];

                /* Get a SAXParser from the SAXPArserFactory. */
                SAXParserFactory spf = SAXParserFactory.newInstance();
                SAXParserFactory spf2 = SAXParserFactory.newInstance();
                SAXParserFactory spf3 = SAXParserFactory.newInstance();
                SAXParser sp = spf.newSAXParser();
                SAXParser sp2 = spf2.newSAXParser();
                SAXParser sp3 = spf3.newSAXParser();

                /* Get the XMLReader of the SAXParser we created. */
                XMLReader xr = sp.getXMLReader();
                XMLReader xr2 = sp2.getXMLReader();
                XMLReader xr3 = sp3.getXMLReader();
               
                /* Create a new ContentHandler and apply it to the XML-Reader*/
                ParkHandler myParkHandler = new ParkHandler();
                ZTLHandler myZTLHandler = new ZTLHandler();
                GateHandler myGateHandler = new GateHandler();
               
                xr.setContentHandler(myParkHandler);
                xr2.setContentHandler(myZTLHandler);
                xr3.setContentHandler(myGateHandler);
               
                /* Parse the xml-data from our URL. */
                xr.parse(new InputSource(url.openStream()));
                xr2.parse(new InputSource(url2.openStream()));
                xr3.parse(new InputSource(url2.openStream()));
                /* Parsing has finished. */
                 
                listPark = myParkHandler.getParsedData();
                listZTL = myZTLHandler.getParsedData();
                listGate = myGateHandler.getParsedData();
                               
        } catch (Exception e) {
                /* Display any Error to the GUI. */
                Log.e(MY_DEBUG_TAG, "ParseError", e);
        }      
                return "123";
        }
        @Override
        protected void onPostExecute(String result) {
                super.onPostExecute(result);
                Activity activity=(Activity)myContext;
                MapView m = (MapView) activity.findViewById(R.id.mvMain);
                overlayList = m.getOverlays();
               
                /*
                Log.d(PARK_TAG , ""+ listPark.size());
                Log.d(ZTL_TAG , ""+ listZTL.size());
                Log.d(GATE_TAG , ""+ listGate.size());
                */

                Iterator<ParsedParkDataSet> itr = listPark.iterator();
                while(itr.hasNext()){
               
                        ParsedParkDataSet p = itr.next();
               
                int x = (int)(p.getExtractedLat()*1E6);
                int y = (int)(p.getExtractedLng()*1E6);
                GeoPoint parkPoint = new GeoPoint(x, y);
               
                int riman = p.getExtractedFree();
               
                if(riman != -1){
                        if(riman == 0){
                                d = activity.getResources().getDrawable(R.drawable.pinpoint_rosso);
                        }
                        else if(riman <= 10){
                                d = activity.getResources().getDrawable(R.drawable.pinpoint_giallo);
                        }
                        else{
                                d = activity.getResources().getDrawable(R.drawable.pinpoint_verde);
                        }
                }
                else{
                        d = activity.getResources().getDrawable(R.drawable.pinpoint_na);
                        }
                custom = new ParkPinPoint(d,myContext);
                overlayList.add(custom);
                OverlayItem overlayItem = new OverlayItem(parkPoint,"prova1","prova2");
                custom.addOverlay(overlayItem);
               
        }
                Iterator<ParsedGateDataSet> itrG = listGate.iterator();
                while(itrG.hasNext()){
               
                        ParsedGateDataSet p = itrG.next();
               
                int x = (int)(p.getExtractedLat()*1E6);
                int y = (int)(p.getExtractedLng()*1E6);
                GeoPoint gatePoint = new GeoPoint(x, y);
               
                        d = activity.getResources().getDrawable(R.drawable.pinpoint_ztl);
                       
                custom2 = new GatePinPoint(d,myContext);
                overlayList.add(custom2);
                OverlayItem overlayItem = new OverlayItem(gatePoint, "Prova", "Stringa");
                custom2.addOverlay(overlayItem);
               
        }
               
                Iterator<ParsedZTLDataSet> itrZ = listZTL.iterator();
                while(itrZ.hasNext()){
               
                        ParsedZTLDataSet p = itrZ.next();
               
                int x = (int)(p.getExtractedLat()*1E6);
                int y = (int)(p.getExtractedLng()*1E6);
               
                GeoPoint ztlPoint = new GeoPoint(x, y);
               
                       
                       
                custom3 = new DirectionPathOverlay(d,myContext);
                overlayList.add(custom3);
                OverlayItem overlayItem = new OverlayItem(ztlPoint, "Prova", "Stringa");
                custom3.addOverlay(overlayItem);
               
        }
               
               

        }

}

Grazie mille
« Ultima modifica: 26 Gennaio 2012, 13:03:17 CET da Ricky` »

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Inserire polyline in una google maps
« Risposta #5 il: 26 Gennaio 2012, 12:37:19 CET »
0
Hai aggiunto due metodi uguali: insertPinPoint e addOverlay. Secondo me ti conviene eliminarne uno, e il restante cambiarlo in modo che prenda come paramentro un GeoPoint, invece che un overlayItem. Inoltra, piuttosto di usare un arrayList di overlayItem, nel tuo caso può bastare un arrayList di GeoPoint.
Con
Citazione
"Lo richiami dall'asynchTask ogni volta che devi aggiungere delle linee da disegnare e, quando tutti i punti sono stati aggiunti, richiami mapView.invalidate() oppure overlay.populate()."
intendo richiamare il metodo che aggiunge il geoPoint nel ciclo while, mentre l'overlay.populate() lo metti fuori.
Per come cambiare il metodo draw, prova a dare un'occhiata in giro a come si disegna sul canvas. Una volta capito come funziona, ti consiglio di usare la classe Path e il metodo Canvas.drawPath().
« Ultima modifica: 26 Gennaio 2012, 12:39:50 CET da Verandi »

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3487
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Inserire polyline in una google maps
« Risposta #6 il: 26 Gennaio 2012, 13:02:15 CET »
0
Per favore, quando incolli il codice java usa il tasto apposito: così ne aumenti la leggibilità ;)

Offline darkmax

  • Utente junior
  • **
  • Post: 62
  • Respect: 0
    • Mostra profilo
    • Emoe - Agenzia di comunicazione Torino
  • Dispositivo Android:
    Samsung Galaxy S 3
  • Sistema operativo:
    Mac OS X
Re:Inserire polyline in una google maps
« Risposta #7 il: 26 Gennaio 2012, 14:19:20 CET »
0
ok.. chiedo scusa ma non avevo visto il tag per java...

Io ho trovato questo.. ma non ho minimamente capito come implementarlo nel mio codice..  :'(

Codice (Java): [Seleziona]
public void drawPath(NavigationDataSet navSet, int color, MapView mMapView01) {

    Log.d(myapp.APP, "map color before: " + color);        

    // color correction for dining, make it darker
    if (color == Color.parseColor("#add331")) color = Color.parseColor("#6C8715");
    Log.d(myapp.APP, "map color after: " + color);

    Collection overlaysToAddAgain = new ArrayList();
    for (Iterator iter = mMapView01.getOverlays().iterator(); iter.hasNext();) {
        Object o = iter.next();
        Log.d(myapp.APP, "overlay type: " + o.getClass().getName());
        if (!RouteOverlay.class.getName().equals(o.getClass().getName())) {
            // mMapView01.getOverlays().remove(o);
            overlaysToAddAgain.add(o);
        }
    }
    mMapView01.getOverlays().clear();
    mMapView01.getOverlays().addAll(overlaysToAddAgain);

    String path = navSet.getRoutePlacemark().getCoordinates();
    Log.d(myapp.APP, "path=" + path);
    if (path != null && path.trim().length() > 0) {
        String[] pairs = path.trim().split(" ");

        Log.d(myapp.APP, "pairs.length=" + pairs.length);

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

        Log.d(myapp.APP, "lnglat =" + lngLat + ", length: " + lngLat.length);

        if (lngLat.length<3) lngLat = pairs[1].split(","); // if first pair is not transferred completely, take seconds pair //TODO

        try {
            GeoPoint startGP = new GeoPoint((int) (Double.parseDouble(lngLat[1]) * 1E6), (int) (Double.parseDouble(lngLat[0]) * 1E6));
            mMapView01.getOverlays().add(new RouteOverlay(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;

                if (lngLat.length >= 2 && gp1.getLatitudeE6() > 0 && gp1.getLongitudeE6() > 0
                        && gp2.getLatitudeE6() > 0 && gp2.getLongitudeE6() > 0) {

                    // for GeoPoint, first:latitude, second:longitude
                    gp2 = new GeoPoint((int) (Double.parseDouble(lngLat[1]) * 1E6), (int) (Double.parseDouble(lngLat[0]) * 1E6));

                    if (gp2.getLatitudeE6() != 22200000) {
                        mMapView01.getOverlays().add(new RouteOverlay(gp1, gp2, 2, color));
                        Log.d(myapp.APP, "draw:" + gp1.getLatitudeE6() + "/" + gp1.getLongitudeE6() + " TO " + gp2.getLatitudeE6() + "/" + gp2.getLongitudeE6());
                    }
                }
                // Log.d(myapp.APP,"pair:" + pairs[i]);
            }
            //routeOverlays.add(new RouteOverlay(gp2,gp2, 3));
            mMapView01.getOverlays().add(new RouteOverlay(gp2, gp2, 3));
        } catch (NumberFormatException e) {
            Log.e(myapp.APP, "Cannot draw route.", e);
        }
    }
    // mMapView01.getOverlays().addAll(routeOverlays); // use the default color
    mMapView01.setEnabled(true);
}

E questo:

Codice (Java): [Seleziona]
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import android.graphics.RectF;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.Projection;

public class RouteOverlay 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 RouteOverlay(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 RouteOverlay(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&#38;#65306;start
        if(mode==1) {
            if(defaultColor==999)
            paint.setColor(Color.BLACK); // 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&#38;#65306;path
        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(defaultColor==Color.parseColor("#6C8715")?220:120);
            canvas.drawLine(point.x, point.y, point2.x,point2.y, paint);
        }
        /* mode=3&#38;#65306;end */
        else if(mode==3) {
            /* the last path */

            if(defaultColor==999)
                paint.setColor(Color.BLACK);  // Color.GREEN
            else
                paint.setColor(defaultColor);

            Point point2 = new Point();
            projection.toPixels(gp2, point2);
            paint.setStrokeWidth(5);
            paint.setAlpha(defaultColor==Color.parseColor("#6C8715")?220: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);
        }
    }
    return super.draw(canvas, mapView, shadow, when);
}

}

Help.. :,(

Offline Verandi

  • Moderatore
  • Utente normale
  • *****
  • Post: 378
  • Respect: +75
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Inserire polyline in una google maps
« Risposta #8 il: 26 Gennaio 2012, 14:56:09 CET »
0
Perdonami, ma non vedo come possiamo aiutarti. A me fa piacere dare una mano a chi ha qualche problema/dubbio da risolvere, specialmente se l'utente aiuta sé stesso e fa la sua parte (per esempio: almeno capire il codice che copia-incolla). Mi sembra un po' eccessivo postare del codice senza nemmeno prendersi la briga di analizzarlo e provare ad adattarlo al proprio caso, pretendendo che qualcun altro si metta a fare il lavoro che dovresti fare tu. Ovviamente parlo per me.  ;-)

Offline darkmax

  • Utente junior
  • **
  • Post: 62
  • Respect: 0
    • Mostra profilo
    • Emoe - Agenzia di comunicazione Torino
  • Dispositivo Android:
    Samsung Galaxy S 3
  • Sistema operativo:
    Mac OS X
Re:Inserire polyline in una google maps
« Risposta #9 il: 26 Gennaio 2012, 15:09:47 CET »
0
Scusa.. hai ragione e stavo provando a vedere il codice..

Questo è la classe DirectionPathOverlay:

Codice (Java): [Seleziona]
import java.util.ArrayList;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Point;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;

public class DirectionPathOverlay extends Overlay {

        Road mRoad;
    ArrayList<GeoPoint> mPoints;

    public DirectionPathOverlay(Road road, MapView mv) {
            mRoad = road;
            if (road.mRoute.length > 0) {
                    mPoints = new ArrayList<GeoPoint>();
                    for (int i = 0; i < road.mRoute.length; i++) {
                            mPoints.add(new GeoPoint((int) (road.mRoute[i][1] * 1000000),
                                            (int) (road.mRoute[i][0] * 1000000)));
                    }
                    int moveToLat = (mPoints.get(0).getLatitudeE6() + (mPoints.get(
                                    mPoints.size() - 1).getLatitudeE6() - mPoints.get(0)
                                    .getLatitudeE6()) / 2);
                    int moveToLong = (mPoints.get(0).getLongitudeE6() + (mPoints.get(
                                    mPoints.size() - 1).getLongitudeE6() - mPoints.get(0)
                                    .getLongitudeE6()) / 2);
                    GeoPoint moveTo = new GeoPoint(moveToLat, moveToLong);

                    /*
                    MapController mapController = mv.getController();
                    mapController.animateTo(moveTo);
                    mapController.setZoom(7);
                    */

            }
    }

    @Override
    public boolean draw(Canvas canvas, MapView mv, boolean shadow, long when) {
            super.draw(canvas, mv, shadow);
            drawPath(mv, canvas);
            return true;
    }

    public void drawPath(MapView mv, Canvas canvas) {
            int x1 = -1, y1 = -1, x2 = -1, y2 = -1;
            Paint paint = new Paint();
            paint.setColor(Color.GREEN);
            paint.setStyle(Paint.Style.STROKE);
            paint.setStrokeWidth(3);
            for (int i = 0; i < mPoints.size(); i++) {
                    Point point = new Point();
                    mv.getProjection().toPixels(mPoints.get(i), point);
                    x2 = point.x;
                    y2 = point.y;
                    if (i > 0) {
                            canvas.drawLine(x1, y1, x2, y2, paint);
                    }
                    x1 = x2;
                    y1 = y2;
            }

}
}

Questo è il mio handler:

Codice (Java): [Seleziona]
import java.util.ArrayList;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

 
 
public class ZTLHandler extends DefaultHandler{
 
        private boolean in_point = false;
        Road mRoad;
       
       
        private ParsedZTLDataSet myParsedZTLDataSet;
        private ArrayList<ParsedZTLDataSet> parsedElements = new ArrayList<ParsedZTLDataSet>();

 
        public ArrayList<ParsedZTLDataSet> getParsedData() {
                return this.parsedElements;
        }
 
        @Override
        public void startDocument() throws SAXException {
                //this.myParsedExampleDataSet = new ParsedExampleDataSet();
        }
 
        @Override
        public void endDocument() throws SAXException {
        }
 
        @Override
        public void startElement(String namespaceURI, String localName,
                        String qName, Attributes atts) throws SAXException {
               
                if (localName.equals("point")) {
                    String latitude = atts.getValue("lat");
                    double lat = Double.parseDouble(latitude);
                    String longitude = atts.getValue("lng");
                    double lng = Double.parseDouble(longitude);
                   
                    mRoad.mPoints = addPoint(mRoad.mPoints);
                   
                    myParsedZTLDataSet = new ParsedZTLDataSet(lat,lng);
                   
                    parsedElements.add(myParsedZTLDataSet);
                       
                }
        }
       

        @Override
        public void endElement(String namespaceURI, String localName, String qName)
                        throws SAXException {
                //if (localName.equals("traffic_data")) {
                  //      this.in_traffic_data = false;
                //}else if (localName.equals("location_reference")) {
                  //      this.in_location_reference = false;
                if (localName.equals("PK_data")) {
                        this.in_point = false;
                }
        }
       
        @Override
        public void characters(char ch[], int start, int length) {
                if(this.in_point){
                //myParsedZTLDataSet.setExtractedName(new String(ch, start, length));
        }
        }  
                public Point[] addPoint(Point[] mPoints) {
                    Point[] result = new Point[mPoints.length + 1];
                    for (int i = 0; i < mPoints.length; i++)
                            result[i] = mPoints[i];
                    result[mPoints.length] = new Point();
                    return result;
            }
    }

Questa la mia classe Road:

Codice (Java): [Seleziona]
public class Road {
    public String mName;
    public String mDescription;
    public int mColor;
    public int mWidth;
    public double[][] mRoute = new double[][] {};
    public Point[] mPoints = new Point[] {};
}

e questa quella Point:

Codice (Java): [Seleziona]
public class Point {
        String mName;
        String mDescription;
        String mIconUrl;
        double mLatitude;
        double mLongitude;
}

mentre questa quella che gestisce i miei dati parsificati:

Codice (Java): [Seleziona]
public class ParsedZTLDataSet {
        private double extractedLat = 0.0;
        private double extractedLng = 0.0;
       
       
 
        public ParsedZTLDataSet(double extractedLat, double extractedLng) {
                        super();
                        this.extractedLat = extractedLat;
                        this.extractedLng = extractedLng;
                }
       
       
                public double getExtractedLat() {
                        return extractedLat;
                }
                public void setExtractedLat(double extractedLat) {
                        this.extractedLat = extractedLat;
                }
                public double getExtractedLng() {
                        return extractedLng;
                }
                public void setExtractedLng(double extractedLng) {
                        this.extractedLng = extractedLng;
                }


                @Override
                public String toString() {
                        return "ParsedZTLDataSet [extractedLat=" + extractedLat
                                        + ", extractedLng=" + extractedLng + "]";
                }      
}

Ora.. questo è il mio AsyncTask:

Codice (Java): [Seleziona]
import java.net.URL;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;

import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapView;
import com.google.android.maps.Overlay;
import com.google.android.maps.OverlayItem;

import android.app.Activity;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.util.Log;

public class MyAsynTask extends AsyncTask<Context, Integer, String> {
       
        private Context myContext = null;

        private final String MY_DEBUG_TAG = "Prova";
        //private final String PARK_TAG = "Lista Park";
        //private final String ZTL_TAG = "Lista ZTL";
        //private final String GATE_TAG = "Lista Gate";
        private ArrayList<ParsedParkDataSet> listPark = new ArrayList<ParsedParkDataSet>();
        private ArrayList<ParsedZTLDataSet> listZTL = new ArrayList<ParsedZTLDataSet>();
        private ArrayList<ParsedGateDataSet> listGate = new ArrayList<ParsedGateDataSet>();
       
        List<Overlay> overlayList;
        Drawable d;
        ParkPinPoint custom;
        GatePinPoint custom2;
        DirectionPathOverlay custom3;
       
       

        @Override
        protected String doInBackground(Context... params) {
               
        try {
                /* Create a URL we want to load some xml-data from. */
                URL url = new URL("http://park....");
                URL url2 = new URL("http://gate e ztl....");
                myContext = params[0];

                /* Get a SAXParser from the SAXPArserFactory. */
                SAXParserFactory spf = SAXParserFactory.newInstance();
                SAXParserFactory spf2 = SAXParserFactory.newInstance();
                SAXParserFactory spf3 = SAXParserFactory.newInstance();
                SAXParser sp = spf.newSAXParser();
                SAXParser sp2 = spf2.newSAXParser();
                SAXParser sp3 = spf3.newSAXParser();

                /* Get the XMLReader of the SAXParser we created. */
                XMLReader xr = sp.getXMLReader();
                XMLReader xr2 = sp2.getXMLReader();
                XMLReader xr3 = sp3.getXMLReader();
               
                /* Create a new ContentHandler and apply it to the XML-Reader*/
                ParkHandler myParkHandler = new ParkHandler();
                ZTLHandler myZTLHandler = new ZTLHandler();
                GateHandler myGateHandler = new GateHandler();
               
                xr.setContentHandler(myParkHandler);
                xr2.setContentHandler(myZTLHandler);
                xr3.setContentHandler(myGateHandler);
               
                /* Parse the xml-data from our URL. */
                xr.parse(new InputSource(url.openStream()));
                xr2.parse(new InputSource(url2.openStream()));
                xr3.parse(new InputSource(url2.openStream()));
                /* Parsing has finished. */
                 
                listPark = myParkHandler.getParsedData();
                listZTL = myZTLHandler.getParsedData();
                listGate = myGateHandler.getParsedData();
                               
        } catch (Exception e) {
                /* Display any Error to the GUI. */
                Log.e(MY_DEBUG_TAG, "ParseError", e);
        }      
                return "123";
        }
        @Override
        protected void onPostExecute(String result) {
                super.onPostExecute(result);
                Activity activity=(Activity)myContext;
                MapView m = (MapView) activity.findViewById(R.id.mvMain);
                overlayList = m.getOverlays();
               
                /*
                Log.d(PARK_TAG , ""+ listPark.size());
                Log.d(ZTL_TAG , ""+ listZTL.size());
                Log.d(GATE_TAG , ""+ listGate.size());
                */

                Iterator<ParsedParkDataSet> itr = listPark.iterator();
                while(itr.hasNext()){
               
                        ParsedParkDataSet p = itr.next();
               
                int x = (int)(p.getExtractedLat()*1E6);
                int y = (int)(p.getExtractedLng()*1E6);
                GeoPoint parkPoint = new GeoPoint(x, y);
               
                int riman = p.getExtractedFree();
               
                if(riman != -1){
                        if(riman == 0){
                                d = activity.getResources().getDrawable(R.drawable.pinpoint_rosso);
                        }
                        else if(riman <= 10){
                                d = activity.getResources().getDrawable(R.drawable.pinpoint_giallo);
                        }
                        else{
                                d = activity.getResources().getDrawable(R.drawable.pinpoint_verde);
                        }
                }
                else{
                        d = activity.getResources().getDrawable(R.drawable.pinpoint_na);
                        }
                custom = new ParkPinPoint(d,myContext);
                overlayList.add(custom);
                OverlayItem overlayItem = new OverlayItem(parkPoint,"prova1","prova2");
                custom.addOverlay(overlayItem);
               
        }
                Iterator<ParsedGateDataSet> itrG = listGate.iterator();
                while(itrG.hasNext()){
               
                        ParsedGateDataSet p = itrG.next();
               
                int x = (int)(p.getExtractedLat()*1E6);
                int y = (int)(p.getExtractedLng()*1E6);
                GeoPoint gatePoint = new GeoPoint(x, y);
               
                        d = activity.getResources().getDrawable(R.drawable.pinpoint_ztl);
                       
                custom2 = new GatePinPoint(d,myContext);
                overlayList.add(custom2);
                OverlayItem overlayItem = new OverlayItem(gatePoint, "Prova", "Stringa");
                custom2.addOverlay(overlayItem);
               
        }
               
                Iterator<ParsedZTLDataSet> itrZ = listZTL.iterator();
                while(itrZ.hasNext()){
               
                        ParsedZTLDataSet p = itrZ.next();
               
                int x = (int)(p.getExtractedLat()*1E6);
                int y = (int)(p.getExtractedLng()*1E6);
               
                GeoPoint ztlPoint = new GeoPoint(x, y);
               
                /*
                custom3 = new DirectionPathOverlay(d,myContext);
                overlayList.add(custom3);
                //OverlayItem overlayItem = new OverlayItem(ztlPoint, "Prova", "Stringa");
                custom3.insertZTLpoint(ztlPoint);
                */

        }
               
               

        }

}

Mi puoi aiutare solo a mettere a posto il mio AsyncTask? Il costruttore che gli creo vuole una Road e una MapView.. ma come gliele passo? Non ho capito questa parte.