J2ME / एंड्रॉइड / ब्लैकबेरी - ड्राइविंग निर्देश, दो स्थानों के बीच का मार्ग


90

एंड्रॉइड 1.0 पर ड्राइविंग निर्देश के लिए एक com.google.googlenav नाम स्थान था:
मार्ग - बेहतर Google ड्राइविंग निर्देश
लेकिन नए एसडीके में इसे किसी कारण से हटा दिया गया था ...
Android: API 1.0 से ड्राइविंगडायरेक्शन हटा दिया गया - इसे 1.5 / में कैसे करें 1.6? ब्लैकबेरी पर ऐसे सामान के लिए एपीआई का भी अभाव है:
ब्लैकबेरी में दो स्थानों के बीच का मार्ग कैसे खोजा जाए?

csie-tw एक वर्कअराउंड देता है (kml फ़ाइल के लिए क्वेरी gmaps और इसे पार्स करें):
Android - ड्राइविंग निर्देश (मार्ग पथ)
इसके अलावा एंड्रिया ने Android के लिए एक ड्राइविंगडायरेक्शन हेल्पर कक्षाएं बनाईं
मैंने j2me में इस कार्यक्षमता के लिए थोड़ा सहायक लिखा है, इसलिए मैं अपने नमूने एंड्रॉइड और ब्लैकबेरी पर साझा करना चाहूंगा।

अद्यतन
जैसा कि टिप्पणियों में कहा गया था, यह आधिकारिक तौर पर Google मैप्स एपीआई सेवा की शर्तों की अनुमति नहीं है :

Google मानचित्र / Google धरती API सेवा की शर्तें
अंतिम बार अद्यतन: 27 मई, 2009
...
10. लाइसेंस प्रतिबंध। शर्तों के तहत स्पष्ट रूप से अनुमति के अलावा, या जब तक आपको Google से पूर्व लिखित प्राधिकरण प्राप्त नहीं हुआ है (या, जैसा कि लागू होता है, विशेष सामग्री के प्रदाता से), Google के ऊपर के लाइसेंस नीचे दिए गए सभी प्रतिबंधों के आपके पालन के अधीन हैं। सेक्शन 7 या मैप्स एपीआई डॉक्यूमेंटेशन में स्पष्ट रूप से अनुमति के अलावा, आपको नहीं (और न ही आप किसी और को अनुमति दे सकते हैं):
...
10.9 सेवा या सामग्री का उपयोग किसी भी उत्पाद, सिस्टम या एप्लिकेशन के साथ या उसके संबंध में करें:
(ए) वास्तविक समय नेविगेशन या मार्ग मार्गदर्शन, सहित, लेकिन बारी-बारी से मार्ग मार्गदर्शन तक सीमित नहीं है जो उपयोगकर्ता के सेंसर-सक्षम डिवाइस की स्थिति के लिए सिंक्रनाइज़ है;

और कुछ ऐप्स के लिए अक्षम किया जा सकता है (किसी भी तरह, कम से कम एंड्रॉइड पर) ... .NET बातचीत में जियोकोड स्क्रैपिंग से :

यह एपीआई उपयोग की शर्तों द्वारा अनुमति नहीं है। जियोकोड जेनरेट करने के लिए आपको गूगल मैप्स को नहीं खुरचना चाहिए। हम उन सेवाओं को अवरुद्ध कर देंगे जो हमारे सर्वरों की स्वचालित क्वेरी करती हैं।

ब्रेट टेलर
उत्पाद प्रबंधक, Google मानचित्र

किसी भी विकल्प और / या सुझावों के लिए आभारी होंगे!
धन्यवाद!


2
मैं कल्पना करता हूं कि इस तरह से Google मानचित्र ड्राइविंग दिशाओं को स्क्रैप करना Google के उपयोग की शर्तों के गलत हो सकता है।
क्रिस्टोफर ऑर

Im mRoad में सभी अंक प्राप्त कर रहे हैं, लेकिन वे MAP पर मैपिंग नहीं कर रहे हैं .. MAP पर प्रदर्शित पथ यह जयपुर से दिल्ली तक ही प्रदर्शित करता है!
विशाल खाखर

1
@ विशाल: क्षमा करें, लेकिन मैं इसके साथ मदद नहीं कर सकता! कृपया अलग प्रश्न पोस्ट करें!
मैक्सिमम गोन्टर

जवाबों:


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[] {};
}

नेटवर्क कनेक्शन एंड्रॉइड और ब्लैकबेरी पर अलग-अलग तरीकों से लागू किया जाता है, इसलिए आपको पहले 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 पर पूरा कोड देखें

एंड्रॉयड

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

Google कोड पर J2MEMapRouteAndroidEx पर पूरा कोड देखें



8
यह कोड अब काम नहीं करेगा क्योंकि KML प्रारूप में प्रतिक्रिया देने के लिए Google ने रोक दिया है। यहां स्टैक ओवरफ्लो प्रश्न के उत्तर में समाधान के लिए लिंक दिया गया है। केएमएल डेटा का उपयोग करके एंड्रॉइड के लिए Google दिशा-निर्देशों को पुनर्प्राप्त क्यों नहीं कर रहा है?
kendrelaxman

1
यहाँ पूर्ण प्रलेखन है: Developers.google.com/maps/documentation/directions
एलेक्सी

उपरोक्त समाधान API 2 के साथ अधिक काम नहीं कर रहा है। मैं Google मानचित्र Android API v2 का उपयोग करके दो बिंदुओं के बीच एक पथ बनाने में कामयाब रहा। मैंने उस लिंक पर इसका समाधान पोस्ट किया। उत्तर: Google मैप्स Android API v2
जीशान मिर्जा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.