[解決済み] J2ME/Android/BlackBerry - ドライブガイド、2地点間のルート案内
質問
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コード
関連
-
[解決済み] Androidのgravityとlayout_gravityの違いは何ですか?
-
[解決済み] Androidアプリケーションのアクティビティ間でデータを受け渡すにはどうすればよいですか?
-
[解決済み] Android Webview - キャッシュを完全に削除する
-
[解決済み] AndroidでラジオボタンにOnClickListenerを設定するには?
-
[解決済み] FloatingActionButtonのサンプルとサポートライブラリ
-
[解決済み] Android Studioの「未実装メソッドの追加」機能
-
[解決済み] onCreate(Bundle savedInstanceState)とは?
-
[解決済み] Android: ランドスケープモード用の代替レイアウト xml
-
[解決済み] Android StudioからADBを手動で再起動する方法
-
[解決済み] APKが署名済みかデバッグビルドかを確認するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] android: imageview の画像を画面に合わせて伸縮させる
-
[解決済み] BottomSheetDialogFragmentの状態をexpandedに設定する。
-
[解決済み] アンドロイドフラグメント onRestoreInstanceState
-
[解決済み] 深くネストされたスタックから離れるとき、Fragmentのバックスタックをクリーンアップする方法はこれで良いのでしょうか?
-
[解決済み] プログラムでソフトキーボードを開く
-
[解決済み] Android - タイトルバーに戻るボタンが表示される
-
[解決済み] FloatingActionButtonのサンプルとサポートライブラリ
-
[解決済み] Gradleでビルドタイプを使用し、ContentProviderを使用する同じアプリを1つのデバイスで実行する。
-
[解決済み] BottomNavigationViewを新しいNavControllerで使用する際に、フラグメントを生かす方法はありますか?
-
[解決済み] Google Play ストア内部テストのロールアウトが開始できない