J2ME / Android / BlackBerry - маршруты проезда, маршрут между двумя точками - PullRequest
90 голосов
/ 08 января 2010

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

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

UPDATE
Как отмечалось в комментариях, официально не разрешено Условия использования API Карт Google :

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

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

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

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

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

1 Ответ

116 голосов
/ 08 января 2010

J2ME Map Route Provider

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 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 Code

...