如何在Google Maps上画出两点之间的路线

 

介绍了如何通过解析KML文件,画出地图上两点之间的路线

谷歌地图提供了几种版本的,可以运用于网页,应用程序,手机应用等等,使用Google Direction API,谷歌地图可以方便地查找出方便地查询出地图上从A点到B点的路线图。

Google Direction API提供了更丰富的路线信息数据。由于访问量过大吧,谷歌现在不提供了查询路线的接口API。对于G粉来说,不能不说是遗憾了,本文提供了在谷歌地图上画路线图的另一种方法,也就是通过URL访问谷歌地图,解析KML文件,获得路线图数据,重新画在您的Android谷歌地图应用上。

第一步,新建Android项目,填写项目名称,勾选编译的包,这次选择了Google APIs 8,填入应用名称,包名称,以及Activity。

第二步,设计应用界面,修改main.xml

第三步,填写运行时,首次启动Activity,SmartActivity继承MapActivity

public class SmartActivity extends MapActivity {
    /** Called when the activity is first created. */
	@Override
    public void onCreate(Bundle savedInstanceState) {
    	super.onCreate(savedInstanceState);
    	setContentView(R.layout.main);
    }

	@Override
	protected boolean isRouteDisplayed() {
		// TODO Auto-generated method stub
		return false;
	}
}


第四步,新建名为DirectionPathOverly继承Overlay,也就是地图上两点之间画直线图层
public class DirectionPathOverlay extends Overlay {
	   private GeoPoint gp1;
	   private GeoPoint gp2;

	   public DirectionPathOverlay(GeoPoint gp1, GeoPoint gp2) {
	      this.gp1 = gp1;
	      this.gp2 = gp2;
	   }

	   @Override
	   public boolean draw(Canvas canvas, MapView mapView, boolean shadow, long when) {
		   Projection projection = mapView.getProjection();
		   if(shadow == false) {
		     Paint paint = new Paint();
		     paint.setAntiAlias(true);
		     Point point = new Point();
		     projection.toPixels(gp1, point);
		     paint.setColor(Color.BLUE);
		     Point point2 = new Point();
		     projection.toPixels(gp2, point2);
		     paint.setStrokeWidth(2);
		     canvas.drawLine((float) point.x, (float) point.y, (float) point2.x, (float) point2.y, paint);
		   }
		   return super.draw(canvas, mapView, shadow, when);
	   }

	   @Override
	   public void draw(Canvas canvas, MapView mapView, boolean shadow) {
	      super.draw(canvas, mapView, shadow);
	   }
	}


第五步,在启动Activity中添加函数getDirectionData(),访问网络,获取两个位置之间的KML文件数据,解析KML文件,获取路线的数据列表。
	
private String[] getDirectionData(String srcPlace, String destPlace) {
		   String urlString = "http://maps.google.com/maps?f=d&hl=en&saddr="+srcPlace+"&daddr="+destPlace+"&ie=UTF&om=0&output=kml";
		   Log.d("URL", urlString);
		   Document doc = null;
		   HttpURLConnection urlConnection = null;
		   URL url = null;
		   String pathConent = "";

		   try{
		      url = new URL(urlString.toString());
		      urlConnection = (HttpURLConnection) url.openConnection();
		      urlConnection.setRequestMethod("GET");
		      urlConnection.setDoOutput(true);
		      urlConnection.setDoInput(true);
		      urlConnection.connect();
		      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		      DocumentBuilder db = dbf.newDocumentBuilder();
		      doc = db.parse(urlConnection.getInputStream());
		   } catch (Exception e){}
		   NodeList nl = doc.getElementsByTagName("LineString");
		   for(int s=0; s< nl.getLength(); s++){
		      Node rootNode = nl.item(s);
		      NodeList configItems = rootNode.getChildNodes();
		      for(int x=0; x < configItems.getLength(); x++) {
		         Node lineStringNode = configItems.item(x);
		         NodeList path = lineStringNode.getChildNodes();
		         pathConent = path.item(0).getNodeValue();
		      }
		   }
		   String[] tempContent = pathConent.split(" ");
		   return tempContent;
		}

第六步,实验画出地图上两点之间的路线折线,在启动Activity的OnCreate()函数中添加如下代码:
myMapView = (MapView) findViewById(R.id.mapview);
    	geoPoint = null;
    	myMapView.setSatellite(false);
    	String pairs[] = getDirectionData("ahmedabad", "vadodara");
    	String[] lngLat = pairs[0].split(",");
    	// STARTING POINT
    	GeoPoint startGP = new GeoPoint((int)(Double.parseDouble(lngLat[1]) * 1E6), (int) (Double.parseDouble(lngLat[0]) * 1E6));
    	myMC = myMapView.getController();
    	geoPoint = startGP;
    	myMC.setCenter(geoPoint);
    	myMC.setZoom(8);
    	myMapView.getOverlays().add(new DirectionPathOverlay(startGP, startGP));
    	// NAVIGATE THE PATH
    	GeoPoint gp1;
    	GeoPoint gp2 = startGP;
    	for (int i = 1; i < pairs.length; i++) {
    		lngLat = pairs[i].split(",");
    		gp1 = gp2;
    		// watch out! For GeoPoint, first:latitude, second:longitude
    		gp2 = new GeoPoint((int) (Double.parseDouble(lngLat[1]) * 1E6),(int) (Double.parseDouble(lngLat[0]) * 1E6));
    		myMapView.getOverlays().add(new DirectionPathOverlay(gp1, gp2));
    		Log.d("xxx", "pair:" + pairs[i]);
    		}
    	// END POINT
    	myMapView.getOverlays().add(new DirectionPathOverlay(gp2, gp2));
    	myMapView.getController().animateTo(startGP);
    	myMapView.setBuiltInZoomControls(true);
    	myMapView.displayZoomControls(true);



好了,代码完成了,运行Run As “Android Project”,结果如下图所示
android,google maps

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经纬度计算两点间距离的公式可以根据不同的需求和精度进行选择。其中一种常用的公式是根据两点间距离公式计算,公式为:距离 = sqrt( (lat2-lat1) * (lat2-lat1) + (lon2-lon1) * (lon2-lon1) )。其中,lat2和lat1分别表示两个点的纬度差,lon2和lon1表示两个点的经度差。这个公式适用于一般的计算,但在ArcGis等软件中,还需要考虑弧度和地球离心率的问题,以提高计算的准确性。\[1\] 另外,还有其他推导过程和公式可以用于经纬度计算两点间距离,比如根据经纬度计算两点之间的距离的公式推导过程以及google.maps的测距函数。这些公式的推导过程可以在网上找到,如果感兴趣的话可以了解一下。\[2\] 总之,根据经纬度计算两点间距离的公式有多种选择,可以根据具体需求和精度要求来选择适合的公式进行计算。 #### 引用[.reference_title] - *1* [计算两个经纬度之间的距离](https://blog.csdn.net/READLEAF/article/details/106896900)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [根据经纬度计算两点之间的距离](https://blog.csdn.net/Gan_1314/article/details/125800224)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [经纬度计算两地之间的距离(原理与方法)](https://blog.csdn.net/u011964285/article/details/40428527)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值