J2ME/Android/BlackBerry - 行车路线,两个地点之间的路线
Posted
技术标签:
【中文标题】J2ME/Android/BlackBerry - 行车路线,两个地点之间的路线【英文标题】:J2ME/Android/BlackBerry - driving directions, route between two locations 【发布时间】:2010-01-07 21:05:38 【问题描述】:在 android 1.0 上,有一个用于行车路线的 com.google.googlenav 命名空间:Route - Improved Google Driving Directions 但在较新的 SDK 中,由于某种原因它被删除了...Android: DrivingDirections removed since API 1.0 - how to do it in 1.5/1.6? 在 BlackBerry 上也缺少此类东西的 API:how to find the route between two places in Blackberry?
csie-tw 提供了一种解决方法(查询 gmap 以获取 kml 文件并对其进行解析):Android - Driving Direction (Route Path)Andrea 还为 Android 制作了 DrivingDirections helper classes。 我在 j2me 中为此功能编写了一个小助手,因此我想在 Android 和 BlackBerry 上分享我的示例。
更新 正如cmets中所说,官方不允许Google Maps APIs Terms of Service :
Google 地图/Google 地球 API 服务条款 最后更新:2009 年 5 月 27 日 ... 10. 许可限制。除非本条款明确允许,或者除非您事先获得 Google(或,如适用,特定内容的提供者)的书面授权,否则上述 Google 的许可受您遵守以下所有限制的约束。除非第 7 节或 Maps API 文档明确允许,否则您不得(也不得允许其他任何人): ... 10.9 将服务或内容与任何产品、系统或应用程序一起用于或与之相关: (a) 实时导航或路线引导,包括但不限于与用户传感器设备的位置同步的逐向路线引导;
并且可能会被某些应用禁用(不知何故,至少在 Android 上)...来自Geocode scraping in .NET conversation:
API 使用条款不允许这样做。你不应该刮 谷歌地图生成地理编码。我们将阻止这样做的服务 自动查询我们的服务器。
布雷特·泰勒 谷歌地图产品经理
如果有任何替代方案和/或建议,我们将不胜感激! 谢谢!
【问题讨论】:
我认为像这样抓取 Google 地图行车路线可能会违反 Google 的使用条款。 我正在获取 mRoad 中的所有点,但它们没有映射到 MAP 上。地图上显示的路径仅从斋浦尔到德里! @Vishal:抱歉,我帮不上忙!请发布单独的问题! 【参考方案1】:J2ME 地图路线提供者
maps.google.com 有一个导航服务,可以为您提供KML 格式的路线信息。
要获取 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;
在 Google 代码上的 J2MEMapRouteBlackBerryEx 上查看完整代码
安卓
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 代码上的 J2MEMapRouteAndroidEx 上查看完整代码
【讨论】:
code.google.com/intl/uk-UA/android/add-ons/google-apis/… 此代码将不再有效,因为 google 已停止以 KML 格式提供响应。这是 Stack Overflow 问题Why retrieving Google Directions for Android using KML data is not working anymore? 答案中的解决方案链接 这里是完整的文档:developers.google.com/maps/documentation/directions 上述解决方案不再使用 API 2。我设法使用 Google map android API v2 在两点之间绘制了一条路径。我在那个链接上发布了它的解决方案。答案:使用 Google Maps Android API v2 在两点之间绘制路径以上是关于J2ME/Android/BlackBerry - 行车路线,两个地点之间的路线的主要内容,如果未能解决你的问题,请参考以下文章