varios studio marcadores google example custom añadir agregar android google-maps android-mapview google-maps-android-api-2

studio - infowindow google maps android



¿Cómo dibujar polilínea discontinua con google map sdk v2? (4)

He revisado la documentación de la polilínea y no hay ninguna opción para hacerla discontinua.

¿Alguien sabe cómo dibujar polilínea discontinua con google map sdk v2?


Ahora en Polyline puede configurar el patrón como Dash, Dot o Gap, simplemente aplique lo siguiente

public static final int PATTERN_DASH_LENGTH_PX = 20; public static final int PATTERN_GAP_LENGTH_PX = 20; public static final PatternItem DOT = new Dot(); public static final PatternItem DASH = new Dash(PATTERN_DASH_LENGTH_PX); public static final PatternItem GAP = new Gap(PATTERN_GAP_LENGTH_PX); public static final List<PatternItem> PATTERN_POLYGON_ALPHA = Arrays.asList(GAP, DASH); private void drawDashedLeg(GoogleMap googleMap, Route route) { PolylineOptions polyOptions = new PolylineOptions(); polyOptions.color(ContextCompat.getColor(getContext(), R.color.coolgrey)); polyOptions.addAll(route.getPoints()); polyOptions.pattern(PATTERN_POLYGON_ALPHA); Polyline polyline = googleMap.addPolyline(polyOptions); polylines.add(polyline); }


Alexey, acabo de crear una función que me funcionó y creo que te ayudará a:

public static void createDashedLine(GoogleMap map, LatLng latLngOrig, LatLng latLngDest, int color){ double difLat = latLngDest.latitude - latLngOrig.latitude; double difLng = latLngDest.longitude - latLngOrig.longitude; double zoom = map.getCameraPosition().zoom; double divLat = difLat / (zoom * 2); double divLng = difLng / (zoom * 2); LatLng tmpLatOri = latLngOrig; for(int i = 0; i < (zoom * 2); i++){ LatLng loopLatLng = tmpLatOri; if(i > 0){ loopLatLng = new LatLng(tmpLatOri.latitude + (divLat * 0.25f), tmpLatOri.longitude + (divLng * 0.25f)); } Polyline polyline = map.addPolyline(new PolylineOptions() .add(loopLatLng) .add(new LatLng(tmpLatOri.latitude + divLat, tmpLatOri.longitude + divLng)) .color(color) .width(5f)); tmpLatOri = new LatLng(tmpLatOri.latitude + divLat, tmpLatOri.longitude + divLng); } }


Creé la siguiente función para dibujar polilínea de puntos con una lista de puntos de LatLng. Este algoritmo crea líneas de 0,002 kms (seguidas por huecos de 0,002 kms de metros) independientemente del zoom. Esto es útil cuando no desea volver a trazar polilíneas cuando cambia el zoom.

private void drawDashedPolyLine(GoogleMap mMap, ArrayList<LatLng> listOfPoints, int color) { /* Boolean to control drawing alternate lines */ boolean added = false; for (int i = 0; i < listOfPoints.size() - 1 ; i++) { /* Get distance between current and next point */ double distance = getConvertedDistance(listOfPoints.get(i),listOfPoints.get(i + 1)); /* If distance is less than 0.002 kms */ if (distance < 0.002) { if (!added) { mMap.addPolyline(new PolylineOptions() .add(listOfPoints.get(i)) .add(listOfPoints.get(i + 1)) .color(color)); added = true; } else {/* Skip this piece */ added = false; } } else { /* Get how many divisions to make of this line */ int countOfDivisions = (int) ((distance/0.002)); /* Get difference to add per lat/lng */ double latdiff = (listOfPoints.get(i+1).latitude - listOfPoints .get(i).latitude) / countOfDivisions; double lngdiff = (listOfPoints.get(i + 1).longitude - listOfPoints .get(i).longitude) / countOfDivisions; /* Last known indicates start point of polyline. Initialized to ith point */ LatLng lastKnowLatLng = new LatLng(listOfPoints.get(i).latitude, listOfPoints.get(i).longitude); for (int j = 0; j < countOfDivisions; j++) { /* Next point is point + diff */ LatLng nextLatLng = new LatLng(lastKnowLatLng.latitude + latdiff, lastKnowLatLng.longitude + lngdiff); if (!added) { mMap.addPolyline(new PolylineOptions() .add(lastKnowLatLng) .add(nextLatLng) .color(color)); added = true; } else { added = false; } lastKnowLatLng = nextLatLng; } } } } private double getConvertedDistance(LatLng latlng1, LatLng latlng2) { double distance = DistanceUtil.distance(latlng1.latitude, latlng1.longitude, latlng2.latitude, latlng2.longitude); BigDecimal bd = new BigDecimal(distance); BigDecimal res = bd.setScale(3, RoundingMode.DOWN); return res.doubleValue(); }

Util de la clase para calcular la distancia entre dos LatLng:

public class DistanceUtil { public static double distance(double lat1, double lon1, double lat2, double lon2) { if ((lat1 == lat2) && (lon1 == lon2)) { return 0; } else return distance(lat1, lon1, lat2, lon2, ''K''); } public static double distance(double lat1, double lon1, double lat2, double lon2, char unit) { double theta = lon1 - lon2; double dist = Math.sin(deg2rad(lat1)) * Math.sin(deg2rad(lat2)) + Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) * Math.cos(deg2rad(theta)); dist = Math.acos(dist); dist = rad2deg(dist); dist = dist * 60 * 1.1515; if (unit == ''K'') { dist = dist * 1.609344; } else if (unit == ''N'') { dist = dist * 0.8684; } return (dist); } private static double deg2rad(double deg) { return (deg * Math.PI / 180.0); } private static double rad2deg(double rad) { return (rad * 180.0 / Math.PI); } }

Nota: el algoritmo anterior genera una gran cantidad de polilíneas que pueden tardar en procesarse. Es útil solo cuando la lista de puntos es pequeña.


No es posible en la versión actual. Siga este problema para obtener actualizaciones: https://code.google.com/p/gmaps-api-issues/issues/detail?id=4633

ACTUALIZAR

Recientemente, Google implementó esta función para polilíneas en Google Maps Android API v2 y marcó el problema 4633 como Corregido.

Consulte la información sobre patrones de trazo en la Guía de formas . Vea un example en el tutorial de polilíneas y polígonos.

También puedes leer la entrada del blog correspondiente aquí:

https://maps-apis.googleblog.com/2017/02/styling-and-custom-data-for-polylines.html