J2ME / Android / BlackBerry - chỉ đường lái xe, tuyến đường giữa hai địa điểm


90

Trên Android 1.0 có một không gian tên com.google.googlenav cho chỉ đường lái xe:
Tuyến đường - Chỉ đường lái xe của Google được cải thiện
Nhưng trong SDK mới hơn, nó đã bị xóa bởi một số lý do ...
Android: DrivingDirections bị xóa kể từ API 1.0 - cách thực hiện trong 1.5 / 1,6? Trên BlackBerry cũng thiếu các API cho những thứ như vậy:
làm thế nào để tìm đường đi giữa hai địa điểm trong Blackberry?

csie-tw đưa ra một cách giải quyết (truy vấn gmaps cho tệp kml và phân tích cú pháp nó):
Android - Chỉ đường lái xe (Đường dẫn tuyến đường)
Ngoài ra Andrea đã tạo một lớp trợ giúp DrivingDirections cho Android.
Tôi đã viết một trình trợ giúp nhỏ cho chức năng này, trong j2me, vì vậy tôi muốn chia sẻ các mẫu của mình trên Android và BlackBerry.

CẬP NHẬT
Như đã nêu trong nhận xét, điều khoản dịch vụ của API Google Maps không được phép chính thức :

Điều khoản dịch vụ của Google Maps / API Google Earth
Cập nhật lần cuối: ngày 27 tháng 5 năm 2009
...
10. Giới hạn Giấy phép. Trừ khi được cho phép rõ ràng theo Điều khoản, hoặc trừ khi bạn đã nhận được ủy quyền trước bằng văn bản từ Google (hoặc, nếu có, từ nhà cung cấp Nội dung cụ thể), các giấy phép của Google ở ​​trên tùy thuộc vào việc bạn tuân thủ tất cả các hạn chế bên dưới. Trừ khi được cho phép một cách rõ ràng trong Phần 7 hoặc Tài liệu API của Maps, bạn không được (cũng như không được phép cho phép bất kỳ ai khác):
...
10.9 sử dụng Dịch vụ hoặc Nội dung với bất kỳ sản phẩm, hệ thống hoặc ứng dụng nào cho hoặc liên quan đến:
(a) điều hướng theo thời gian thực hoặc hướng dẫn lộ trình, bao gồm nhưng không giới hạn ở hướng dẫn tuyến đường theo từng ngã rẽ được đồng bộ hóa với vị trí của thiết bị hỗ trợ cảm biến của người dùng;

và có thể bị tắt đối với một số ứng dụng nhất định (bằng cách nào đó, ít nhất là trên Android) ... Từ quét Mã địa lý trong cuộc trò chuyện .NET :

Điều này không được cho phép bởi các điều khoản sử dụng API. Bạn không nên sử dụng Google Maps để tạo mã địa lý. Chúng tôi sẽ chặn các dịch vụ thực hiện các truy vấn tự động đối với máy chủ của chúng tôi.


Giám đốc sản phẩm Bret Taylor , Google Maps

Sẽ biết ơn vì bất kỳ lựa chọn thay thế và / hoặc đề xuất nào!
Cảm ơn!


2
Tôi tưởng tượng rằng việc tìm kiếm chỉ đường lái xe của Google Maps như thế này có thể vi phạm Điều khoản Sử dụng của Google.
Christopher Orr

Tôi nhận được tất cả các điểm trong mRoad nhưng chúng không được ánh xạ trên MAP .. Con đường được hiển thị trên MAP nó chỉ từ Jaipur đến Delhi!
Vishal Khakhkhar

1
@Vishal: Xin lỗi, nhưng tôi không thể giúp gì được! Vui lòng gửi câu hỏi riêng!
Maksym Gontar

Câu trả lời:


115

Trình cung cấp tuyến đường bản đồ J2ME

maps.google.com có ​​một dịch vụ điều hướng có thể cung cấp cho bạn thông tin tuyến đường ở định dạng KML .

Để có được tệp kml, chúng ta cần tạo url với vị trí xuất phát và đích:

public static String getUrl(double fromLat, double fromLon,
                            double toLat, double toLon) {// connect to map web service
    StringBuffer urlString = new StringBuffer();
    urlString.append("http://maps.google.com/maps?f=d&hl=en");
    urlString.append("&saddr=");// from
    urlString.append(Double.toString(fromLat));
    urlString.append(",");
    urlString.append(Double.toString(fromLon));
    urlString.append("&daddr=");// to
    urlString.append(Double.toString(toLat));
    urlString.append(",");
    urlString.append(Double.toString(toLon));
    urlString.append("&ie=UTF8&0&om=0&output=kml");
    return urlString.toString();
}

Tiếp theo, bạn sẽ cần phân tích cú pháp xml (được triển khai với SAXParser) và điền vào các cấu trúc dữ liệu:

public class Point {
    String mName;
    String mDescription;
    String mIconUrl;
    double mLatitude;
    double mLongitude;
}

public class Road {
    public String mName;
    public String mDescription;
    public int mColor;
    public int mWidth;
    public double[][] mRoute = new double[][] {};
    public Point[] mPoints = new Point[] {};
}

Kết nối mạng được thực hiện theo các cách khác nhau trên Android và Blackberry, vì vậy trước tiên bạn sẽ phải tạo url:

 public static String getUrl(double fromLat, double fromLon,
     double toLat, double toLon)

sau đó tạo kết nối với url này và nhận InputStream.
Sau đó, chuyển InputStream này và nhận cấu trúc dữ liệu được phân tích cú pháp:

 public static Road getRoute(InputStream is) 

Mã nguồn đầy đủ RoadProvider.java

BlackBerry

class MapPathScreen extends MainScreen {
    MapControl map;
    Road mRoad = new Road();
    public MapPathScreen() {
        double fromLat = 49.85, fromLon = 24.016667;
        double toLat = 50.45, toLon = 30.523333;
        String url = RoadProvider.getUrl(fromLat, fromLon, toLat, toLon);
        InputStream is = getConnection(url);
        mRoad = RoadProvider.getRoute(is);
        map = new MapControl();
        add(new LabelField(mRoad.mName));
        add(new LabelField(mRoad.mDescription));
        add(map);
    }
    protected void onUiEngineAttached(boolean attached) {
        super.onUiEngineAttached(attached);
        if (attached) {
            map.drawPath(mRoad);
        }
    }
    private InputStream getConnection(String url) {
        HttpConnection urlConnection = null;
        InputStream is = null;
        try {
            urlConnection = (HttpConnection) Connector.open(url);
            urlConnection.setRequestMethod("GET");
            is = urlConnection.openInputStream();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return is;
    }
}

Xem mã đầy đủ trên J2MEMapRouteBlackBerryEx trên Google Code

Android

Ảnh chụp màn hình Android G1

public class MapRouteActivity extends MapActivity {
    LinearLayout linearLayout;
    MapView mapView;
    private Road mRoad;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        mapView = (MapView) findViewById(R.id.mapview);
        mapView.setBuiltInZoomControls(true);
        new Thread() {
            @Override
            public void run() {
                double fromLat = 49.85, fromLon = 24.016667;
                double toLat = 50.45, toLon = 30.523333;
                String url = RoadProvider
                        .getUrl(fromLat, fromLon, toLat, toLon);
                InputStream is = getConnection(url);
                mRoad = RoadProvider.getRoute(is);
                mHandler.sendEmptyMessage(0);
            }
        }.start();
    }

    Handler mHandler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            TextView textView = (TextView) findViewById(R.id.description);
            textView.setText(mRoad.mName + " " + mRoad.mDescription);
            MapOverlay mapOverlay = new MapOverlay(mRoad, mapView);
            List<Overlay> listOfOverlays = mapView.getOverlays();
            listOfOverlays.clear();
            listOfOverlays.add(mapOverlay);
            mapView.invalidate();
        };
    };

    private InputStream getConnection(String url) {
        InputStream is = null;
        try {
            URLConnection conn = new URL(url).openConnection();
            is = conn.getInputStream();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return is;
    }
    @Override
    protected boolean isRouteDisplayed() {
        return false;
    }
}

Xem mã đầy đủ trên J2MEMapRouteAndroidEx trên Google Code



8
Mã này sẽ không hoạt động nữa vì google đã ngừng cung cấp phản hồi ở định dạng KML. Đây là liên kết cho giải pháp trong câu trả lời cho câu hỏi Stack Overflow Tại sao truy xuất Google Directions dành cho Android bằng dữ liệu KML không hoạt động nữa?
kendrelaxman

1
Đây là tài liệu đầy đủ: developers.google.com/maps/documentation/directions
Alexey

Giải pháp trên không còn hoạt động với API 2. Tôi đã quản lý để vẽ đường dẫn giữa hai điểm bằng cách sử dụng Google map android API v2. Tôi đã đăng giải pháp của nó tại liên kết đó. Trả lời: Vẽ con đường giữa hai điểm sử dụng Google Maps dành cho Android API v2
Zeeshan Mirza
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.