J2ME / Android / BlackBerry - como chegar de carro rota entre dois locais
-
19-09-2019 - |
Pergunta
No Android 1.0 havia um namespace com.google.googlenav para instruções de direção:
Route - Melhoria Directions Google condução
Mas, na mais recente SDK que foi removido por alguma razão ...
Android: DrivingDirections removido desde API 1.0 - como fazê-lo em 1,5 / 1,6 ?
No BlackBerry também há falta de APIs para tais coisas:
como encontrar a rota entre dois locais em Blackberry?
CSIE-tw dá uma solução alternativa (gmaps consulta para arquivo KML e analisá-lo):
Android - direcção de condução (Path Route)
Também Andrea fez uma DrivingDirections ajudante aulas para Android.
Eu escrevi um pequeno ajudante para esta funcionalidade, em J2ME, então eu gostaria de compartilhar minhas amostras no Android e BlackBerry.
Atualizar
Como foi afirmado em observações, não é permitido oficialmente Google Maps API Termos de serviço :
O Google Maps / API do Google Earth Termos de Serviço
Última atualização: 27 mai 2009
...
10. Restrições da licença. Exceto quando expressamente permitido ao abrigo dos Termos, ou a menos que tenha recebido autorização prévia por escrito da Google (ou, conforme o caso, a partir do fornecedor de um determinado Conteúdo), licenças do Google acima estão sujeitos a sua adesão a todas as restrições abaixo. Exceto quando expressamente autorizado na Seção 7 ou a Documentação Mapas APIs, você não deve (nem poderá permitir a mais ninguém):
...
10,9 usar o Serviço ou Conteúdo com qualquer produto, sistemas ou aplicações para ou em conexão com:
(A) a navegação ou a rota de orientação em tempo real, incluindo, mas não limitado a turn-by-turn orientação de rota que é sincronizada com a posição do dispositivo ativado por sensor do usuário;
e pode ser desativada para certas aplicações (de alguma forma, pelo menos no Android) ... De Geocode raspagem no .NET conversa :
Isso não é permitido pelos termos da API de uso. Você não deve raspar Google Maps para gerar geocodes. Vamos bloquear serviços que fazem consultas automáticas de nossos servidores.
Bret Taylor
Gerente de Produto, Google Maps
ficaria grato por todas as alternativas e / ou sugestões!
Obrigado!
Solução
Provedor J2ME Mapa Route
maps.google.com tem um serviço de navegação que pode fornecer-lhe as informações de rota em formato KML .
Para obter o arquivo kml precisamos formar url com locais de partida e de 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á xml parse (implementado com SAXParser) e estruturas de dados de preenchimento:
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[] {};
}
conexão rede é implementado de maneiras diferentes em Android e Blackberry, então você terá que primeiro url forma:
public static String getUrl(double fromLat, double fromLon,
double toLat, double toLon)
, em seguida, criar uma conexão com este url e obter InputStream.
Em seguida, passe esta InputStream e obter estrutura de dados analisado:
public static Road getRoute(InputStream is)
O código fonte completo 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;
}
}
Veja código completo sobre J2MEMapRouteBlackBerryEx em Google Code
Android
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 código completo sobre J2MEMapRouteAndroidEx em Google Code