J2ME / Android / BlackBerry - เส้นทางการขับขี่เส้นทางระหว่างสถานที่สองแห่ง


90

บน Android 1.0 มีเนมสเปซ com.google.googlenav สำหรับเส้นทางการขับขี่:
เส้นทาง - ปรับปรุงเส้นทางการขับขี่ของ Google
แต่ใน SDK ที่ใหม่กว่านั้นถูกลบออกด้วยเหตุผลบางประการ ...
Android: DrivingDirections ถูกลบออกตั้งแต่ API 1.0 - วิธีทำใน 1.5 / 1.6? ใน BlackBerry ยังขาด API สำหรับสิ่งดังกล่าว:
จะค้นหาเส้นทางระหว่างสองสถานที่ใน Blackberry ได้อย่างไร

csie-tw ให้วิธีแก้ปัญหา (ค้นหา gmaps สำหรับไฟล์ kml และแยกวิเคราะห์):
Android - ทิศทางการขับขี่ (เส้นทางเส้นทาง) Andrea
ยังสร้างคลาสผู้ช่วย DrivingDirectionsสำหรับ Android ฉันเขียนตัวช่วยเล็ก ๆ น้อย ๆ สำหรับฟังก์ชันนี้ใน j2me ดังนั้นฉันจึงต้องการแบ่งปันตัวอย่างของฉันบน Android และ BlackBerry

อัปเดต
ตามที่ระบุไว้ในความคิดเห็นข้อกำหนดในการให้บริการของ Google Maps APIไม่ได้รับอนุญาตอย่างเป็นทางการ:

ข้อกำหนดในการให้บริการของ Google Maps / Google Earth APIs
แก้ไขล่าสุด: 27 พฤษภาคม 2552
...
10. ข้อ จำกัด ของใบอนุญาต เว้นแต่จะได้รับอนุญาตอย่างชัดแจ้งภายใต้ข้อกำหนดหรือเว้นแต่คุณจะได้รับการอนุญาตเป็นลายลักษณ์อักษรล่วงหน้าจาก Google (หรือตามความเหมาะสมจากผู้ให้บริการเนื้อหาเฉพาะ) ใบอนุญาตของ Google ข้างต้นจะอยู่ภายใต้การปฏิบัติตามข้อ จำกัด ด้านล่าง ยกเว้นที่ได้รับอนุญาตอย่างชัดเจนในส่วนที่ 7 หรือเอกสารประกอบแผนที่ API คุณต้องไม่ (และไม่อนุญาตให้บุคคลอื่นเข้าร่วม):
...
10.9 ใช้บริการหรือเนื้อหากับผลิตภัณฑ์ระบบหรือแอปพลิเคชันใด ๆ สำหรับหรือเกี่ยวข้องกับ:
(ก) การนำทางแบบเรียลไทม์หรือคำแนะนำเส้นทางรวมถึง แต่ไม่ จำกัด เพียงคำแนะนำเส้นทางแบบเลี้ยวต่อเลี้ยวที่ซิงโครไนซ์กับตำแหน่งของอุปกรณ์ที่เปิดใช้เซ็นเซอร์ของผู้ใช้

และอาจถูกปิดใช้งานสำหรับบางแอพ (อย่างน้อยก็บน Android) ... จากการขูด Geocode ในการสนทนา. NET :

สิ่งนี้ไม่ได้รับอนุญาตตามข้อกำหนดการใช้งาน API คุณไม่ควรขูด Google Maps เพื่อสร้างรหัสภูมิศาสตร์ เราจะบล็อกบริการที่ทำแบบสอบถามอัตโนมัติของเซิร์ฟเวอร์ของเรา


ผู้จัดการผลิตภัณฑ์Bret Taylor , Google Maps

จะขอบคุณสำหรับทางเลือกและ / หรือข้อเสนอแนะ!
ขอบคุณ!


2
ฉันคิดว่าการขูดเส้นทางการขับขี่ของ Google Maps เช่นนี้อาจผิดข้อกำหนดในการให้บริการของ Google
Christopher Orr

ฉันได้รับคะแนนทั้งหมดใน mRoad แต่ไม่ได้ทำแผนที่บน MAP .. เส้นทางที่แสดงบนแผนที่จากชัยปุระไปยังเดลีเท่านั้น!
Vishal Khakhkhar

1
@ วิชาล: ขอโทษนะ แต่ฉันช่วยไม่ได้! กรุณาโพสต์คำถามแยกกัน!
Maksym Gontar

คำตอบ:


115

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 Code

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;
    }
}

ดูโค้ดทั้งหมดบนJ2MEMapRouteAndroidExบน Google Code



8
โค้ดนี้จะใช้ไม่ได้อีกต่อไปเนื่องจาก Google หยุดตอบสนองในรูปแบบ KML นี่คือลิงค์สำหรับการแก้ปัญหาในคำตอบสำหรับคำถาม Stack Overflow ทำไมการเรียก Google Directions สำหรับ Android โดยใช้ข้อมูล KML จึงไม่ทำงานอีกต่อไป
kendrelaxman

1
นี่คือเอกสารฉบับสมบูรณ์developers.google.com/maps/documentation/directions
Alexey

โซลูชันข้างต้นไม่ทำงานกับ API 2 อีกต่อไปฉันจัดการเพื่อวาดเส้นทางระหว่างสองจุดโดยใช้ Google map android API v2 ฉันโพสต์วิธีแก้ปัญหาที่ลิงค์นั้น คำตอบ: วาดเส้นทางระหว่างสองจุดโดยใช้ Google Maps Android API v2
Zeeshan Mirza
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.