J2ME/Android/BlackBerry-indicaciones de manejo, ruta entre dos ubicaciones
java-me geolocation (1)
Proveedor de ruta de mapa J2ME
maps.google.com tiene un servicio de navegación que puede proporcionarle información de ruta en formato KML .
Para obtener el archivo kml necesitamos formar url con las ubicaciones de inicio y 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();
}
A continuación, deberá analizar xml (implementado con SAXParser) y completar estructuras de datos:
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[] {};
}
La conexión a la red se implementa de diferentes maneras en Android y Blackberry, por lo que primero deberá crear la url:
public static String getUrl(double fromLat, double fromLon,
double toLat, double toLon)
luego crea una conexión con esta URL y obtén InputStream.
A continuación, pase este InputStream y obtenga la estructura de datos analizada:
public static Road getRoute(InputStream is)
Código fuente completo RoadProvider.java
Mora
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;
}
}
Ver el código completo en J2MEMapRouteBlackBerryEx en Google Code
Androide
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;
}
}
Ver el código completo en J2MEMapRouteAndroidEx en Google Code
En Android 1.0, había un espacio de nombres com.google.googlenav para indicaciones de conducción:
Ruta: direcciones de conducción de Google mejoradas
Pero en el SDK más reciente, fue eliminado por alguna razón ...
Android: DrivingDirections eliminado desde API 1.0 - ¿cómo hacerlo en 1.5 / 1.6? En BlackBerry también faltan API para este tipo de cosas:
cómo encontrar la ruta entre dos lugares en Blackberry?
csie-tw da una solución alternativa (consulta gmaps para el archivo kml y analízalo):
Android - Dirección de conducción (ruta de ruta)
También Andrea hizo una clase de ayuda DrivingDirections para Android.
Escribí un pequeño ayudante para esta funcionalidad, en j2me, así que me gustaría compartir mis muestras en Android y BlackBerry.
ACTUALIZAR
Como se indicó en los comentarios, no se permite oficialmente las Condiciones del servicio de las API de Google Maps :
Términos de servicio de Google Maps / API de Google Earth
Última actualización: 27 de mayo de 2009
...
10. Restricciones de licencia. Excepto lo permitido expresamente en los Términos, o salvo que haya recibido una autorización previa por escrito de Google (o, según corresponda, del proveedor de un Contenido particular), las licencias anteriores de Google están sujetas a su adhesión a todas las restricciones que se detallan a continuación. A excepción de lo que se permite explícitamente en la Sección 7 o la Documentación de las API de Maps, no debe (ni puede permitir que otra persona lo haga):
...
10.9 utilizar el Servicio o el Contenido con cualquier producto, sistema o aplicación para o en conexión con:
(a) navegación en tiempo real o guía de ruta, que incluye, pero no se limita a, guía de ruta paso a paso que se sincroniza con la posición del dispositivo habilitado por sensor del usuario;
y puede estar deshabilitado para ciertas aplicaciones (de alguna manera, al menos en Android) ... Desde el raspado de Geocode en la conversación de .NET :
Esto no está permitido por los términos de uso de la API. No debe raspar Google Maps para generar códigos geográficos. Bloquearemos los servicios que realizan consultas automáticas de nuestros servidores.
Bret Taylor
Product Manager, Google Maps
Agradecería cualquier alternativa y / o sugerencia!
¡Gracias!