J2ME / Android / BlackBerry - instruções de direção, rota entre dois locais

90

No Android 1.0, havia um namespace com.google.googlenav para instruções de direção:
Rota - Rotas de direção aprimoradas do Google
Mas no SDK mais recente ele foi removido por algum motivo ...
Android: DrivingDirections removido desde a API 1.0 - como fazê-lo no 1.5 / 1,6? No BlackBerry também faltam APIs para essas coisas:
como encontrar a rota entre dois lugares no Blackberry?

csie-tw oferece uma solução alternativa (consulte os gmaps para o arquivo kml e analise-o):
Android - Direção de direção (caminho da rota)
também Andrea criou classes auxiliares DrivingDirections para Android.
Eu escrevi um pequeno auxiliar para essa funcionalidade, no j2me, então gostaria de compartilhar meus exemplos no Android e no BlackBerry.

ATUALIZAR
Conforme declarado nos comentários, não é oficialmente permitido pelos Termos de Serviço das APIs do Google Maps :

Termos de serviço das APIs do Google Maps / Google Earth
Última atualização: 27 de maio de 2009
...
10. Restrições da licença. Exceto conforme expressamente permitido pelos Termos ou a menos que você tenha recebido autorização prévia por escrito do Google (ou, conforme aplicável, do provedor de determinado Conteúdo), as licenças do Google acima estão sujeitas à sua adesão a todas as restrições abaixo. Exceto conforme explicitamente permitido na Seção 7 ou na Documentação das APIs do Google Maps, você não deve (nem pode permitir que outra pessoa):
...
10.9 usar o Serviço ou Conteúdo com quaisquer produtos, sistemas ou aplicativos para ou em conexão com:
(a) navegação em tempo real ou orientação de rota, incluindo, mas não se limitando a orientação de rota curva a curva que é sincronizada com a posição de um dispositivo ativado por sensor do usuário;

e pode ser desativado para determinados aplicativos (de alguma forma, pelo menos no Android) ... De geocode scraping em conversação .NET :

Isso não é permitido pelos termos de uso da API. Você não deve raspar o Google Maps para gerar geocódigos. Vamos bloquear serviços que fazem consultas automatizadas de nossos servidores.

Bret Taylor
Product Manager, Google Maps

Ficaria muito grato por quaisquer alternativas e / ou sugestões!
Obrigado!

Maksym Gontar
fonte
2
Eu imagino que raspar as instruções de direção do Google Maps como esta pode violar os Termos de Uso do Google.
Christopher Orr
Estou recebendo todos os pontos no mRoad, mas eles não estão mapeando no MAP .. O caminho exibido no MAP é de Jaipur para Delhi apenas!
Vishal Khakhkhar
1
@Vishal: Desculpe, mas não posso ajudar com isso! Por favor, poste uma pergunta separada!
Maksym Gontar

Respostas:

115

Provedor de rotas de mapas J2ME

maps.google.com tem um serviço de navegação que pode fornecer informações de rota em KML formato .

Para obter o arquivo kml, precisamos formar url com os locais de início e destino:

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

Em seguida, você precisará analisar o xml (implementado com SAXParser) e preencher as estruturas de dados:

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 conexão de rede é implementada de maneiras diferentes no Android e Blackberry, então você terá que primeiro formar o url:

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

em seguida, crie uma conexão com este url e obtenha InputStream.
Em seguida, passe este InputStream e obtenha a estrutura de dados analisada:

 public static Road getRoute(InputStream is) 

Código-fonte completo RoadProvider.java

Amora

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

Veja o código completo em J2MEMapRouteBlackBerryEx no Google Code

Android

Captura de tela do 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;
    }
}

Veja o código completo em J2MEMapRouteAndroidEx no Google Code

Maksym Gontar
fonte
8
Este código não funcionará mais, pois o Google parou para fornecer a resposta no formato KML. Aqui está o link para a solução na resposta à pergunta do Stack Overflow Por que recuperar o Google Directions para Android usando dados KML não está mais funcionando?
kendrelaxman
1
Aqui está a documentação completa: developers.google.com/maps/documentation/directions
Alexey
A solução acima não é mais trabalhar com API 2. Consegui traçar um caminho entre dois pontos usando a API Android v2 do Google map android. Eu postei sua solução naquele link. Resposta: Desenhe o caminho entre dois pontos usando a API do Google Maps para Android v2
Zeeshan Mirza