我想两地之间的路径显示,我想使用谷歌Places API的V3两点之间的路径步骤。
我用的是之前旧的谷歌地图API ,并按照要求提供了完美的结果:
http://maps.google.com/maps?f=d&hl=en&saddr=19.5217608,-99.2615823&daddr=19.531224,-99.248262&ie=UTF8&0&om=0&output=kml
输出:
现在,我尝试用新的谷歌地图API来代替这一点,下面的请求给出错误的结果,在这两种情况下,我使用相同的源和目的,但结果让谷歌地图上不同的行为:
http://maps.googleapis.com/maps/api/directions/json?origin=19.5217608,-99.2615823&destination=19.531224,-99.248262&sensor=false
我的问题是,新的谷歌地图API返回更少的源和目的地之间的步数,因此不会显示在谷歌地图完美的路线。
请帮助解决这个问题,新谷歌地图API第3版。
提前致谢。
什么在谷歌地图API第3版的新功能?
Google Maps Directions API v3
为Android提供的路线Encoded Polyline Algorithm Format
。
我们必须要做的?
We must have to decode this Polyline for showing exact Map
我们如何解码由谷歌地图API V3提供了这个编码折线?
请参考这三个环节,以更加清晰与编码折线返回Google Maps Directions API v3
- 从谷歌解码折线方向API映射用java
- 编码折线谷歌地图
- 对于水平串编码算法
我们怎样才能解决上述问题的问题吗?
请参考这三个答案的链接,可以解决你的问题:
- Android的-两个geopoints之间绘制路线图
- https://stackoverflow.com/a/10268114/1472665
- https://stackoverflow.com/a/11357351/1494309
我已经采取了你的请求的URL,并在我的应用程序,它使用的是新版粘贴它,它的伟大工程。 该问题可能是你如何分析数据,或解码接收到的JSON字符串。
String url = "http://maps.googleapis.com/maps/api/directions/json?origin=19.5217608,-99.2615823&destination=19.531224,-99.248262&sensor=false";
HttpPost httppost = new HttpPost(url);
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
InputStream is = null;
is = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(is, "iso-8859-1"), 8);
StringBuilder sb = new StringBuilder();
sb.append(reader.readLine() + "\n");
String line = "0";
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
reader.close();
String result = sb.toString();
JSONObject jsonObject = new JSONObject(result);
JSONArray routeArray = jsonObject.getJSONArray("routes");
JSONObject routes = routeArray.getJSONObject(0);
JSONObject overviewPolylines = routes.getJSONObject("overview_polyline");
String encodedString = overviewPolylines.getString("points");
List<GeoPoint> pointToDraw = decodePoly(encodedString);
//Added line:
mapView.getOverlays().add(new RoutePathOverlay(pointToDraw));
和decodePoly()
方法是从这里SO另外一个问题,我不记得笔者采取:
private List<GeoPoint> decodePoly(String encoded) {
List<GeoPoint> poly = new ArrayList<GeoPoint>();
int index = 0, len = encoded.length();
int lat = 0, lng = 0;
while (index < len) {
int b, shift = 0, result = 0;
do {
b = encoded.charAt(index++) - 63;
result |= (b & 0x1f) << shift;
shift += 5;
} while (b >= 0x20);
int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
lat += dlat;
shift = 0;
result = 0;
do {
b = encoded.charAt(index++) - 63;
result |= (b & 0x1f) << shift;
shift += 5;
} while (b >= 0x20);
int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
lng += dlng;
GeoPoint p = new GeoPoint((int) (((double) lat / 1E5) * 1E6), (int) (((double) lng / 1E5) * 1E6));
poly.add(p);
}
return poly;
}
我包括我在为了增加覆盖到地图本身,以及曾经使用过,我找不到它取自教程..抱歉没有给予信贷。 (在我张贴的第一方法添加的调用此)
public class RoutePathOverlay extends Overlay {
private int _pathColor;
private final List<GeoPoint> _points;
private boolean _drawStartEnd;
public RoutePathOverlay(List<GeoPoint> points) {
this(points, Color.RED, true);
}
public RoutePathOverlay(List<GeoPoint> points, int pathColor, boolean drawStartEnd) {
_points = points;
_pathColor = pathColor;
_drawStartEnd = drawStartEnd;
}
private void drawOval(Canvas canvas, Paint paint, Point point) {
Paint ovalPaint = new Paint(paint);
ovalPaint.setStyle(Paint.Style.FILL_AND_STROKE);
ovalPaint.setStrokeWidth(2);
int _radius = 6;
RectF oval = new RectF(point.x - _radius, point.y - _radius, point.x + _radius, point.y + _radius);
canvas.drawOval(oval, ovalPaint);
}
public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) {
Projection projection = mapView.getProjection();
if (shadow == false && _points != null) {
Point startPoint = null, endPoint = null;
Path path = new Path();
//We are creating the path
for (int i = 0; i < _points.size(); i++) {
GeoPoint gPointA = _points.get(i);
Point pointA = new Point();
projection.toPixels(gPointA, pointA);
if (i == 0) { //This is the start point
startPoint = pointA;
path.moveTo(pointA.x, pointA.y);
} else {
if (i == _points.size() - 1)//This is the end point
endPoint = pointA;
path.lineTo(pointA.x, pointA.y);
}
}
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(_pathColor);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(5);
paint.setAlpha(90);
if (getDrawStartEnd()) {
if (startPoint != null) {
drawOval(canvas, paint, startPoint);
}
if (endPoint != null) {
drawOval(canvas, paint, endPoint);
}
}
if (!path.isEmpty())
canvas.drawPath(path, paint);
}
return super.draw(canvas, mapView, shadow, when);
}
public boolean getDrawStartEnd() {
return _drawStartEnd;
}
public void setDrawStartEnd(boolean markStartEnd) {
_drawStartEnd = markStartEnd;
}
}
希望这对你的作品。
您没有使用结果中返回的所有问题。 您没有提供您的代码,但在这里是第3版API的例子 ,显示为您的“谷歌地图”的例子返回相同的路径。
请检查此链接..
并指定出行方式
-- driving
-- walking
-- bicycling
-- transit
所以你得到不同的结果。
请尝试。
至于被GeoPoint的未解决的,我刚换的GeoPoint的所有occurances以经纬度和一切工作。
发表上述解决方案https://stackoverflow.com/users/975959/la-bla-bla的作品非常好与谷歌地图API V2,但它需要一些小的修改:
GeoPoint对象的所有事件与经纬度更换。
将行:
GeoPoint p = new GeoPoint((int) (((double) lat / 1E5) * 1E6), (int) (((double) lng / 1E5) * 1E6));
正好位于该方法decodePoly结束前,这条线:
LatLng p = new LatLng(lat / 1E5, lng / 1E5);
希望这适用于谷歌地图API V2的用户。
我曾经给出“香格里拉喇嘛喇嘛”的解决方案,但我做了一些小的修改。 我有显示路径的问题时,我有太多的分,当你放大太多,不再被显示的路线,你会得到在logcat的这条消息“形路径过大而被渲染到纹理”。
我所做的就是细分通过以下方式的路径:
if (shadow == false && _points != null) {
Path path = new Path();;
//We are creating the path
Point pointA = new Point();
for (int i = 0; i < _points.size(); i++) {
mapView.getProjection().toPixels(_points.get(i), pointA);
if (i == 0) path.moveTo(pointA.x, pointA.y);
else path.lineTo(pointA.x, pointA.y);
if(i%10==0 || i == _points.size()-1){
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setColor(_pathColor);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setStrokeCap(Paint.Cap.ROUND);
paint.setStrokeWidth(mapView.getZoomLevel()-10);
paint.setAlpha(200);
if (!path.isEmpty()) canvas.drawPath(path, paint);
path = new Path();
path.moveTo(pointA.x, pointA.y);
}
}
}
我尽10分的路径,也可以是低效率的,但这样一来就可以显示路径时的变焦时的高值。
@ Ghareeb-Strange-但是为什么我们需要与API第2? 我的意思是,我们有折线,使得它更加的方式更容易。
private void drawPath(){
PolylineOptions options = new PolylineOptions();
options.width(4);
options.color(Color.RED);
for(int i = 0; i< pathList.size(); i++ ){
options.add(pathList.get(i));
}
map.addPolyline(options);
}
随着像你上面贴的代码将有路径在您的应用程序完美drawed。
pathlist是包含我们的道路的所有点的列表。
干杯!
这似乎有足够的答案,但对于这个问题上,我受益此链接 。 但是,当我下载并导入没有工作。 所以,我实现了我自己的应用程序。 并且在该代码错误。 当你想第二次计算路线,应用程序。 休息。
if (mMarkerPoints.size() > 1) {
mMarkerPoints.clear();
map.clear();
// LatLng startPoint = new LatLng(nearbyLatitude,
// nearbyLongitude);
// drawMarker(startPoint);
}
查找线路和提出意见,因为我已经做了。 不管怎么说,其实你的要求画的路线不完整的代码,这样你就可以在该网址校验码。 这是擅长对点(标记)之间绘制路线。 祝你有美好的一天。