最近一个项目要给老外用,用的googlemap,做一些小demo:
Google Mapandroid版和IOS版的SDK都没有集成路径规划的相关API,若要实现,只能通过http链接请求URL,携带起点终点经纬度,得到返回集合,在地图中展示。
Google Directions API :https://developers.google.com/maps/documentation/directions/#Waypoints
Directions Service:https://developers.google.com/maps/documentation/javascript/directions#DirectionsRequests
举个例子,请求地址如下:
origin=起点经纬度 destination=终点经纬度
代码如下:
public class EActivity extends AppCompatActivity implements OnMapReadyCallback { private GoogleMap mMap; MapFragment mapFragment; String mapurl; Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); String s1 = (String) msg.obj; JSONObject jObject; List<List<HashMap<String, String>>> routes = null; try { jObject = new JSONObject(s1); DirectionsJSONParser parser = new DirectionsJSONParser(); // Starts parsing data routes = parser.parse(jObject); System.out.println("do in background:" + routes); } catch (Exception e) { e.printStackTrace(); } ArrayList<LatLng> points = null; PolylineOptions lineOptions = null; MarkerOptions markerOptions = new MarkerOptions(); // Traversing through all the routes for (int i = 0; i < routes.size(); i++) { points = new ArrayList<LatLng>(); lineOptions = new PolylineOptions(); // Fetching i-th route List<HashMap<String, String>> path = routes.get(i); // Fetching all the points in i-th route for (int j = 0; j < path.size(); j++) { HashMap<String, String> point = path.get(j); double lat = Double.parseDouble(point.get("lat")); double lng = Double.parseDouble(point.get("lng")); LatLng position = new LatLng(lat, lng); points.add(position); } // Adding all the points in the route to LineOptions lineOptions.addAll(points); lineOptions.width(20); // Changing the color polyline according to the mode lineOptions.color(Color.YELLOW); } // Drawing polyline in the Google Map for the i-th route mMap.addPolyline(lineOptions); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.e); GoogleMapOptions googleMapOptions = new GoogleMapOptions(); mapFragment = MapFragment.newInstance(googleMapOptions); FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction(); fragmentTransaction.add(R.id.map, mapFragment); fragmentTransaction.commit(); mapFragment.getMapAsync(this); mapurl = getDirectionsUrl(new LatLng(39.99709957757345, 116.31184045225382), new LatLng(39.949158391497214, 116.4154639095068)); } private void request() { OkHttpClient okHttpClient = new OkHttpClient(); Request request = new Request.Builder().url(mapurl).get().build(); okHttpClient.newCall(request).enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { } @Override public void onResponse(Call call, Response response) throws IOException { String s1 = response.body().string(); Message message = new Message(); message.obj = s1; mHandler.sendMessage(message); } }); } @Override public void onMapReady(GoogleMap googleMap) { mMap = googleMap; LatLng sydney = new LatLng(39.99709957757345, 116.31184045225382); mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 12)); mMap.addCircle(new CircleOptions() .center(sydney) .radius(1000) .strokeWidth(5) .strokeColor(Color.RED) .fillColor(Color.BLACK) ); mMap.addCircle(new CircleOptions() .center(new LatLng(39.949158391497214,116.4154639095068)) .radius(1000) .strokeWidth(5) .strokeColor(Color.RED) .fillColor(Color.TRANSPARENT) ); request(); } private String getDirectionsUrl(LatLng origin, LatLng dest) { // Origin of route String str_origin = "origin=" + origin.latitude + "," + origin.longitude; // Destination of route String str_dest = "destination=" + dest.latitude + "," + dest.longitude; // Sensor enabled String sensor = "sensor=false"; // Travelling Mode String mode = "mode=driving"; //waypoints,116.32885,40.036675 String waypointLatLng = "waypoints=" + "40.036675" + "," + "116.32885"; // Building the parameters to the web service String parameters = str_origin + "&" + str_dest + "&" + sensor + "&" + mode + "&" + waypointLatLng; // Output format String output = "json"; // Building the url to the web service String url = "https://maps.googleapis.com/maps/api/directions/" + output + "?" + parameters; System.out.println("getDerectionsURL--->: " + url); return url; } public class DirectionsJSONParser { public List<List<HashMap<String, String>>> parse(JSONObject jObject) { List<List<HashMap<String, String>>> routes = new ArrayList<List<HashMap<String, String>>>(); JSONArray jRoutes = null; JSONArray jLegs = null; JSONArray jSteps = null; try { jRoutes = jObject.getJSONArray("routes"); /** Traversing all routes */ for (int i = 0; i < jRoutes.length(); i++) { jLegs = ((JSONObject) jRoutes.get(i)).getJSONArray("legs"); List path = new ArrayList<HashMap<String, String>>(); /** Traversing all legs */ for (int j = 0; j < jLegs.length(); j++) { jSteps = ((JSONObject) jLegs.get(j)).getJSONArray("steps"); /** Traversing all steps */ for (int k = 0; k < jSteps.length(); k++) { String polyline = ""; polyline = (String) ((JSONObject) ((JSONObject) jSteps .get(k)).get("polyline")).get("points"); List<LatLng> list = decodePoly(polyline); /** Traversing all points */ for (int l = 0; l < list.size(); l++) { HashMap<String, String> hm = new HashMap<String, String>(); hm.put("lat", Double.toString(((LatLng) list.get(l)).latitude)); hm.put("lng", Double.toString(((LatLng) list.get(l)).longitude)); path.add(hm); } } routes.add(path); } } } catch (JSONException e) { e.printStackTrace(); } catch (Exception e) { } return routes; } private List<LatLng> decodePoly(String encoded) { List<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 p = new LatLng((((double) lat / 1E5)), (((double) lng / 1E5))); poly.add(p); } return poly; } } }