我想为Android应用程序制作一个自定义路由,我不确定我应该使用哪个API以及它是否与Java兼容.
据我所知,我需要使用航点来制作路线(我不需要知道两点之间的距离,只是为了制作路线).
目标是从地图侧面的菜单中选择一个选项,并显示两个标记之间的自定义路线之一.
解决方法:
您可以使用Google Maps API v2 for Android和Google Maps Directions webservice API执行此 *** 作
要开始使用Google Maps API,还有很多其他好的答案. See here是一个简单的Map Activity的完整工作示例.请注意,您还需要设置API密钥以使用您的项目.
至于使用Google Maps Directions网络服务API,您应该首先阅读文档.您可以使用API密钥并在开发人员控制台中启用API,但它仍然可以在不使用API密钥的情况下运行.
以下是使用Google Maps API在两点之间绘制折线所需的基本代码,请注意,从API返回的点是以需要解码的基本64位编码字符串编码的.
首先,确保您的项目包含Google Maps Utility库,该库将用于解码base64编码的折线:
dependencIEs { compile 'com.Google.maps.androID:androID-maps-utils:0.5+' //.......}
这是AsyncTask,你应该在调用它时给两个LatLng点.
您可以使用两个LatLng对象调用AsyncTask,例如在两个标记之间:
new GetDirectionsAsync().execute(markerOne.getposition(), markerTwo.getposition());
这是AsyncTask代码:
class GetDirectionsAsync extends AsyncTask<LatLng, VoID, List<LatLng>> { JsONParser JsonParser; String DIRECTIONS_URL = "https://maps.GoogleAPIs.com/maps/API/directions/Json"; @OverrIDe protected voID onPreExecute() { super.onPreExecute(); } @OverrIDe protected List<LatLng> doInBackground(LatLng... params) { LatLng start = params[0]; LatLng end = params[1]; HashMap<String, String> points = new HashMap<>(); points.put("origin", start.latitude + "," + start.longitude); points.put("destination", end.latitude + "," + end.longitude); JsonParser = new JsONParser(); JsONObject obj = JsonParser.makehttpRequest(DIRECTIONS_URL, "GET", points, true); if (obj == null) return null; try { List<LatLng> List = null; JsONArray routeArray = obj.getJsONArray("routes"); JsONObject routes = routeArray.getJsONObject(0); JsONObject overvIEwpolylines = routes.getJsONObject("overvIEw_polyline"); String encodedString = overvIEwpolylines.getString("points"); List = polyUtil.decode(encodedString); return List; } catch (JsONException e) { e.printstacktrace(); } return null; } @OverrIDe protected voID onPostExecute(List<LatLng> pointsList) { if (pointsList == null) return; if (line != null){ line.remove(); } polylineoptions options = new polylineoptions().wIDth(5).color(color.magenta).geodesic(true); for (int i = 0; i < pointsList.size(); i++) { LatLng point = pointsList.get(i); options.add(point); } line = mMap.addpolyline(options); }}
AsyncTask引用Activity的一些成员变量,即polyline和GoogleMap,Activity定义如下所示:
public class MapsActivity extends AppCompatActivity implements OnMapReadyCallback{ GoogleMap mMap; polyline line; //.....
这是本例中使用的JsONParser类,请注意这是为androID-23更新的修改版本,我wrote a blog post about:
public class JsONParser { String charset = "UTF-8"; httpURLConnection conn; DataOutputStream wr; StringBuilder result; URL urlObj; JsONObject jObj = null; StringBuilder sbParams; String paramsstring; public JsONObject makehttpRequest(String url, String method, HashMap<String, String> params, boolean encode) { sbParams = new StringBuilder(); int i = 0; for (String key : params.keySet()) { try { if (i != 0){ sbParams.append("&"); } if (encode) { sbParams.append(key).append("=") .append(URLEncoder.encode(params.get(key), charset)); } else{ sbParams.append(key).append("=") .append(params.get(key)); } } catch (UnsupportedEnCodingException e) { e.printstacktrace(); } i++; } if (method.equals("POST")) { // request method is POST try { urlObj = new URL(url); conn = (httpURLConnection) urlObj.openConnection(); conn.setDoOutput(true); conn.setRequestMethod("POST"); conn.setRequestProperty("Accept-Charset", charset); conn.setReadTimeout(10000); conn.setConnectTimeout(15000); conn.connect(); paramsstring = sbParams.toString(); wr = new DataOutputStream(conn.getoutputStream()); wr.writeBytes(paramsstring); wr.flush(); wr.close(); } catch (IOException e) { e.printstacktrace(); } } else if(method.equals("GET")){ // request method is GET if (sbParams.length() != 0) { url += "?" + sbParams.toString(); } Log.d("JsONParser", "full GET url: " + url); try { urlObj = new URL(url); conn = (httpURLConnection) urlObj.openConnection(); conn.setDoOutput(false); conn.setRequestMethod("GET"); conn.setRequestProperty("Accept-Charset", charset); conn.setConnectTimeout(15000); conn.connect(); } catch (IOException e) { e.printstacktrace(); } } try { //Receive the response from the server inputStream in = new BufferedinputStream(conn.getinputStream()); BufferedReader reader = new BufferedReader(new inputStreamReader(in)); String line; result = new StringBuilder(); while ((line = reader.readline()) != null) { result.append(line); } Log.d("JsON Parser", "result: " + result.toString()); } catch (IOException e) { e.printstacktrace(); } conn.disconnect(); // try parse the string to a JsON object try { jObj = new JsONObject(result.toString()); } catch (JsONException e) { Log.e("JsON Parser", "Error parsing data " + e.toString()); } // return JsON Object return jObj; }}
在两个标记之间绘制路线的结果:
总结以上是内存溢出为你收集整理的java – Google Maps API和Markers之间的自定义折线路线全部内容,希望文章能够帮你解决java – Google Maps API和Markers之间的自定义折线路线所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)