J2ME / Android / BlackBerry - маршруты проезда, маршрут между двумя локациями

90

В Android 1.0 было пространство имен com.google.googlenav для
маршрутов движения: Маршрут - Улучшенные маршруты проезда Google
Но в новом SDK оно было по какой-то причине удалено ...
Android: DrivingDirections удалено с API 1.0 - как это сделать в 1.5 / 1.6? На BlackBerry также нет API для таких вещей:
как найти маршрут между двумя местами в Blackberry?

ЭВКп-ТВт дает обходной путь (GMaps запроса для KML файла и разобрать его):
Android - направление движения (Route Path)
Также Андреа сделал DrivingDirections вспомогательных классов для Android.
Я написал небольшой помощник для этой функции в j2me, поэтому я хотел бы поделиться своими примерами на Android и BlackBerry.

ОБНОВЛЕНИЕ
Как было сказано в комментариях, это официально не разрешено Условиями использования API Карт Google :

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

и может быть отключен для определенных приложений (как-то, по крайней мере, на Android) ... Из парсинга Geocode в разговоре .NET :

Это не допускается условиями использования API. Вы не должны очищать Карты Google для создания геокодов. Мы заблокируем службы, которые выполняют автоматические запросы к нашим серверам.

Брет Тейлор,
менеджер по продуктам, Карты Google

Буду признателен за любые альтернативы и / или предложения!
Благодарность!

Максим Гонтарь
источник
2
Я полагаю, что очистка таких маршрутов проезда на Картах Google может нарушить Условия использования Google.
Кристофер Орр,
Я получаю все точки в mRoad, но они не отображаются на MAP .. Путь, отображаемый на MAP, только от Джайпура до Дели!
Вишал Хаххар
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 Directions для Android с использованием данных KML больше не работает?
kendrelaxman 09
1
Вот полная документация: developers.google.com/maps/documentation/directions
Алексей
Вышеупомянутое решение больше не работает с API 2. Мне удалось нарисовать путь между двумя точками с помощью Google map android API v2. Я разместил свое решение по этой ссылке. Ответ: Нарисуйте путь между двумя точками с помощью Google Maps Android API v2
Зишан Мирза,