Android 谷歌地图 - 绘制两点之间的路线

在本教程中,我们将创建一个Android应用程序,在两点之间绘制一条可能的Google地图路线。我们将在应用程序中使用Google Maps Directions API。

Android Google地图-绘制路线

使用this教程中演示的步骤从API控制台创建新的Google Map API密钥。创建一个新的Android Studio项目,选择模板为谷歌地图活动 。将API密钥添加到位于** 调试->资源->值文件夹内的** google_map_api.xml** 文件中,这就是如果您使用的是最新的Android Studio,应用程序应该是什么样子。Android Google地图绘制两个points之间的路线

Android谷歌地图绘制路径项目结构

谷歌地图中两点之间的绘制路径androidDirectionsJSONParser.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** 。其他交通工具包括:

  • 驾驶(默认)
  • 步行
  • 骑自行车
  • 过境

应用程序的输出如下:android google maps draw path本教程到此结束。您可以从下面的链接下载最终项目,添加您自己的Google Map API密钥。

下载安卓谷歌地图绘制路线Project

Published At
Categories with 技术
Tagged with
comments powered by Disqus