我想为Android应用程序制作一个自定义路由,我不确定我应该使用哪个API以及它是否与Java兼容。
据我所知,我需要使用航点制作路线(我不需要知道两点之间的距离,只是为了制作路线)。
目标是从地图侧面的菜单中选择一个选项,并显示两个标记之间的自定义路线之一。
答案 0 :(得分:2)
您可以使用Google Maps API v2 for Android和Google Maps Directions webservice API
执行此操作要开始使用Google Maps API,还有很多其他好的答案。 See here获取简单地图活动的完整工作示例。请注意,您还需要设置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;
}
}
在两个标记之间绘制路线的结果: