J2ME / Android / BlackBerry - вказівки щодо руху, маршрут між двома місцями


90

На Android 1.0 існував простір імен com.google.googlenav для напрямків руху:
Маршрут - вдосконалений Google Driving Directions
Але в новіших SDK він був чомусь видалений ...
Android: DrivingDirections видалено з API 1.0 - як це зробити в 1.5 / 1,6? На BlackBerry також бракує API для таких речей:
як знайти маршрут між двома місцями в Blackberry?

csie-tw дає обхідне рішення (запитайте gmaps для файлу kml та проаналізуйте його):
Android - Напрямок руху (Шлях маршруту).
Також Андреа зробила допоміжні класи DrivingDirections для Android.
Я написав невеликий помічник для цієї функції у j2me, тому хотів би поділитися своїми зразками на Android та BlackBerry.

ОНОВЛЕННЯ
Як зазначалося в коментарях, офіційно не дозволяється Умови використання API Карт Google :

Умови використання API Карт Google / Google Планета Земля
Останнє оновлення: 27 травня 2009 р.
...
10. Обмеження ліцензії. За винятком випадків, прямо передбачених Умовами, або якщо ви не отримали попереднього письмового дозволу від Google (або, відповідно, від постачальника певного Вмісту), вищезазначені ліцензії Google підлягають вашому дотриманню всіх обмежень, наведених нижче. За винятком випадків, прямо передбачених у Розділі 7 або Документації API Maps, ви не повинні (а також не можете дозволяти комусь іншому):
...
10.9 використовувати Службу або Вміст з будь-якими продуктами, системами чи програмами для або у зв'язку з:
(a) навігація в реальному часі або наведення маршруту, включаючи, але не обмежуючись покроковим наведенням маршруту, яке синхронізується з положенням пристрою з підтримкою датчика користувача;

і може бути вимкнено для певних програм (якось, принаймні на Android) ... З вишкрібання геокоду в розмові .NET :

Це не дозволено умовами використання API. Не слід очищати Карти Google для створення геокодів. Ми заблокуємо служби, які виконують автоматизовані запити наших серверів.

Брет Тейлор,
менеджер з продуктів, Google Maps

Будемо вдячні за будь-які альтернативи та / або пропозиції!
Дякую!


2
Я гадаю, що подібне скребування вказівок на Картах Google може порушити Умови використання Google.
Крістофер Орр,

Я отримую всі бали в mRoad, але вони не відображаються на MAP .. Шлях, відображений на MAP, це від Джайпура до Делі!
Vishal Khakhkhar

1
@Vishal: Вибачте, але я не можу з цим допомогти! Будь ласка, опублікуйте окреме запитання!
Максим Гонтар

Відповіді:


115

Провайдер маршрутів карт J2ME

maps.google.com має навігаційну службу, яка може надати вам інформацію про маршрут у форматі KML .

Щоб отримати файл kml, нам потрібно сформувати url із початковим та кінцевим розташуванням:

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();
}

Далі вам потрібно буде проаналізувати xml (реалізований за допомогою SAXParser) та заповнити структури даних:

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[] {};
}

Мережеве підключення реалізовано різними способами на Android та Blackberry, тому вам доведеться спочатку сформувати url:

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

потім створіть зв’язок з цією URL-адресою та отримайте InputStream.
Потім передайте цей InputStream і отримайте проаналізовану структуру даних:

 public static Road getRoute(InputStream is) 

Повний вихідний код 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;
    }
}

Дивіться повний код на J2MEMapRouteBlackBerryEx на Google Code

Android

Знімок екрана 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;
    }
}

Дивіться повний код на J2MEMapRouteAndroidEx на Google Code



8
Цей код більше не працюватиме, оскільки Google зупинився, щоб дати відповідь у форматі KML. Ось посилання на рішення у відповіді на запитання щодо переповнення стека. Чому отримання вказівок Google для Android за допомогою даних KML більше не працює?
kendrelaxman

1
Ось повна документація: developers.google.com/maps/documentation/directions
Олексій

Вищевказане рішення більше не працює з API 2. Мені вдалося намалювати шлях між двома точками за допомогою Google map android API v2. Я розмістив його рішення за цим посиланням. Відповідь: Накресліть шлях між двома точками за допомогою Google Maps Android API v2
Zeeshan Mirza
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.