J2ME / Android / BlackBerry - yol tarifleri, iki konum arasındaki rota


90

Android 1.0'da, yol tarifleri için bir com.google.googlenav ad alanı vardı:
Rota - Geliştirilmiş Google Yol Tarifleri
Ancak daha yeni SDK'da bazı nedenlerle kaldırıldı ...
Android: DrivingDirections API 1.0'dan beri kaldırıldı - 1.5 / 1.6? BlackBerry'de de bu tür şeyler için API eksikliği var:
Blackberry'de iki yer arasındaki rotayı nasıl bulabilirim?

csie-tw bir çözüm sunar (kml dosyası için gmaps sorgulama ve ayrıştırma):
Android - Sürüş Yönü (Rota Yolu)
Ayrıca Andrea , Android için DrivingDirections yardımcı sınıfları hazırladı.
Bu işlevsellik için j2me'de küçük bir yardımcı yazdım, bu yüzden örneklerimi Android ve BlackBerry'de paylaşmak istiyorum.

GÜNCELLEME
Yorumlarda belirtildiği gibi, resmi olarak izin verilmeyen Google Haritalar API'leri Hizmet Şartları :

Google Haritalar / Google Earth API'leri Hizmet Şartları
Son güncelleme: 27 Mayıs 2009
...
10. Lisans Kısıtlamaları. Şartlar kapsamında açıkça izin verilmedikçe veya Google'dan (veya uygun olduğu şekilde, belirli İçeriğin sağlayıcısından) önceden yazılı izin almadıysanız, Google'ın yukarıdaki lisansları aşağıdaki tüm kısıtlamalara bağlılığınıza tabidir. Bölüm 7'de veya Haritalar API Dokümantasyonunda açıkça izin verilmedikçe, aşağıdakileri yapmamalısınız (ve başkalarına da izin veremezsiniz):
...
10.9 Hizmeti veya İçeriği aşağıdakiler için veya bunlarla bağlantılı olarak herhangi bir ürün, sistem veya uygulama ile kullanmamalısınız:
(a) gerçek zamanlı navigasyon veya rota rehberliği, bir kullanıcının sensör özellikli cihazının pozisyonuyla senkronize olan adım adım yol rehberliği dahil ancak bunlarla sınırlı değildir;

ve bazı uygulamalar için devre dışı bırakılabilir (bir şekilde, en azından Android'de) ... .NET konuşmasında Geocode kazımadan :

API kullanım koşulları buna izin vermiyor. Coğrafi kodlar oluşturmak için Google Haritalar'ı kazımamalısınız. Sunucularımızın otomatik sorgularını yapan hizmetleri engelleyeceğiz.

Bret Taylor
Ürün Müdürü, Google Haritalar

Herhangi bir alternatif ve / veya öneriniz için minnettar oluruz!
Teşekkürler!


2
Google Haritalar'ın bu gibi yol tariflerini almanın Google'ın Kullanım Şartları'na aykırı olabileceğini tahmin ediyorum.
Christopher Orr

MRoad'daki tüm noktaları alıyorum, ancak MAP'de haritalanmıyorlar .. HARİTADA yalnızca Jaipur'dan Delhi'ye kadar görüntülenen yol!
Vishal Khakhkhar

1
@Vishal: Üzgünüm ama bu konuda yardımcı olamıyorum! Lütfen ayrı bir soru gönderin!
Maksym Gontar

Yanıtlar:


115

J2ME Harita Rota Sağlayıcısı

maps.google.com, size KML biçiminde rota bilgileri sağlayabilen bir navigasyon hizmetine sahiptir .

Kml dosyasını almak için başlangıç ​​ve varış yerleri ile url oluşturmamız gerekir:

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

Daha sonra xml'yi (SAXParser ile uygulanmış) ayrıştırmanız ve veri yapılarını doldurmanız gerekir:

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

Ağ bağlantısı, Android ve Blackberry'de farklı şekillerde uygulanır, bu nedenle önce url oluşturmanız gerekir:

 public static String getUrl(double fromLat, double fromLon,
     double toLat, double toLon)

daha sonra bu url ile bağlantı oluşturun ve InputStream'i alın.
Sonra bu InputStream'i iletin ve ayrıştırılmış veri yapısını alın:

 public static Road getRoute(InputStream is) 

Tam kaynak kodu RoadProvider.java

Böğürtlen

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 Code'da J2MEMapRouteBlackBerryEx'te tam kodu görün

Android

Android G1 ekran görüntüsü

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 Code'da J2MEMapRouteAndroidEx'te tam kodu görün



8
Google, yanıtı KML biçiminde vermeyi durdurduğundan bu kod artık çalışmayacak. Yığın Taşması sorusunun yanıtındaki çözüme ilişkin bağlantı burada KML verilerini kullanarak Android için Google Yönergeleri almak neden artık çalışmıyor?
kendrelaxman

1
Belgelerin tamamı
Alexey

Yukarıdaki çözüm artık API 2 ile çalışmıyor. Google harita android API v2 kullanarak iki nokta arasında bir yol çizmeyi başardım. Çözümünü bu bağlantıya gönderdim. Yanıt: Google Haritalar Android API v2'yi kullanarak iki nokta arasında yol çizin
Zeeshan Mirza
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.