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

StackOverflow https://stackoverflow.com/questions/2023669

Вопрос

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

csie-tw предлагает обходной путь (запросить gmaps для файла kml и проанализировать его):
Android – направление движения (маршрут)
Также Андреа сделал Вспомогательные классы DrivingDirections для Андроид.
Я написал небольшой помощник для этой функциональности в j2me, поэтому хотел бы поделиться своими примерами на Android и BlackBerry.

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

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

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

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

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

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

Это было полезно?

Решение

Поставщик маршрутов карты J2ME

На сайте maps.google.com есть навигационная служба, которая может предоставить вам информацию о маршруте в КМЛ формат.

Чтобы получить файл 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.
Затем передайте этот входной поток и получите проанализированную структуру данных:

 public static Road getRoute(InputStream is) 

Полный исходный код RoadProvider.java

Ежевика

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

Полный код смотрите на J2MEКартаМаршрутBlackBerryEx в Google Коде

Андроид

Android G1 screenshot

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 Коде

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top