He estado muy ocupado durante mucho tiempo en encontrar la forma de dibujar una línea entre dos (GPS) puntos en el mapa en HelloMapView, pero no hubo suerte.

Podría alguien por favor me diga cómo hacerlo.

Supongamos que yo uso el HelloMapView que se extiende MapView. Qué necesito para utilizar superposiciones? Si es así ¿debo anular el onDraw (), método de la superposición y dibujar una línea aquí? De hecho, me trató a estas cosas, pero sin resultado.

Gracias de antemano!

  • Usted podría reemplazar el método onDraw de la MapView (y no te olvides de llamar a la clase base onDraw) pero es más fácil usar la superposición. Tal vez usted nos puede mostrar el código de onDraw de la superposición de la clase para que podamos ver lo que sucede?
InformationsquelleAutor mnish | 2010-02-01

12 Comentarios

  1. 113

    Gracias por su ayuda. Por fin podía dibujar una línea en el mapa.
    Así es como he hecho:

    /** Called when the activity is first created. */
    private List<Overlay> mapOverlays;
    private Projection projection;  
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    linearLayout = (LinearLayout) findViewById(R.id.zoomview);
    mapView = (MapView) findViewById(R.id.mapview);
    mapView.setBuiltInZoomControls(true);
    mapOverlays = mapView.getOverlays();        
    projection = mapView.getProjection();
    mapOverlays.add(new MyOverlay());        
    }
    @Override
    protected boolean isRouteDisplayed() {
    return false;
    }
    class MyOverlay extends Overlay{
    public MyOverlay(){
    }   
    public void draw(Canvas canvas, MapView mapv, boolean shadow){
    super.draw(canvas, mapv, shadow);
    Paint   mPaint = new Paint();
    mPaint.setDither(true);
    mPaint.setColor(Color.RED);
    mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
    mPaint.setStrokeJoin(Paint.Join.ROUND);
    mPaint.setStrokeCap(Paint.Cap.ROUND);
    mPaint.setStrokeWidth(2);
    GeoPoint gP1 = new GeoPoint(19240000,-99120000);
    GeoPoint gP2 = new GeoPoint(37423157, -122085008);
    Point p1 = new Point();
    Point p2 = new Point();
    Path path = new Path();
    Projection projection=mapv.getProjection();
    projection.toPixels(gP1, p1);
    projection.toPixels(gP2, p2);
    path.moveTo(p2.x, p2.y);
    path.lineTo(p1.x,p1.y);
    canvas.drawPath(path, mPaint);
    }
    • Según la documentación, el método draw() es llamado dos veces, primero con sombra = true, para permitir la Superposición a dibujar sombras de marcadores, por ejemplo, y luego una vez más con sombra = false. Así que si usted no tiene las sombras de tu superposición simplemente debe devolver y dibujar nada, cuando shadow == true.
    • si agrega más puntos para formar un área cerrada, entonces se puede dibujar un polígono llena de Color.ROJO.
    • Yo experimentando un Inflar la Excepción. ¿Cuál podría ser la razón?
    • eso es algo que hacer a la hora de inflar su fichero xml de diseño. Posiblemente cuando usted está tratando de recuperar su mapview. Tal vez usted tiene un defecto de la tarjeta de identidad?
    • Necesito lo mismo, pero yo en mi caso tengo varias ubicaciones a dibujar. Yo estoy usando un bucle for para el mismo, pero mi camino no es dibujar. Puede usted por favor me ayude. stackoverflow.com/questions/11745913/…
    • bien, he utilizado tu código pero mi dibujo linge obtener desapareció puede plz compartir la solución , http://stackoverflow.com/questions/14058179/drawing-path-get-vanished-after-drawing-it-in-a-google-map
    • También será una buena práctica para eliminar los objetos inmutables de la creación del método draw ().
    • Lo que se necesita para ser importados con el fin de utilizar la Superposición de clase?

  2. 35

    Para aquellos que realmente sólo desea dibujar una línea simple – de hecho hay también la breve versión corta.

    GoogleMap map;
    //... get a map.
    //Add a thin red line from London to New York.
    Polyline line = map.addPolyline(new PolylineOptions()
    .add(new LatLng(51.5, -0.1), new LatLng(40.7, -74.0))
    .width(5)
    .color(Color.RED));

    de https://developers.google.com/maps/documentation/android/reference/com/google/android/gms/maps/model/Polyline

    • No creo que la Polilínea de la línea tiene que estar ahí, gracias, funciona a la perfección
    • Que se necesita y es muy útil para saber, porque si queremos tener sólo uno, al mismo tiempo que usted necesita para eliminar previamente creado uno.
  3. 21
    //This Activity will draw a line between two selected points on Map
    public class MainActivity extends MapActivity {
    MapView myMapView = null;
    MapController myMC = null;
    GeoPoint geoPoint = null;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    myMapView = (MapView) findViewById(R.id.mapview);
    geoPoint = null;
    myMapView.setSatellite(false);
    String pairs[] = getDirectionData("ahmedabad", "vadodara");
    String[] lngLat = pairs[0].split(",");
    //STARTING POINT
    GeoPoint startGP = new GeoPoint(
    (int) (Double.parseDouble(lngLat[1]) * 1E6), (int) (Double
    .parseDouble(lngLat[0]) * 1E6));
    myMC = myMapView.getController();
    geoPoint = startGP;
    myMC.setCenter(geoPoint);
    myMC.setZoom(15);
    myMapView.getOverlays().add(new DirectionPathOverlay(startGP, startGP));
    //NAVIGATE THE PATH
    GeoPoint gp1;
    GeoPoint gp2 = startGP;
    for (int i = 1; i < pairs.length; i++) {
    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));
    myMapView.getOverlays().add(new DirectionPathOverlay(gp1, gp2));
    Log.d("xxx", "pair:" + pairs[i]);
    }
    //END POINT
    myMapView.getOverlays().add(new DirectionPathOverlay(gp2, gp2));
    myMapView.getController().animateTo(startGP);
    myMapView.setBuiltInZoomControls(true);
    myMapView.displayZoomControls(true);
    }
    @Override
    protected boolean isRouteDisplayed() {
    //TODO Auto-generated method stub
    return false;
    }
    private String[] getDirectionData(String srcPlace, String destPlace) {
    String urlString = "http://maps.google.com/maps?f=d&hl=en&saddr="
    + srcPlace + "&daddr=" + destPlace
    + "&ie=UTF8&0&om=0&output=kml";
    Log.d("URL", urlString);
    Document doc = null;
    HttpURLConnection urlConnection = null;
    URL url = null;
    String pathConent = "";
    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());
    } catch (Exception e) {
    }
    NodeList nl = doc.getElementsByTagName("LineString");
    for (int s = 0; s < nl.getLength(); s++) {
    Node rootNode = nl.item(s);
    NodeList configItems = rootNode.getChildNodes();
    for (int x = 0; x < configItems.getLength(); x++) {
    Node lineStringNode = configItems.item(x);
    NodeList path = lineStringNode.getChildNodes();
    pathConent = path.item(0).getNodeValue();
    }
    }
    String[] tempContent = pathConent.split(" ");
    return tempContent;
    }
    }
    //*****************************************************************************
    DirectionPathOverlay
    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);
    }
    }
    • He estado trabajando en algo como esto, como en extiendo Superposición pero el uso de dibujar para dibujar una línea entre los puntos. La diferencia es que yo estoy usando el GPS para el seguimiento de mi movimiento y cada vez que una nueva posición se encuentra, se agrega a un objeto ArrayList y, a continuación, un nuevo DirectionPathOverlay se crea a partir de los 2 más recientes de posiciones en el ArrayList. Mi problema es que las líneas no aparecen en el mapa a menos que yo interactuar con el mapa, por ejemplo si toco la pantalla y mover para desplazar el mapa, a continuación, acerca de los últimos 10 segundos de la línea de dibujo aparecerá, cualquier idea de por qué no se dibujo en vivo, mientras yo moverse sólo cuando me relaciono?
    • Debería post que como una pregunta nueva, no como un comentario.
    • Estoy intentando el mismo código que tus explicar aquí. Pero estoy recibiendo el error en esta línea de pares de Cadena[] = getDirectionData(«ahmedabad», «vadodara»); y la aplicación te va a forzar cierre. Plz puede ayudar en este problema .
  4. 12

    Este es el código fuente completo para dibujar la dirección de la ruta de la fuente de latitud y longitud de destino de latitud y longitud. He cambiado el código anterior para que se ajuste de latitud y longitud lugar de origen y de destino.
    Así que cualquier persona que está accediendo a su latitud y la longitud a través de su gps puede obtener la dirección de su dispositivo gps para el destino de coordenadas.

    Gracias a las respuestas anteriores podemos hacer un cambio y obtener la dirección de la ruta.

    public class DrawMapActivity extends MapActivity {
    MapView myMapView = null;
    MapController myMC = null;
    GeoPoint geoPoint = null;
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    myMapView = (MapView) findViewById(R.id.mapview);
    geoPoint = null;
    myMapView.setSatellite(false);
    double fromLat = 12.303534;
    double fromLong = 76.64611;
    double toLat = 12.9715987;
    double toLong = 77.5945627;
    String sourceLat = Double.toString(fromLat);
    String sourceLong = Double.toString(fromLong);
    String destinationLat = Double.toString(toLat);
    String destinationLong = Double.toString(toLong);
    String pairs[] = getDirectionData(sourceLat,sourceLong, destinationLat, destinationLong );
    String[] lngLat = pairs[0].split(",");
    //STARTING POINT
    GeoPoint startGP = new GeoPoint((int) (Double.parseDouble(lngLat[1]) * 1E6), (int) (Double.parseDouble(lngLat[0]) * 1E6));
    myMC = myMapView.getController();
    geoPoint = startGP;
    myMC.setCenter(geoPoint);
    myMC.setZoom(10);
    myMapView.getOverlays().add(new DirectionPathOverlay(startGP, startGP));
    //NAVIGATE THE PATH
    GeoPoint gp1;
    GeoPoint gp2 = startGP;
    for (int i = 1; i < pairs.length; i++) {
    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));
    myMapView.getOverlays().add(new DirectionPathOverlay(gp1, gp2));
    Log.d("xxx", "pair:" + pairs[i]);
    }
    //END POINT
    myMapView.getOverlays().add(new DirectionPathOverlay(gp2, gp2));
    myMapView.getController().animateTo(startGP);
    myMapView.setBuiltInZoomControls(true);
    myMapView.displayZoomControls(true);
    }
    @Override
    protected boolean isRouteDisplayed() {
    //TODO Auto-generated method stub
    return false;
    }
    private String[] getDirectionData(String sourceLat, String sourceLong, String destinationLat, String destinationLong) {
    String urlString = "http://maps.google.com/maps?f=d&hl=en&" +"saddr="+sourceLat+","+sourceLong+"&daddr="+destinationLat+","+destinationLong + "&ie=UTF8&0&om=0&output=kml";
    Log.d("URL", urlString);
    Document doc = null;
    HttpURLConnection urlConnection = null;
    URL url = null;
    String pathConent = "";
    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());
    } catch (Exception e) {
    }
    NodeList nl = doc.getElementsByTagName("LineString");
    for (int s = 0; s < nl.getLength(); s++) {
    Node rootNode = nl.item(s);
    NodeList configItems = rootNode.getChildNodes();
    for (int x = 0; x < configItems.getLength(); x++) {
    Node lineStringNode = configItems.item(x);
    NodeList path = lineStringNode.getChildNodes();
    pathConent = path.item(0).getNodeValue();
    }
    }
    String[] tempContent = pathConent.split(" ");
    return tempContent;
    }
    }
    //*****************************************************************************
    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);
    }
    }

    Espero que sea de ayuda para otros Desbordamiento de la Pila de usuarios

    • Estoy intentando el mismo código que tus explicar aquí. Pero estoy recibiendo el error en esta línea de pares de Cadena[] = getDirectionData(«ahmedabad», «vadodara»); y la aplicación te va a forzar cierre. Plz puede ayudar en este problema .
    • si usted puede ver mi código anterior correctamente estoy pasando de latitud y longitud de esa fuente y lugares de destino, no estoy de paso en la ciudad de nombres. richa123 está de paso en la ciudad de nombres para obtener la dirección entre dos ciudades. gracias.
    • He intentado como por el código también. Estoy recibiendo el mismo Error. Pares de cadena[] = getDirectionData(sourceLat,sourceLong, destinationLat, destinationLong ); yo estoy llegando cerca de la fuerza en esta línea. Plz me pueden enviar un código de ejemplo
    • publica tu código con el diseño y la logcat detalles.
    • Gracias Por Tu respuesta. He publicado el código y logcat detalles stackoverflow.com/questions/11895184/…
  5. 10

    Esto se puede hacer mediante el uso de las intenciones demasiado:

      final Intent intent = new Intent(Intent.ACTION_VIEW,
    Uri.parse(
    "http://maps.google.com/maps?" +
    "saddr="+YOUR_START_LONGITUDE+","+YOUR_START_LATITUDE+"&daddr="YOUR_END_LONGITUDE+","+YOUR_END_LATITUDE));
    intent.setClassName(
    "com.google.android.apps.maps",
    "com.google.android.maps.MapsActivity");
    startActivity(intent);
    • Latitud debe venir antes de longiturde en la dirección url params
    • El método más simple … funciona bien .
  6. 4

    Sí necesita utilizar superposiciones.

    Usted necesita para obtener el MapView del superposiciones y agregar su nueva superposición sobre ella.

    Su clase extiende de Superposición, que es un lienzo transparente en el que puede dibujar en él, como cualquier otro lienzo.

    Puede utilizar mapView.getProjection() para obtener la proyección de la vista de mapa.

    Más info aquí: http://blogoscoped.com/archive/2008-12-15-n14.html

    • Estoy intentando el mismo código que tus explicar aquí. Pero estoy recibiendo el error en esta línea de pares de Cadena[] = getDirectionData(«ahmedabad», «vadodara»); y la aplicación te va a forzar cierre. Plz puede ayudar en este problema .
  7. 3

    Es realmente fácil con Google Maps Android API v2

    Sólo tienes que copiar el ejemplo de Documentación del desarrollador

    (por supuesto, usted tiene que init su mapa de la primera)

    GoogleMap map;
    //... get a map.
    //Add a thin red line from London to New York.
    Polyline line = map.addPolyline(new PolylineOptions()
    .add(new LatLng(51.5, -0.1), new LatLng(40.7, -74.0))
    .width(5)
    .color(Color.RED));
    • ¿Cómo puedo añadir este código en el mapa y donde
    • cuando se crea el mapa de la Actividad de simple android studio tamplate), usted puede añadir este código en el onMapReady método en el mapa de la actividad.
  8. 1

    Usted puede obtener la proyección de la MapView objeto que se pasa al método draw ():
    mapv.getProjection().toPixels(gP1, p1);

  9. 1
    public class MainActivity extends FragmentActivity  {
    List<Overlay> mapOverlays;
    GeoPoint point1, point2;
    LocationManager locManager;
    Drawable drawable;
    Document document;
    GMapV2GetRouteDirection v2GetRouteDirection;
    LatLng fromPosition;
    LatLng toPosition;
    GoogleMap mGoogleMap;
    MarkerOptions markerOptions;
    Location location ;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    v2GetRouteDirection = new GMapV2GetRouteDirection();
    SupportMapFragment supportMapFragment = (SupportMapFragment) getSupportFragmentManager()
    .findFragmentById(R.id.map);
    mGoogleMap = supportMapFragment.getMap();
    //Enabling MyLocation in Google Map
    mGoogleMap.setMyLocationEnabled(true);
    mGoogleMap.getUiSettings().setZoomControlsEnabled(true);
    mGoogleMap.getUiSettings().setCompassEnabled(true);
    mGoogleMap.getUiSettings().setMyLocationButtonEnabled(true);
    mGoogleMap.getUiSettings().setAllGesturesEnabled(true);
    mGoogleMap.setTrafficEnabled(true);
    mGoogleMap.animateCamera(CameraUpdateFactory.zoomTo(12));
    markerOptions = new MarkerOptions();
    fromPosition = new LatLng(11.663837, 78.147297);
    toPosition = new LatLng(11.723512, 78.466287);
    GetRouteTask getRoute = new GetRouteTask();
    getRoute.execute();
    }
    /**
    *
    * @author VIJAYAKUMAR M
    * This class Get Route on the map
    *
    */
    private class GetRouteTask extends AsyncTask<String, Void, String> {
    private ProgressDialog Dialog;
    String response = "";
    @Override
    protected void onPreExecute() {
    Dialog = new ProgressDialog(MainActivity.this);
    Dialog.setMessage("Loading route...");
    Dialog.show();
    }
    @Override
    protected String doInBackground(String... urls) {
    //Get All Route values
    document = v2GetRouteDirection.getDocument(fromPosition, toPosition,          GMapV2GetRouteDirection.MODE_DRIVING);
    response = "Success";
    return response;
    }
    @Override
    protected void onPostExecute(String result) {
    mGoogleMap.clear();
    if(response.equalsIgnoreCase("Success")){
    ArrayList<LatLng> directionPoint = v2GetRouteDirection.getDirection(document);
    PolylineOptions rectLine = new PolylineOptions().width(10).color(
    Color.RED);
    for (int i = 0; i < directionPoint.size(); i++) {
    rectLine.add(directionPoint.get(i));
    }
    //Adding route on the map
    mGoogleMap.addPolyline(rectLine);
    markerOptions.position(toPosition);
    markerOptions.draggable(true);
    mGoogleMap.addMarker(markerOptions);
    }
    Dialog.dismiss();
    }
    }
    @Override
    protected void onStop() {
    super.onStop();
    finish();
    }
    }

    Ayudante de ruta de la clase

     public class GMapV2GetRouteDirection {
    public final static String MODE_DRIVING = "driving";
    public final static String MODE_WALKING = "walking";
    public GMapV2GetRouteDirection() { }
    public Document getDocument(LatLng start, LatLng end, String mode) {
    String url = "http://maps.googleapis.com/maps/api/directions/xml?"
    + "origin=" + start.latitude + "," + start.longitude 
    + "&destination=" + end.latitude + "," + end.longitude
    + "&sensor=false&units=metric&mode=driving";
    try {
    HttpClient httpClient = new DefaultHttpClient();
    HttpContext localContext = new BasicHttpContext();
    HttpPost httpPost = new HttpPost(url);
    HttpResponse response = httpClient.execute(httpPost, localContext);
    InputStream in = response.getEntity().getContent();
    DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
    Document doc = builder.parse(in);
    return doc;
    } catch (Exception e) {
    e.printStackTrace();
    }
    return null;
    }
    public String getDurationText (Document doc) {
    NodeList nl1 = doc.getElementsByTagName("duration");
    Node node1 = nl1.item(0);
    NodeList nl2 = node1.getChildNodes();
    Node node2 = nl2.item(getNodeIndex(nl2, "text"));
    Log.i("DurationText", node2.getTextContent());
    return node2.getTextContent();
    }
    public int getDurationValue (Document doc) {
    NodeList nl1 = doc.getElementsByTagName("duration");
    Node node1 = nl1.item(0);
    NodeList nl2 = node1.getChildNodes();
    Node node2 = nl2.item(getNodeIndex(nl2, "value"));
    Log.i("DurationValue", node2.getTextContent());
    return Integer.parseInt(node2.getTextContent());
    }
    public String getDistanceText (Document doc) {
    NodeList nl1 = doc.getElementsByTagName("distance");
    Node node1 = nl1.item(0);
    NodeList nl2 = node1.getChildNodes();
    Node node2 = nl2.item(getNodeIndex(nl2, "text"));
    Log.i("DistanceText", node2.getTextContent());
    return node2.getTextContent();
    }
    public int getDistanceValue (Document doc) {
    NodeList nl1 = doc.getElementsByTagName("distance");
    Node node1 = nl1.item(0);
    NodeList nl2 = node1.getChildNodes();
    Node node2 = nl2.item(getNodeIndex(nl2, "value"));
    Log.i("DistanceValue", node2.getTextContent());
    return Integer.parseInt(node2.getTextContent());
    }
    public String getStartAddress (Document doc) {
    NodeList nl1 = doc.getElementsByTagName("start_address");
    Node node1 = nl1.item(0);
    Log.i("StartAddress", node1.getTextContent());
    return node1.getTextContent();
    }
    public String getEndAddress (Document doc) {
    NodeList nl1 = doc.getElementsByTagName("end_address");
    Node node1 = nl1.item(0);
    Log.i("StartAddress", node1.getTextContent());
    return node1.getTextContent();
    }
    public String getCopyRights (Document doc) {
    NodeList nl1 = doc.getElementsByTagName("copyrights");
    Node node1 = nl1.item(0);
    Log.i("CopyRights", node1.getTextContent());
    return node1.getTextContent();
    }
    public ArrayList<LatLng> getDirection (Document doc) {
    NodeList nl1, nl2, nl3;
    ArrayList<LatLng> listGeopoints = new ArrayList<LatLng>();
    nl1 = doc.getElementsByTagName("step");
    if (nl1.getLength() > 0) {
    for (int i = 0; i < nl1.getLength(); i++) {
    Node node1 = nl1.item(i);
    nl2 = node1.getChildNodes();
    Node locationNode = nl2.item(getNodeIndex(nl2, "start_location"));
    nl3 = locationNode.getChildNodes();
    Node latNode = nl3.item(getNodeIndex(nl3, "lat"));
    double lat = Double.parseDouble(latNode.getTextContent());
    Node lngNode = nl3.item(getNodeIndex(nl3, "lng"));
    double lng = Double.parseDouble(lngNode.getTextContent());
    listGeopoints.add(new LatLng(lat, lng));
    locationNode = nl2.item(getNodeIndex(nl2, "polyline"));
    nl3 = locationNode.getChildNodes();
    latNode = nl3.item(getNodeIndex(nl3, "points"));
    ArrayList<LatLng> arr = decodePoly(latNode.getTextContent());
    for(int j = 0 ; j < arr.size() ; j++) {
    listGeopoints.add(new LatLng(arr.get(j).latitude, arr.get(j).longitude));
    }
    locationNode = nl2.item(getNodeIndex(nl2, "end_location"));
    nl3 = locationNode.getChildNodes();
    latNode = nl3.item(getNodeIndex(nl3, "lat"));
    lat = Double.parseDouble(latNode.getTextContent());
    lngNode = nl3.item(getNodeIndex(nl3, "lng"));
    lng = Double.parseDouble(lngNode.getTextContent());
    listGeopoints.add(new LatLng(lat, lng));
    }
    }
    return listGeopoints;
    }
    private int getNodeIndex(NodeList nl, String nodename) {
    for(int i = 0 ; i < nl.getLength() ; i++) {
    if(nl.item(i).getNodeName().equals(nodename))
    return i;
    }
    return -1;
    }
    private ArrayList<LatLng> decodePoly(String encoded) {
    ArrayList<LatLng> poly = new ArrayList<LatLng>();
    int index = 0, len = encoded.length();
    int lat = 0, lng = 0;
    while (index < len) {
    int b, shift = 0, result = 0;
    do {
    b = encoded.charAt(index++) - 63;
    result |= (b & 0x1f) << shift;
    shift += 5;
    } while (b >= 0x20);
    int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
    lat += dlat;
    shift = 0;
    result = 0;
    do {
    b = encoded.charAt(index++) - 63;
    result |= (b & 0x1f) << shift;
    shift += 5;
    } while (b >= 0x20);
    int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
    lng += dlng;
    LatLng position = new LatLng((double) lat / 1E5, (double) lng / 1E5);
    poly.add(position);
    }
    return poly;
    }
    }
  10. 0

    sólo voy a encontrar el empate con algunos rectángulo en mapview sólo queremos el cambio de la pintura, como nos gusta

    EmptyOverlay.java

    public class EmptyOverlay extends Overlay {
    private float x1,y1;
    private MapExampleActivity mv = null;
    private Overlay overlay = null;
    public EmptyOverlay(MapExampleActivity mapV){
    mv = mapV;
    }
    @Override
    public boolean draw(Canvas canvas, MapView mapView, boolean shadow,
    long when) {
    //TODO Auto-generated method stub
    return super.draw(canvas, mapView, shadow, when);
    }
    @Override
    public boolean onTouchEvent(MotionEvent e, MapView mapView) {
    if(mv.isEditMode()){
    if(e.getAction() == MotionEvent.ACTION_DOWN){
    //when user presses the map add a new overlay to the map
    //move events will be catched by newly created overlay
    x1 = y1 = 0;
    x1 = e.getX();
    y1 = e.getY();
    overlay = new MapOverlay(mv, x1, y1);
    mapView.getOverlays().add(overlay);
    }
    if(e.getAction() == MotionEvent.ACTION_MOVE){
    }
    //---when user lifts his finger---
    if (e.getAction() == MotionEvent.ACTION_UP) {                
    }    
    return true;
    }
    return false;
    }
    }

    MapExampleActivity.java

     public class MapExampleActivity extends MapActivity {
    private MapView mapView;
    private boolean isEditMode = false;
    private Button toogle;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    toogle = (Button)findViewById(R.id.toogleMap);        
    toogle.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick(View v) {
    toogleEditMode();
    }
    });
    mapView = (MapView)findViewById(R.id.mapview);
    mapView.setBuiltInZoomControls(true); //display zoom controls
    //add one empty overlay acting as a overlay loader. This will catch press events and will add the actual overlays
    mapView.getOverlays().add(new EmptyOverlay(this));
    mapView.postInvalidate();
    }
    //toogle edit mode for drawing or navigating the map
    private void toogleEditMode(){
    isEditMode = !isEditMode;
    }
    @Override
    protected boolean isRouteDisplayed() {
    //TODO Auto-generated method stub
    return false;
    }
    @Override
    protected boolean isLocationDisplayed() {
    return false;
    }
    public boolean isEditMode(){
    return this.isEditMode;
    }
    public MapView getMapView(){
    return this.mapView;
    }
    }

    MapOverlay.java

     public class MapOverlay extends Overlay {
    private float x1,y1,x2,y2;
    private GeoPoint p1=null,p2=null;
    private MapExampleActivity mv = null;
    private Paint paint = new Paint();
    private boolean isUp = false;
    //constructor receiving the initial point
    public MapOverlay(MapExampleActivity mapV,float x,float y){
    paint.setStrokeWidth(2.0f);
    x1 = x;
    y1 = y;
    mv = mapV;
    p1 = mapV.getMapView().getProjection().fromPixels((int)x1,(int)y1);
    }
    //override draw method to add our custom drawings
    @Override
    public boolean draw(Canvas canvas, MapView mapView, boolean shadow,
    long when) {
    if(p1 != null && p2 != null){
    //get the 2 geopoints defining the area and transform them to pixels
    //this way if we move or zoom the map rectangle will follow accordingly
    Point screenPts1 = new Point();
    mapView.getProjection().toPixels(p1, screenPts1);
    Point screenPts2 = new Point();
    mapView.getProjection().toPixels(p2, screenPts2);
    //draw inner rectangle
    paint.setColor(0x4435EF56);
    paint.setStyle(Style.FILL);
    canvas.drawRect(screenPts1.x, screenPts1.y, screenPts2.x, screenPts2.y, paint);
    //draw outline rectangle
    paint.setColor(0x88158923);
    paint.setStyle(Style.STROKE);
    canvas.drawRect(screenPts1.x, screenPts1.y, screenPts2.x, screenPts2.y, paint);
    }
    return true;
    }
    @Override
    public boolean onTouchEvent(MotionEvent e, MapView mapView) {
    if(mv.isEditMode() && !isUp){
    if(e.getAction() == MotionEvent.ACTION_DOWN){
    x1 = y1 = 0;
    x1 = e.getX();
    y1 = e.getY();
    p1 = mapView.getProjection().fromPixels((int)x1,(int)y1);
    }
    //here we constantly change geopoint p2 as we move out finger
    if(e.getAction() == MotionEvent.ACTION_MOVE){
    x2 = e.getX();
    y2 = e.getY();
    p2 = mapView.getProjection().fromPixels((int)x2,(int)y2);
    }
    //---when user lifts his finger---
    if (e.getAction() == MotionEvent.ACTION_UP) {                
    isUp = true;
    }    
    return true;
    }
    return false;
    }
    }

    ver este http://n3vrax.wordpress.com/2011/08/13/drawing-overlays-on-android-map-view/

  11. 0
    Try this one:
    Add itemizedOverlay class:
    public class AndroidGoogleMapsActivity extends MapActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //Displaying Zooming controls
    MapView mapView = (MapView) findViewById(R.id.mapview);
    mapView.setBuiltInZoomControls(true);
    MapController mc = mapView.getController();
    double lat = Double.parseDouble("48.85827758964043");
    double lon = Double.parseDouble("2.294543981552124");
    GeoPoint geoPoint = new GeoPoint((int)(lat * 1E6), (int)(lon * 1E6));
    mc.animateTo(geoPoint);
    mc.setZoom(15);
    mapView.invalidate(); 
    /**
    * Placing Marker
    * */
    List<Overlay> mapOverlays = mapView.getOverlays();
    Drawable drawable = this.getResources().getDrawable(R.drawable.mark_red);
    AddItemizedOverlay itemizedOverlay = 
    new AddItemizedOverlay(drawable, this);
    OverlayItem overlayitem = new OverlayItem(geoPoint, "Hello", "Sample Overlay item");
    itemizedOverlay.addOverlay(overlayitem);
    mapOverlays.add(itemizedOverlay);
    }
    @Override
    protected boolean isRouteDisplayed() {
    return false;
    }
    }
  12. -2

    Esto funcionó para mí. Con el método mencionado aquí que yo era capaz de dibujar polilíneas en Google Maps V2. Dibujé una nueva línea cada vez que el usuario se cambió de ubicación, así que la polilínea se ve como el camino seguido por el usuario en el mapa.

    Código fuente.
    Github: prasang7/eTaxi Metros

    Por favor, hacer caso omiso de otros módulos de este proyecto está relacionado con el cálculo de la distancia y de la Interfaz de Usuario si usted no está interesado en ellos.

    • Enlace-sólo respuestas no son la forma de ASÍ. Los enlaces pueden ser obsoletos algún día. Por favor, edita tu respuesta para incluir esencial de la información!
    • Hola jogo, gracias por su comentario, pero lo siento yo no se que. Puede usted por favor describa el problema. 🙂
    • Es mejor incluir el código correspondiente aquí en Stack Overflow, ya que el enlace a Github algún día podría ir mal.
    • no sólo un enlace, pero el enlace está muerto

Dejar respuesta

Please enter your comment!
Please enter your name here