2011-02-18 8 views
6

Puedo dibujar un camino entre dos ubicaciones, pero si la distancia es demasiado larga - más de 300 Kilómetros - la ruta no se dibuja por completo.¿Hay algún límite en la ruta de dibujo usando Geocoder (Android)?

Estoy utilizando el código de abajo con el fin de dibujar el camino:

class MapOverlay extends com.google.android.maps.Overlay { 
    Road mRoad; 
    ArrayList<GeoPoint> mPoints; 

    public MapOverlay(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(8); 
      } 
    } 

    @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; 
      } 
    } 

}

+0

está utilizando API de Google Maps? ¿Cuál fue tu fuente y tu destino cuando probaste la ruta de 300 km? –

+0

No hay ningún límite de ruta de dibujo con Geocoder. Utilice ** API de indicaciones de Google Maps **. Puede consultar desde [https://developers.google.com/maps/documentation/directions/]. –

+0

así que responde mi pregunta. ¿Su programa funciona bien con distancias más pequeñas? –

Respuesta

0
  • I Google API dirección no tiene un límite para la distancia que desea la ruta para. Tiene otras limitaciones, como la cantidad de solicitudes que puede hacer en 24 horas, etc. para más detalles, visite here.
  • Utilice siempre la última versión de los servicios api y play de google maps en su desarrollo de aplicaciones de Android.
  • Siga la guía en la guía api para programarlo de manera que haya menos posibilidades de fallas.
  • Así que a continuación tienes problemas para dibujar distancias, que son bastante más grandes, como 300 km. Supongo que puede dibujar fácilmente la ruta para distancias más cortas y no tiene ningún problema con ella. teniendo en cuenta esta condición (que se puede hacer fácilmente corta distancia) permite COMIENZO

Solución

  1. El problema que tiene en la elaboración de ruta es más grande debido a la gran cantidad de puntos de referencia y que conduce a un mayor requisito de memoria de la aplicación .
  2. Así que el kernel de Android proporciona una pequeña memoria a la aplicación mientras se ejecuta para su memoria de memoria virtual. pero eso no es suficiente para las rutas más grandes y su aplicación se bloqueará o colapsará en el peor de los casos.
  3. La solución que funcionó para mí es pedir explícitamente más memoria en montón al núcleo de Android. Puedes hacer esto en manifiesto

    <application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:largeHeap="true" 
    ......... 
    

    Por favor, echar un vistazo a la línea

    androide: largeHeap = "true"

    Esto es lo que hay que hacer en el código.

Espero que esta explicación haya sido útil para tu problema.

2

En primer lugar, usted debe utilizar Google Maps API V2 en lugar de la antigua obsoleta API V1

en la actividad, crear las referencias de Google Map y polilínea:

public class MapsActivity extends AppCompatActivity implements OnMapReadyCallback{ 

    private GoogleMap mMap; 
    Polyline line; 
    //...... 

En primer lugar definir el punto de referencia lista:

List<LatLng> latLngWaypointList = new ArrayList<>(); 

obtener la ruta, dibuje la polilínea para la ruta, y luego dibujar los marcadores de waypoint:

class GetDirectionsAsync extends AsyncTask<LatLng, Void, List<LatLng>> { 
    @Override 
    protected void onPreExecute() { 
     super.onPreExecute(); 
    } 

    @Override 
    protected List<LatLng> doInBackground(LatLng... params) { 
      List<LatLng> route = new ArrayList<>(); 
      //populate route...... 
      return route; 
    } 

    @Override 
    protected void onPostExecute(List<LatLng> route) { 

     if (route == null) return; 

     if (line != null){ 
      line.remove(); 
     } 

     PolylineOptions options = new PolylineOptions().width(5).color(Color.MAGENTA).geodesic(true); 
     for (int i = 0; i < pointsList.size(); i++) { 
      LatLng point = route.get(i); 
      //If this point is a waypoint, add it to the list 
      if (isWaypoint(i)) { 
       latLngWaypointList.add(point); 
      } 

      options.add(point); 
     } 
     //draw the route: 
     line = mMap.addPolyline(options); 

     //draw waypoint markers: 
     for (LatLng waypoint : latLngWaypointList) { 
      mMap.addMarker(new MarkerOptions().position(new LatLng(waypoint.latitude, waypoint.longitude)) 
        .title("Waypoint").icon(BitmapDescriptorFactory 
          .defaultMarker(BitmapDescriptorFactory.HUE_VIOLET))); 
     } 

    } 
} 

aquí es sólo una implementación marcador de posición de isWaypoint():

public boolean isWaypoint(int i) { 
    //replace with your implementation 
    if (i % 17 == 0) { 
     return true; 
    } 
    return false; 
} 

Resultado de una ruta de la costa oeste a la costa este, a unos 2.500 millas:

enter image description here

Resultado de una ruta más pequeña:

enter image description here

Tenga en cuenta que también estoy utilizando Google Directions Api en este ejemplo para hacer que la ruta encaje en las carreteras. Para obtener un ejemplo completo de cómo usar la API de Google Directions, consulte aquí: https://stackoverflow.com/a/32940175/4409409

+0

quiero cubrir el punto de múltiples vías con la línea del polígono ... –

+0

@ravi ¿Puedes explicarme un poco más exactamente lo que te gustaría lograr? ¿Tienes una maqueta UI de lo que quieres? –

+0

ver el enlace de ese tipo necesito una ruta http://imgur.com/IJvdIfH –

-1

Si no estoy equivocado, es muy simple dibujar una ruta en Google Maps. Código Fuente

var mumbai = new google.maps.LatLng(18.9750, 72.8258); 
     var mapOptions = { 
      zoom: 8, 
      center: mumbai 
     }; 
     map = new google.maps.Map(document.getElementById('dmap'), mapOptions); 
     directionsDisplay.setMap(map); 
     source="18.9750, 72.8258"; 
     destination= "18.9550, 72.8158"; 
     source = (source1.replace(" ", ",")); 
     destination = (destination1.replace(" ", ",")); 
     var request = { 
      origin: source, 
      destination: destination, 
      travelMode: google.maps.TravelMode.DRIVING 
     }; 
     directionsService.route(request, function (response, status) { 
      if (status == google.maps.DirectionsStatus.OK) { 
       directionsDisplay.setDirections(response); 
      } 
     }); 
Cuestiones relacionadas