在本教程中,我们将创建一个Android应用程序,在两点之间绘制一条可能的Google地图路线。我们将在应用程序中使用Google Maps Directions API。
Android Google地图-绘制路线
使用this教程中演示的步骤从API控制台创建新的Google Map API密钥。创建一个新的Android Studio项目,选择模板为谷歌地图活动 。将API密钥添加到位于** 调试->资源->值文件夹内的** google_map_api.xml
** 文件中,这就是如果您使用的是最新的Android Studio,应用程序应该是什么样子。之间的路线
Android谷歌地图绘制路径项目结构
DirectionsJSONParser.java
文件是解析位置并返回路线的文件。然后调用** decdePoly()
** 方法来获取稍后绘制在地图上的折线数据。
Android Google地图绘制路线代码
下面给出了 MainActivity.java
代码。
1public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {
2
3 private GoogleMap mMap;
4 ArrayList markerPoints= new ArrayList();
5
6 @Override
7 protected void onCreate(Bundle savedInstanceState) {
8 super.onCreate(savedInstanceState);
9 setContentView(R.layout.activity_maps);
10 // Obtain the SupportMapFragment and get notified when the map is ready to be used.
11 SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
12 .findFragmentById(R.id.map);
13 mapFragment.getMapAsync(this);
14 }
15
16 @Override
17 public void onMapReady(GoogleMap googleMap) {
18 mMap = googleMap;
19 LatLng sydney = new LatLng(-34, 151);
20 //mMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney"));
21 mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(sydney, 16));
22
23 mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
24 @Override
25 public void onMapClick(LatLng latLng) {
26
27 if (markerPoints.size() > 1) {
28 markerPoints.clear();
29 mMap.clear();
30 }
31
32 // Adding new item to the ArrayList
33 markerPoints.add(latLng);
34
35 // Creating MarkerOptions
36 MarkerOptions options = new MarkerOptions();
37
38 // Setting the position of the marker
39 options.position(latLng);
40
41 if (markerPoints.size() == 1) {
42 options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_GREEN));
43 } else if (markerPoints.size() == 2) {
44 options.icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_RED));
45 }
46
47 // Add new marker to the Google Map Android API V2
48 mMap.addMarker(options);
49
50 // Checks, whether start and end locations are captured
51 if (markerPoints.size() >= 2) {
52 LatLng origin = (LatLng) markerPoints.get(0);
53 LatLng dest = (LatLng) markerPoints.get(1);
54
55 // Getting URL to the Google Directions API
56 String url = getDirectionsUrl(origin, dest);
57
58 DownloadTask downloadTask = new DownloadTask();
59
60 // Start downloading json data from Google Directions API
61 downloadTask.execute(url);
62 }
63
64 }
65 });
66
67 }
68
69 private class DownloadTask extends AsyncTask {
70
71 @Override
72 protected String doInBackground(String... url) {
73
74 String data = "";
75
76 try {
77 data = downloadUrl(url[0]);
78 } catch (Exception e) {
79 Log.d("Background Task", e.toString());
80 }
81 return data;
82 }
83
84 @Override
85 protected void onPostExecute(String result) {
86 super.onPostExecute(result);
87
88 ParserTask parserTask = new ParserTask();
89
90 parserTask.execute(result);
91
92 }
93 }
94
95 private class ParserTask extends AsyncTask<String, Integer, List<List<HashMap>>> {
96
97 // Parsing the data in non-ui thread
98 @Override
99 protected List<List<HashMap>> doInBackground(String... jsonData) {
100
101 JSONObject jObject;
102 List<List<HashMap>> routes = null;
103
104 try {
105 jObject = new JSONObject(jsonData[0]);
106 DirectionsJSONParser parser = new DirectionsJSONParser();
107
108 routes = parser.parse(jObject);
109 } catch (Exception e) {
110 e.printStackTrace();
111 }
112 return routes;
113 }
114
115 @Override
116 protected void onPostExecute(List<List<HashMap>> result) {
117 ArrayList points = null;
118 PolylineOptions lineOptions = null;
119 MarkerOptions markerOptions = new MarkerOptions();
120
121 for (int i = 0; i < result.size(); i++) {
122 points = new ArrayList();
123 lineOptions = new PolylineOptions();
124
125 List<HashMap> path = result.get(i);
126
127 for (int j = 0; j < path.size(); j++) {
128 HashMap point = path.get(j);
129
130 double lat = Double.parseDouble(point.get("lat"));
131 double lng = Double.parseDouble(point.get("lng"));
132 LatLng position = new LatLng(lat, lng);
133
134 points.add(position);
135 }
136
137 lineOptions.addAll(points);
138 lineOptions.width(12);
139 lineOptions.color(Color.RED);
140 lineOptions.geodesic(true);
141
142 }
143
144// Drawing polyline in the Google Map for the i-th route
145 mMap.addPolyline(lineOptions);
146 }
147 }
148
149 private String getDirectionsUrl(LatLng origin, LatLng dest) {
150
151 // Origin of route
152 String str_origin = "origin=" + origin.latitude + "," + origin.longitude;
153
154 // Destination of route
155 String str_dest = "destination=" + dest.latitude + "," + dest.longitude;
156
157 // Sensor enabled
158 String sensor = "sensor=false";
159 String mode = "mode=driving";
160
161 // Building the parameters to the web service
162 String parameters = str_origin + "&" + str_dest + "&" + sensor + "&" + mode;
163
164 // Output format
165 String output = "json";
166
167 // Building the url to the web service
168 String url = "https://maps.googleapis.com/maps/api/directions/" + output + "?" + parameters;
169
170 return url;
171 }
172
173 private String downloadUrl(String strUrl) throws IOException {
174 String data = "";
175 InputStream iStream = null;
176 HttpURLConnection urlConnection = null;
177 try {
178 URL url = new URL(strUrl);
179
180 urlConnection = (HttpURLConnection) url.openConnection();
181
182 urlConnection.connect();
183
184 iStream = urlConnection.getInputStream();
185
186 BufferedReader br = new BufferedReader(new InputStreamReader(iStream));
187
188 StringBuffer sb = new StringBuffer();
189
190 String line = "";
191 while ((line = br.readLine()) != null) {
192 sb.append(line);
193 }
194
195 data = sb.toString();
196
197 br.close();
198
199 } catch (Exception e) {
200 Log.d("Exception", e.toString());
201 } finally {
202 iStream.close();
203 urlConnection.disconnect();
204 }
205 return data;
206 }
207}
我们在Google地图对象上调用了**onMapClickListener
** 。它用于在点击的位置上设置一个标记,并将该位置存储在ArrayList中。ArrayList仅用于存储源和目标标记。** getDirectionsUrl()
** 称为方向接口URL,输出和参数如下所示。** ``https://maps.googleapis.com/maps/api/directions/`+OUTPUT+`?+PARAMETERS;
** OUTPUT变量保存JSON字符串,参数串创建为:** 字符串参数=STR_ORIGURE+
&+STR_DEST+
&+SENSOR+
&+MODE;
** 我们在当前应用中设置了** MODE=DRIVING** 。其他交通工具包括:
- 驾驶(默认)
- 步行
- 骑自行车
- 过境