J2ME/Android/BlackBerry - направления движения, направьте между двумя местами

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

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

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

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

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

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

Bret Taylor
Менеджер по продукции, Google Maps

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

90
задан Community 23 May 2017 в 12:34
поделиться

1 ответ

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

.
116
ответ дан 24 November 2019 в 07:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: