J2ME/Android/BlackBerry - 行车路线、两个位置之间的路线
-
19-09-2019 - |
题
在 Android 1.0 上,有一个用于行车路线的 com.google.googlenav 命名空间:
路线 - 改进的 Google 行车路线
但在较新的 SDK 中,由于某种原因它被删除了......
安卓:自 API 1.0 起删除了 DrivingDirections - 在 1.5/1.6 中如何执行此操作?在 BlackBerry 上也缺乏此类功能的 API:
如何在黑莓中找到两地之间的路线?
csie-tw 给出了一个解决方法(查询 gmaps 中的 kml 文件并解析它):
Android - 行车方向(路线路径)
还 安德里亚 做了一个 DrivingDirections 帮助程序类 对于安卓。
我在 j2me 中为此功能编写了一个小助手,因此我想在 Android 和 BlackBerry 上分享我的示例。
更新
正如评论中所述,这是官方不允许的 Google 地图 API 服务条款 :
Google 地图/Google 地球 API 服务条款
最近更新时间:2009 年 5 月 27 日
...
10.许可限制。除非本条款明确允许,或者除非您事先收到 Google(或特定内容提供商(如适用))的书面授权,否则 Google 的上述许可须遵守以下所有限制。除非第 7 条或地图 API 文档明确允许,否则您不得(也不得允许任何其他人):
...
10.9 将服务或内容与任何产品、系统或应用程序一起用于以下目的或与之相关:
(a) 实时导航或路线引导,包括但不限于与用户的支持传感器的设备的位置同步的逐向路线引导;
并且可能会禁用某些应用程序(不知何故,至少在 Android 上)...从 .NET 对话中的地理编码抓取:
API 使用条款不允许这样做。您不应刮擦Google地图以生成地理编码。我们将阻止对服务器进行自动查询的服务。
布雷特·泰勒
谷歌地图产品经理
如果有任何替代方案和/或建议,将不胜感激!
谢谢!
解决方案
J2ME 地图路线提供者
maps.google.com 有一个导航服务,可以为您提供以下位置的路线信息: 克米勒 格式。
要获取 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[] {};
}
Android 和 Blackberry 上的网络连接实现方式不同,因此您必须首先形成 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;
}
}
查看完整代码 J2ME地图路线BlackBerryEx 在谷歌代码上
安卓
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;
}
}
查看完整代码 J2MEMapRouteAndroidEx 在谷歌代码上