J2ME/Android/BlackBerry - 行车路线,两个地点之间的路线

Mak*_*tar 90 android blackberry geolocation java-me driving-directions

在Android 1.0上有一个com.google.googlenav命名空间用于行车路线:
路线 - 改进了Google行车路线
但是在较新的SDK中,它被某些原因删除了......
Android:自API 1.0以来删除了DrivingDirections - 如何在1.5 /中执行1.6? 在黑莓手机上也缺少这样的API:
如何找到Blackberry中两个地方之间的路线?

CSIE-TW给出了一个解决方法(对于KML文件查询gmaps并解析它):
Android的-驾驶方向(路由路径)
安德烈取得了DrivingDirections辅助类为Android.
我在j2me中为这个功能写了一个小助手,所以我想在Android和BlackBerry上分享我的样本.

更新
正如评论中所述,Google Maps API服务条款并未正式允许:

Google地图/ Google地球API服务条款
上次更新时间:2009年5月27日
...
10.许可限制.除非条款明确允许,或者除非您事先获得Google(或适用的特定内容提供商)的书面授权,否则Google的上述许可均受您遵守以下所有限制的约束.除非第7节或Maps API文档中明确允许,否则您不得(也不允许任何其他人):
...
10.9将服务或内容与任何产品,系统或应用程序一起使用或与之相关:
(a)实时导航或路线引导,包括但不限于与用户的传感器使能设备的位置同步的逐向路线引导;

并且可能对某些应用程序禁用(不知何故,至少在Android上)...来自.NET会话中的Geocode抓取:

API使用条款不允许这样做.您不应该刮掉谷歌地图来生成地理编码.我们将阻止对我们的服务器进行自动查询的服务.

Bret Taylor
Google地图产品经理

将不胜感激任何替代和/或建议!
谢谢!

Mak*_*tar 116

J2ME Map Route Provider

maps.google.com有一个导航服务,可以为您提供KML格式的路线信息.

要获取kml文件,我们需要形成包含起始位置和目标位置的网址:

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();
}
Run Code Online (Sandbox Code Playgroud)

接下来,您将需要解析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[] {};
}
Run Code Online (Sandbox Code Playgroud)

网络连接在Android和Blackberry上以不同方式实现,因此您必须首先形成网址:

 public static String getUrl(double fromLat, double fromLon,
     double toLat, double toLon)
Run Code Online (Sandbox Code Playgroud)

然后使用此url创建连接并获取InputStream.
然后传递此InputStream并获取解析的数据结构:

 public static Road getRoute(InputStream is) 
Run Code Online (Sandbox Code Playgroud)

完整源代码RoadProvider.java

黑莓

死链接 - 黑莓Storm截图

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在Google Code 上查看有关J2MEMapRouteBlackBerryEx的完整代码

Android的

Android G1截图

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;
    }
}
Run Code Online (Sandbox Code Playgroud)

查看Google Code 上J2MEMapRouteAndroidEx的完整代码

  • 此代码将不再有效,因为谷歌已停止以KML格式提供响应.以下是Stack Overflow问题答案中解决方案的链接[为什么使用KML数据检索Android版Google方向不再有效?](http://stackoverflow.com/a/11745316/1230123) (8认同)
  • http://code.google.com/intl/uk-UA/android/add-ons/google-apis/reference/com/google/android/maps/MapController.html#setZoom%28int%29 (2认同)