【问题标题】:J2ME/Android/BlackBerry - driving directions, route between two locationsJ2ME/Android/BlackBerry - 行车路线,两个地点之间的路线
【发布时间】:2011-01-02 16:18:40
【问题描述】:

在 Android 1.0 上,有一个用于行车路线的 com.google.googlenav 命名空间:
Route - Improved Google Driving Directions
但在较新的 SDK 中,由于某种原因它被删除了...
Android: DrivingDirections removed since API 1.0 - how to do it in 1.5/1.6? 在 BlackBerry 上也缺少此类东西的 API:
how to find the route between two places in Blackberry?

csie-tw 提供了一种解决方法(查询 gmap 以获取 kml 文件并对其进行解析):
Android - Driving Direction (Route Path)
Andrea 还为 Android 制作了 DrivingDirections helper classes
我在 j2me 中为此功能编写了一个小助手,因此我想在 Android 和 BlackBerry 上分享我的示例。

更新
正如cmets中所说,官方不允许Google Maps APIs Terms of Service

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

并且可能会被某些应用禁用(不知何故,至少在 Android 上)...来自Geocode scraping in .NET conversation

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

布雷特·泰勒
谷歌地图产品经理

如果有任何替代方案和/或建议,我们将不胜感激!
谢谢!

【问题讨论】:

  • 我认为像这样抓取 Google 地图的行车路线可能会违反 Google 的使用条款。
  • 我正在获取 mRoad 中的所有点,但它们没有映射到 MAP 上。地图上显示的路径仅从斋浦尔到德里!
  • @Vishal:抱歉,我帮不上忙!请发布单独的问题!

标签: android blackberry java-me geolocation driving-directions


【解决方案1】:

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

黑莓

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 上查看完整代码

安卓

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 代码上的 J2MEMapRouteAndroidEx 上查看完整代码

【讨论】:

猜你喜欢
  • 2012-08-05
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
  • 2010-11-03
  • 1970-01-01
  • 2011-01-08
  • 2019-08-07
相关资源
最近更新 更多