google maps - Is there any limit to drawing path using Geocoder (Android)? -
i able draw path between 2 locations, if distance long - more 300 kilometers - path not drawn completely.
i using code below in order draw path:
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>(); (int = 0; < 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); (int = 0; < 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; } }
}
first of all, should using google maps api v2 instead of old deprecated v1 api
in activity, create google map , polyline references:
public class mapsactivity extends appcompatactivity implements onmapreadycallback{ private googlemap mmap; polyline line; //......
first define waypoint list:
list<latlng> latlngwaypointlist = new arraylist<>();
get route, draw polyline route, , draw waypoint markers:
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); (int = 0; < pointslist.size(); i++) { latlng point = route.get(i); //if point waypoint, add list if (iswaypoint(i)) { latlngwaypointlist.add(point); } options.add(point); } //draw route: line = mmap.addpolyline(options); //draw waypoint markers: (latlng waypoint : latlngwaypointlist) { mmap.addmarker(new markeroptions().position(new latlng(waypoint.latitude, waypoint.longitude)) .title("waypoint").icon(bitmapdescriptorfactory .defaultmarker(bitmapdescriptorfactory.hue_violet))); } } }
here placeholder implementation of iswaypoint():
public boolean iswaypoint(int i) { //replace implementation if (i % 17 == 0) { return true; } return false; }
result route west coast east coast, 2500 miles:
result of smaller route:
note i'm using google directions api in example in order make route snap roads. full example of how use google directions api, see here: https://stackoverflow.com/a/32940175/4409409
Comments
Post a Comment