Android : API 1.0 이후 운전 방향이 제거되었습니다 - 1.5/1.6에서 어떻게해야합니까?
-
06-07-2019 - |
문제
그것은 것 같습니다 DrivingDirections
Android API 1.0 이후로 제거되었습니다
Android 1.6의 두 지점 (현재 위치 일 수도 있지만 현재 위치 일 수도 있지만 다른 위치 일 수도 있음)이있는지도를 표시하는 방법은 무엇입니까?
해결책
나는 그 대답이 Telenav 또는 누군가의 수백만 달러 규모의 라이센스에 가입하는 것이라고 생각합니다.
Google은 Telenav 또는 기타 회사 에서이 데이터를 라이센스하기 때문에 API가 당겨진 이유는 Google 자체가 운전 방향 (예 : 실시간 전환 할 수 없음)과 관련하여 할 수있는 일에 제한이 있기 때문입니다. Google은 차례로 개발자가 제한된 일을 할 수 없으며이 경우 열린 API를 적절하게 보호 할 수 없습니다.
나는 Open Street Map에 Dried Directions, fwiw가 있다는 언급을 보았다고 생각했다.
다른 팁
라인과 연결된 포인트가 필요한 경우 전체 KML이 필요하지 않습니다. 훨씬 빠른 방법은 output = dragdir로 Google지도 API에서 반환 된 JSON을 사용하는 것입니다.
private String getUrl(String start, String end) {
//If params GeoPoint convert to lat,long string here
StringBuffer urlString = new StringBuffer();
urlString.append("http://maps.google.com/maps?f=d&hl=en");
urlString.append("&saddr=");// from
urlString.append(start);
urlString.append("&daddr=");// to
urlString.append(end);
urlString.append("&ie=UTF8&0&om=0&output=dragdir"); //DRAGDIR RETURNS JSON
Log.i("URLString", urlString.toString());
return urlString.toString();
}
이 urlstring은 JSON 파일을 얻는 데 사용될 수 있으며 String 's Split ()를 사용하여 정보를 쉽게 추출 할 수 있습니다.
private String getConnection(String url) {
URL inUrl = new URL(url);
URLConnection yc = inUrl.openConnection();
BufferedReader in = new BufferedReader( new InputStreamReader(yc.getInputStream()));
String inputLine;
String encoded = "";
while ((inputLine = in.readLine()) != null)
encoded = encoded.concat(inputLine);
in.close();
String polyline = encoded.split("points:")[1].split(",")[0];
polyline = polyline.replace("\"", "");
polyline = polyline.replace("\\\\", "\\");
return polyline;
}
반환 된 문자열은 아래 방법을 사용하여 지오 포인트 목록으로 디코딩 할 수있는 폴리 라인입니다.
private static ArrayList<GeoPoint> decodePolyline(String encoded) {
ArrayList<GeoPoint> geopoints = 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));
geopoints.add(p);
}
return geopoints;
}
마지막 단계는 이러한 점을 MapView에 그려 놓는 것입니다. 왜냐하면 우리는 지오 포인트의 배열 목록을 처리 할 오버레이 항목이 필요하기 때문입니다.
public class PathOverlay extends Overlay {
private ArrayList<GeoPoint> pointList;
public PathOverlay(ArrayList<GeoPoint> pointList) {
this.pointList = pointList;
}
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
Point current = new Point();
Path path = new Path();
Projection projection = mapView.getProjection();
Iterator<GeoPoint> iterator = pointList.iterator();
if (iterator.hasNext()) {
projection.toPixels(iterator.next(), current);
path.moveTo((float) current.x, (float) current.y);
} else return;
while(iterator.hasNext()) {
projection.toPixels(iterator.next(), current);
path.lineTo((float) current.x, (float) current.y);
}
Paint pathPaint = new Paint();
pathPaint.setAntiAlias(true);
pathPaint.setStrokeWidth(3.0f);
pathPaint.setColor(Color.GREEN);
pathPaint.setStyle(Style.STROKE);
canvas.drawPath(path, pathPaint);
}
}
MapView에 오버레이를 가져 오는 방법이나 라우터 클래스를 설정하는 방법과 같은 중간 단계에 대해 확실하지 않은 경우 알려 주시면 전체 코드를 보낼 수 있습니다.
어쩌면 너무 늦었지만 여전히 다른 사람들에게 도움이됩니다. Android 용 Mapview에서 드라이빙 방향을 가져오고 표시하기 위해 몇 가지 간단한 수업을 작성했습니다.
http://home.ameliemedia.com/android-app-aroundme/#tips
도움이되기를 바랍니다!
안드레아.
Google의 현재 솔루션은 사용하는 것입니다 Google은 API 웹 서비스를지도합니다. 제한된 사용을위한 무료; (성공적인) 상업용 사용 비용을 지불해야합니다.