Android Google Map –两点之间的绘图路线
时间:2020-02-23 14:28:57 来源:igfitidea点击:
在本教程中,我们将创建一个Android应用程序,该应用程序在两点之间绘制一条可能的Google地图路线。
我们将在应用程序中使用Google Maps Directions API。
Android Google Map –绘图路线
使用本教程中演示的步骤,从API控制台创建一个新的Google Map API密钥。
创建一个新的Android Studio项目,然后选择模板作为Google Maps Activity。
将API密钥添加到位于debug-> res-> values文件夹中的google_maps_api.xml文件中
如果您使用的是最新的Android Studio,则该应用程序应为这样。
Android Google Maps绘图路径项目结构
DirectionsJSONParser.java文件是解析位置并返回路线的文件。
然后调用decodePoly()方法来获取折线数据,该折线数据稍后会在地图上绘制。
Android Google Maps绘图路线代码
MainActivity.java
代码如下。
public class MapsActivity extends FragmentActivity implements OnMapReadyCallback { private GoogleMap mMap; ArrayList markerPoints= new ArrayList(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_maps); //Obtain the SupportMapFragment and get notified when the map is ready to be used. SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager() .findFragmentById(R.id.map); mapFragment.getMapAsync(this); } @Override public void onMapReady(GoogleMap googleMap) { mMap = googleMap; LatLng sydney = new LatLng(-34, 151); //mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney")); mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 16)); mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() { @Override public void onMapClick(LatLng latLng) { if (markerPoints.size() > 1) { markerPoints.clear(); mMap.clear(); } //Adding new item to the ArrayList markerPoints.add(latLng); //Creating MarkerOptions MarkerOptions options = new MarkerOptions(); //Setting the position of the marker options.position(latLng); if (markerPoints.size() == 1) { options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN)); } else if (markerPoints.size() == 2) { options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED)); } //Add new marker to the Google Map Android API V2 mMap.addMarker(options); //Checks, whether start and end locations are captured if (markerPoints.size() >= 2) { LatLng origin = (LatLng) markerPoints.get(0); LatLng dest = (LatLng) markerPoints.get(1); //Getting URL to the Google Directions API String url = getDirectionsUrl(origin, dest); DownloadTask downloadTask = new DownloadTask(); //Start downloading json data from Google Directions API downloadTask.execute(url); } } }); } private class DownloadTask extends AsyncTask { @Override protected String doInBackground(String... url) { String data = ""; try { data = downloadUrl(url[0]); } catch (Exception e) { Log.d("Background Task", e.toString()); } return data; } @Override protected void onPostExecute(String result) { super.onPostExecute(result); ParserTask parserTask = new ParserTask(); parserTask.execute(result); } } private class ParserTask extends AsyncTask<String, Integer, List<List<HashMap>>> { //Parsing the data in non-ui thread @Override protected List<List<HashMap>> doInBackground(String... jsonData) { JSONObject jObject; List<List<HashMap>> routes = null; try { jObject = new JSONObject(jsonData[0]); DirectionsJSONParser parser = new DirectionsJSONParser(); routes = parser.parse(jObject); } catch (Exception e) { e.printStackTrace(); } return routes; } @Override protected void onPostExecute(List<List<HashMap>> result) { ArrayList points = null; PolylineOptions lineOptions = null; MarkerOptions markerOptions = new MarkerOptions(); for (int i = 0; i < result.size(); i++) { points = new ArrayList(); lineOptions = new PolylineOptions(); List<HashMap> path = result.get(i); for (int j = 0; j < path.size(); j++) { HashMap 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); } lineOptions.addAll(points); lineOptions.width(12); lineOptions.color(Color.RED); lineOptions.geodesic(true); } //Drawing polyline in the Google Map for the i-th route mMap.addPolyline(lineOptions); } } 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"; String mode = "mode=driving"; //Building the parameters to the web service String parameters = str_origin + "&" + str_dest + "&" + sensor + "&" + mode; //Output format String output = "json"; //Building the url to the web service String url = "https://maps.googleapis.com/maps/api/directions/" + output + "?" + parameters; return url; } private String downloadUrl(String strUrl) throws IOException { String data = ""; InputStream iStream = null; HttpURLConnection urlConnection = null; try { URL url = new URL(strUrl); urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.connect(); iStream = urlConnection.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(iStream)); StringBuffer sb = new StringBuffer(); String line = ""; while ((line = br.readLine()) != null) { sb.append(line); } data = sb.toString(); br.close(); } catch (Exception e) { Log.d("Exception", e.toString()); } finally { iStream.close(); urlConnection.disconnect(); } return data; } }
我们在Google地图对象上称为" onMapClickListener"。
它用于在点击的位置上设置标记,并将该位置存储在ArrayList中。
ArrayList仅用于存储源标记和目标标记。
" getDirectionsUrl()"称为Directions API URL,其输出和参数如下所示。
" https://maps.googleapis.com/maps/api/directions/" +输出+"?" +参数;
输出变量包含一个" json"字符串,参数字符串创建为:String parameters = str_origin +"&" + str_dest +"&" + sensor +"&" + mode;
我们在当前应用程序中将模式设置为"驾驶"。
其他运输方式是:
- 驾驶(默认)
- 步行
- 单车
- 过境