J2ME / Android /黑莓 – 行车路线,两地之间的路线
在Android 1.0上,有一个com.google.googlenav命名空间用于驾车路线:
路线 – 改进Google的行车路线
但在较新的SDK中,由于某种原因被删除了…
Android:DrivingDirections从API 1.0中删除 – 如何在1.5 / 1.6中做到这一点? 在黑莓手机上,也有缺乏这种东西的API:
如何find黑莓两地之间的路线?
csie-tw给出了一个解决方法(查询gmaps for kml文件并parsing它):
Android – 行车路线(路线path)
Andrea还为Android做了DrivingDirections辅助类 。
我在j2me中为这个function写了一个小助手,所以我想在Android和BlackBerry上分享我的示例。
UPDATE
正如评论中所述,这是不正式允许谷歌地图API服务条款 :
Google地图/ Google地球API服务条款
最后更新:2009年5月27日
…
10.许可限制。 除非本条款明确允许,否则,除非您事先获得了Google(或适用的特定内容提供商)的书面授权,否则Google以上的许可将遵守以下所有限制。 除第7条或Maps APIs文档中明确许可外,您不得(也不得允许其他人):
…
10.9将服务或内容用于以下任何产品,系统或应用程序:
(a)实时导航或路线引导,包括但不限于与用户的启用传感器的设备的位置同步的逐转路线引导;
并可能被禁用某些应用程序(不知何故,至less在Android)…从Geocode刮在.NET对话 :
这是API使用条款所不允许的。 您不应该刮Google地图来生成地理编码。 我们将阻止执行服务器自动查询的服务。
布雷特·泰勒
Google地图产品经理
将感谢任何替代scheme和/或build议!
谢谢!
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(); }
接下来,您将需要parsingxml(使用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[] {}; }
networking连接在Android和黑莓上以不同的方式实现,所以你必须先形成url:
public static String getUrl(double fromLat, double fromLon, double toLat, double toLon)
然后创build与此url的连接,并获得InputStream。
然后传递这个InputStream并获得parsing的数据结构:
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; } }
在Google代码上查看J2MEMapRouteBlackBerryEx上的完整代码
Android的
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; } }
在Google Code上查看J2MEMapRouteAndroidEx的完整代码