java – Google Maps API和Markers之间的自定义折线路线
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – Google Maps API和Markers之间的自定义折线路线,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4997字,纯文字阅读大概需要8分钟。
内容图文
我想为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之间的自定义折线路线所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。