java手机游戏地图绘制,Android实现在map上画出路线的方法

本文实例讲述了Android实现在map上画出路线的方法。分享给大家供大家参考。具体如下:

最近在搞在地图上画出路线图,经过一段时间的摸索,终于搞明白了,其实也挺简单的,写个类继承Overlay,并重写draw方法,在draw方法中画出 path即可。对于Overaly,在地图上标记某个点或者画线之类的就要使用overlay,overlay相当于一个覆盖物,覆盖在地图上,这个覆盖物要自己实现所以要继承Overlay。

MapActivity.java如下:

package net.blogjava.mobile.map;

import java.util.List;

import Android.app.AlertDialog;

import android.graphics.Bitmap;

import android.graphics.BitmapFactory;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.Paint;

import android.graphics.Path;

import android.graphics.Point;

import android.location.Address;

import android.location.Geocoder;

import android.os.Bundle;

import android.view.Menu;

import com.google.android.maps.GeoPoint;

import com.google.android.maps.MapActivity;

import com.google.android.maps.MapController;

import com.google.android.maps.MapView;

import com.google.android.maps.Overlay;

import com.google.android.maps.Projection;

public class Main extends MapActivity {

private GeoPoint gpoint1, gpoint2, gpoint3;// 连线的点

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

MapView mapView = (MapView) findViewById(R.id.mapview);

mapView.setClickable(true);

mapView.setBuiltInZoomControls(true);

MapController mapController = mapView.getController();

mapView.setTraffic(true);// 交通图

// mapView.setSatellite(true);//卫星图

// mapView.setStreetView(true);//街景

MyOverlay myOverlay = new MyOverlay();

mapView.getOverlays().add(myOverlay);

mapController.setZoom(15);// 初始放大倍数

gpoint1 = new GeoPoint((int) (24.477384 * 1000000),

(int) (118.158216 * 1000000));

gpoint2 = new GeoPoint((int) (24.488967 * 1000000),

(int) (118.144277 * 1000000));

gpoint3 = new GeoPoint((int) (24.491091 * 1000000),

(int) (118.136781 * 1000000));

mapController.animateTo(gpoint1);

}

@Override

protected boolean isRouteDisplayed() {

// TODO Auto-generated method stub

return false;

}

class MyOverlay extends Overlay {

@Override

public void draw(Canvas canvas, MapView mapView, boolean shadow) {

// TODO Auto-generated method stub

super.draw(canvas, mapView, shadow);

// 画笔

Paint paint = new Paint();

paint.setColor(Color.RED);

paint.setDither(true);

paint.setStyle(Paint.Style.STROKE);

paint.setStrokeJoin(Paint.Join.ROUND);

paint.setStrokeCap(Paint.Cap.ROUND);

paint.setStrokeWidth(2);

Projection projection = mapView.getProjection();

Point p1 = new Point();

Point p2 = new Point();

Point p3 = new Point();

projection.toPixels(gpoint1, p1);

projection.toPixels(gpoint2, p2);

projection.toPixels(gpoint3, p3);

Path path = new Path();

path.moveTo(p1.x, p1.y);

path.lineTo(p2.x, p2.y);

path.lineTo(p3.x, p3.y);

canvas.drawPath(path, paint);// 画出路径

}

}

}

main.xml如下:

android:orientation="vertical" android:layout_width="fill_parent"

android:layout_height="fill_parent">

android:id="@+id/mapview" android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:apiKey="0IB7Kn70qp1LT216Hhb-jmHJ8GLTie4p63O77KQ" />

最后别忘了加权限 :

在之间加

绘制路线图:

/**

* 通过解析google map返回的xml,在map中画路线图

*/

public void drawRoute(){

String url = "http://maps.google.com/maps/api/directions/xml?origin=23.055291,113.391802" + "&destination=23.046604,113.397510&sensor=false&mode=walking";

HttpGet get = new HttpGet(url);

String strResult = "";

try {

HttpParams httpParameters = new BasicHttpParams();

HttpConnectionParams.setConnectionTimeout(httpParameters, 3000);

HttpClient httpClient = new DefaultHttpClient(httpParameters);

HttpResponse httpResponse = null;

httpResponse = httpClient.execute(get);

if (httpResponse.getStatusLine().getStatusCode() == 200){

strResult = EntityUtils.toString(httpResponse.getEntity());

}

} catch (Exception e) {

return;

}

if (-1 == strResult.indexOf("OK")){

Toast.makeText(this, "获取导航路线失败!", Toast.LENGTH_SHORT).show();

this.finish();

return;

}

int pos = strResult.indexOf("");

pos = strResult.indexOf("", pos + 1);

int pos2 = strResult.indexOf("", pos);

strResult = strResult.substring(pos + 8, pos2);

List points = decodePoly(strResult);

MyOverLay mOverlay = new MyOverLay(points);

List overlays = mMapView.getOverlays();

overlays.add(mOverlay);

if (points.size() >= 2){

mMapController.animateTo(points.get(0));

}

mMapView.invalidate();

}

/**

* 解析返回xml中overview_polyline的路线编码

*

* @param encoded

* @return

*/

private List decodePoly(String encoded) {

List poly = new ArrayList();

int index = 0, len = encoded.length();

int lat = 0, lng = 0;

while (index < len) {

int b, shift = 0, result = 0;

do {

b = encoded.charAt(index++) - 63;

result |= (b & 0x1f) << shift;

shift += 5;

} while (b >= 0x20);

int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));

lat += dlat;

shift = 0;

result = 0;

do {

b = encoded.charAt(index++) - 63;

result |= (b & 0x1f) << shift;

shift += 5;

} while (b >= 0x20);

int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));

lng += dlng;

GeoPoint p = new GeoPoint((int) (((double) lat / 1E5) * 1E6),(int) (((double) lng / 1E5) * 1E6));

poly.add(p);

}

return poly;

}

希望本文所述对大家的Android程序设计有所帮助。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值