代码之家  ›  专栏  ›  技术社区  ›  Maksym Gontar

J2ME/Android/BlackBerry-驾驶方向,两个地点之间的路线

  •  90
  • Maksym Gontar  · 技术社区  · 15 年前

    在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? 在黑莓手机上,也缺少此类产品的API:
    how to find the route between two places in Blackberry?

    csie tw提供了一个解决方法(查询gmap以获取kml文件并对其进行分析):
    Android - Driving Direction (Route Path)
    阿尔索 Andrea 做了一个 DrivingDirections helper classes 对于Android。
    我在J2ME中为这个功能编写了一个小助手,所以我想在Android和BlackBerry上共享我的示例。

    更新
    正如评论中所说,这是不允许的 Google Maps APIs Terms of Service :

    谷歌地图/谷歌地球API服务条款
    上次更新时间:2009年5月27日

    10.许可证限制。除非本条款明确允许,或除非您事先获得谷歌(或特定内容提供商)的书面授权(如适用),否则您必须遵守以下所有限制。除非第7节或地图API文档中明确允许,否则您不得(也不得允许任何其他人):

    10.9将服务或内容用于任何产品、系统或应用程序或与之相关的:
    (a)实时导航或路线引导,包括但不限于与用户传感器启用设备的位置同步的转弯路线引导;

    可能会对某些应用程序禁用(至少在Android上是这样)。从 Geocode scraping in .NET conversation :

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

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

    感谢您提供任何备选方案和/或建议!
    谢谢!

    1 回复  |  直到 7 年前
        1
  •  116
  •   Sanoop Surendran    7 年前

    J2ME映射路由提供程序

    maps.google.com有一个导航服务,可以在 kml>format中为您提供路由信息。

    要获取kml文件,我们需要用起始位置和目标位置组成url:。

    public static string geturl(double fromlat,double fromlon,
    double tolat,double tolon)//连接到地图Web服务
    stringBuffer urlString=new stringBuffer();
    附加(“http://maps.google.com/maps”?f=d&hl=en”);
    urlstring.append(“&saddr=”);//来自
    urlString.append(double.toString(fromlat));
    urlString.append(“,”);
    urlString.append(double.toString(fromlon));
    urlString.append(“&daddr=”);//到
    urlString.append(double.toString(tolat));
    urlString.append(“,”);
    urlString.append(double.toString(tolon));
    urlString.append(“ie=utf8&0&om=0&output=kml”);
    返回urlString.toString();
    }
    
    
    

    接下来,您将需要解析XML(用SAXParser实现)并填充数据结构:

    公共类点{ 字符串MNEX; 字符串mdescription; 字符串miconurl; 双重国籍; 双长相; } 公共道路{ 公共字符串mname; 公共字符串mdescription; 公共国际颜色; 公共情报部门; public double[][]mroute=new double[][]; 公共点[]MPoints=新点[]; } < /代码>

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

    public static string geturl(double fromlat,double fromlon,
    双托拉特,双托隆)
    < /代码> 
    
    

    然后创建与此URL的连接并获取inputstream。
    然后传递此输入流并获取分析的数据结构:

    公共静态道路getroute(inputstream is) < /代码>

    完全源代码:“HyfF=”“HTPF/.GoGoLe.CO/P/J2MeMaPAPReToField/Suxe/Buffs/Tunk/J2MeMaPrAppBrimByReEx/Src/Org/Ci/Ge/Rout/RoopPosiv.java”Re=“NoFoLoLoNeFror”> RoalPosial.Java/P>

    黑莓

    Dead Link-黑莓风暴屏幕截图

    < /块引用>
    class mapPathScreen扩展主屏幕{
    地图控制图;
    road mroad=新道路();
    公共映射路径屏幕()。{
    双fromlat=49.85,fromlon=24.016667;
    双Tolat=50.45,Tolon=30.523333;
    字符串url=roadprovider.geturl(fromlat、fromlon、tolat、tolon);
    inputstream=getConnection(url);
    mroad=roadprovider.getRoute(is);
    map=new mapcontrol();
    添加(new labelfield(mroad.mname));
    添加(new labelfield(mroad.mdescription));
    添加(MAP);
    }
    受保护的void onuinengineattached(布尔连接){
    super.onuineengineattached(附件);
    如果(附加){
    地图.绘制路径(mroad);
    }
    }
    专用输入流getConnection(字符串url){
    httpConnection urlConnection=空;
    inputstream=空;
    尝试{
    urlConnection=(httpConnection)connector.open(url);
    urlConnection.setRequestMethod(“get”);
    是=urlConnection.openinputstream();
    }捕获(IOException E){
    e.printstacktrace();
    }
    回报是;
    }
    }
    < /代码> 
    
    

    请参见j2memaprouteblackerryxon google code

    安卓

    public class maprouteactivity extends mapactivity{
    线性布局线性布局;
    地图视图;
    私人道路道路;
    @重写
    public void oncreate(bundle savedinstanceState){
    super.oncreate(保存的状态);
    setContentView(r.layout.main);
    mapview=(mapview)findView byid(r.id.mapview);
    mapview.setbuiltinzoomcontrols(真);
    新线程()
    @重写
    public void run()。{
    双fromlat=49.85,fromlon=24.016667;
    双Tolat=50.45,Tolon=30.523333;
    string url=道路提供商
    .geturl(从lat、fromlon、tolat、tolon);
    inputstream=getConnection(url);
    mroad=roadprovider.getRoute(is);
    mhandler.sendEmptyMessage(0);
    }
    }.start();
    }
    
    handler mhandler=new handler()。{
    公共void handlemessage(android.os.message msg){
    textView textView=(textView)findView byid(r.id.description);
    textview.settext(mroad.mname+“”+mroad.mdescription);
    mapoverlay mapoverlay=新建mapoverlay(mroad,mapview);
    list<overlay>listoOverlay=mapView.getOverlays();
    listoOverlay.clear();
    添加(mapoverlay);
    mapview.invalidate();
    };
    };
    
    专用输入流getConnection(字符串url){
    inputstream=空;
    尝试{
    urlConnection conn=new url(url).openConnection();
    是=conn.getinputstream();
    }catch(异常异常){
    e.printstacktrace();
    }捕获(IOException E){
    e.printstacktrace();
    }
    回报是;
    }
    @重写
    受保护的Boolean IsRouteDisplayed()。{
    返回错误;
    }
    }
    < /代码> 
    
    

    请参见j2memaprouteandroidexon google code

    为您提供路线信息的服务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。
    然后传递这个输入流并得到解析的数据结构:

     public static Road getRoute(InputStream is) 
    

    完整源代码RoadProvider.java

    黑莓

    Dead link - BlackBerry Storm screenshot

    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关于谷歌代码

    安卓

    Android G1 screenshot

    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谷歌代码