1. ホーム
  2. android

[解決済み] J2ME/Android/BlackBerry - ドライブガイド、2地点間のルート案内

2023-04-05 04:53:27

質問

Android 1.0 では、com.google.googlenav という名前空間がドライブ ガイド用に用意されていました。

ルート - 改良された Google ドライブ ドライブ指示

しかし、新しいSDKでは、何らかの理由で削除されました。

Androidです。API 1.0以降、DrivingDirectionsが削除されました - 1.5/1.6ではどうすればよいですか? BlackBerryでは、そのようなもののためのAPIが不足しています。

Blackberry で 2 つの場所間のルートを見つけるにはどうすればよいですか。

csie-twが回避策を提供しています(gmapsにkmlファイルを問い合わせ、それをパースする)。

Android - ドライブ方向 (ルート パス)

また アンドレア が作った DrivingDirections ヘルパークラス を Android 用に作成しました。

この機能を実現するためのヘルパーをj2meで書いたので、AndroidとBlackBerryのサンプルを共有したいと思います。

アップデイト

コメントにもあったように、公式には許可されていませんが Google Maps APIs 利用規約 :

<ブロッククオート

Google Maps/Google Earth APIs 利用規約

最終更新日 2009年5月27日

...

10. ライセンスの制限。本規約で明示的に許可されている場合、または Google(または場合によっては特定のコンテンツのプロバイダ)から事前に書面による許可を得ている場合を除き、上記の Google のライセンスは、ユーザーが以下のすべての制限を遵守することを条件としています。第 7 条または Maps API ドキュメントで明示的に許可されている場合を除き、お客様は以下のことを行ってはなりません(また、他の人に行うことを許可してはなりません)。

...

10.9 本サービスまたはコンテンツを、製品、システム、またはアプリケーションと一緒に、またはそれらに関連して使用すること。

(a) リアルタイムのナビゲーションまたはルート案内(ユーザーのセンサー対応デバイスの位置と同期したターンバイターンのルート案内を含むがこれに限定されない)。

で、特定のアプリで無効になっている場合があります(なぜか、少なくともAndroidでは)... より .NET 会話でのジオコード スクレイピング :

これはAPIの利用規約で許可されていません。 ジオコードを生成するために、Googleマップをスクレイピングしてはいけません。 ジオコードを生成するために Google Maps をスクレイピングしてはいけません。 そのようなサービスをブロックします。 弊社サーバーの自動クエリ。

ブレット・テイラー

Google マップ、プロダクト マネージャー

代替案や提案をお待ちしています。

ありがとうございます!

どのように解決するのですか?

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コード

アンドロイド

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コード