NextBus之显示实时车辆位置信息

要实现的功能如下:首先点击menu会显示两条路线(仅仅做简单的模拟),点击路线之后去下载本条路线实时的车辆信息,并且画在地图上。点击另外一条路线的时候也执行以上操作,并且把原来的图像擦除。

好,我们首先新建一个工程TestActivity,继承与MapActivity,同时在layout的main.xml文件中加上mapview控件

    <com.google.android.maps.MapView 
	    android:clickable="true" 
	    android:layout_width="fill_parent" 
	    android:id="@+id/mapView" 
	    android:layout_height="fill_parent"
	    android:apiKey="0GPDZeAXmGQ3vHfDbNitJWUp-lghBsV8jouMc5g"
    ></com.google.android.maps.MapView>

还有哦,不要忘记在androidmanifest中添加上<uses-library android:name="com.google.android.maps" />,至于权限什么的,多加几条就多加几条吧

	<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
      <uses-permission android:name="android.permission.INTERNET" />
      <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
      <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
      <uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>  
      <uses-permission android:name="android.permission.READ_LOGS"></uses-permission>

好,到此为止,至少打开我们新建的工程能够正常的显示google地图了。

接下来,变量初始化一下

	mapView = (MapView) findViewById(R.id.mapView);
        mapView.setStreetView(true);
        mapView.setBuiltInZoomControls(true);
        mapOverlays = mapView.getOverlays(); 
        myloctionController=mapView.getController();

然后模拟个两条路线吧,在menu里面menu.add(0,0,0,"choose a route");在这个选项的点击响应中添加个函数showroutelist(),routestrings里面当然是放两条路线咯

private void showRouteList() {
		// TODO Auto-generated method stub
		final ArrayList<String> routeStrings=new ArrayList<String>();
		routeStrings.add("1");
		routeStrings.add("10");
		ArrayAdapter<String> adapter=new ArrayAdapter<String>(this, R.layout.item, R.id.textViewId, routeStrings);
		AlertDialog.Builder builder=new AlertDialog.Builder(this);
		builder.setTitle("当前两条路线");
		builder.setAdapter(adapter, new OnClickListener() {
			
			@Override
			public void onClick(DialogInterface dialog, int which) {
				// TODO Auto-generated method stub
				achieveAllDirection(routeStrings.get(which));
			}
		});
		builder.show();

	}

这里得到了我们点击的路线的名称,根据路线名称我们可以下载到路线上所有车子的实时信息,下过来存在一个string中,然后把这个string拿来解析,将获得的数据放在ArrayList<VehicleLocationsData> vehicleLocationsData中把,VehicleLocationsData有多个数据成员,包括汽车的朝向,速度,经纬度等等。

	private void achieveAllDirection(String RouteName) {
		String path="http://webservices.nextbus.com/service/publicXMLFeed?command=vehicleLocations&a=mbta&r="+RouteName+"&t=0";
		
		HttpDownloader hd = new HttpDownloader();//下载实时信息
		String resultStr = hd.download(path);
		//System.out.println(resultStr);
		try{			
			SAXParserFactory factory = SAXParserFactory.newInstance();			                      			XMLReader reader = factory.newSAXParser().getXMLReader();
			VehicleLocationsPrase vehicleLocationsPrase=new VehicleLocationsPrase();
			reader.setContentHandler(vehicleLocationsPrase);
			//开始解析文件
			reader.parse(new InputSource(new StringReader(resultStr)));	
			ArrayList<VehicleLocationsData> temp=vehicleLocationsPrase.getVehicleLocationsDatas();
			
			System.out.println(temp.size());
			if (temp.size()==0) {
				Toast.makeText(mapView.getContext(), "这辆车在这个方向上目前没有实时信息", Toast.LENGTH_LONG );
			}
			else {
				//下载解析好之后开始画图
				afterClickBusOnRoute(temp);
			}
		}
		catch(Exception e){
			e.printStackTrace();
		}
	}

解析之后我们得到了此刻汽车的朝向,经纬度等等信息就能画出车子在路上的位置了。画图的操作是这样的,首先我们要获得两个原始的图像,一个车的图像,一个箭头的图像,因为箭头是要变化的,我们先定义一个矩阵的,然后每次画一个车,就按照保存着的车辆朝向信息来把原始的箭头进行旋转,并且生成一副新的图像。然后把新的箭头位图添加到车辆位图的上面,产生叠加的效果。这里所有的车是一个图层,而每个箭头是单独的一个图层,因为每个图层的图像是要一样的嘛。接下来吧N+1个图层都添加到mapview中就可以了,添加之前记得把原来的先擦除,

private void afterClickBusOnRoute(ArrayList<VehicleLocationsData> vehicleLocationsData) {

		Drawable routeDrawable=getResources().getDrawable(R.drawable.bus);//显示公交路线的图标		
		Bitmap bitmap=BitmapFactory.decodeResource(this.getResources(),R.drawable.arrow);//获得位图
		int w = bitmap.getWidth();// 获得位图宽
		int h = bitmap.getHeight();// 获得位图高
		Matrix matrix = new Matrix();

		final MyOverlay Route_Overlay=new MyOverlay(routeDrawable, this);
		int lat=0,lon=0;
		float a;
		ArrayList<MyOverlay> allArrow=new ArrayList<MyOverlay>();
		
		for (int i = 0; i < vehicleLocationsData.size(); i++) 
		{
			//System.out.println(vehicleLocationsData.get(i).toString());			
			//获得应该旋转的角度
			a=Float.valueOf(vehicleLocationsData.get(i).getHeading());
			matrix.setRotate(a);//利用矩阵旋转
			Bitmap bm2 = Bitmap.createBitmap(bitmap, 0, 0, w, h, matrix, true);
			//获得Drawable对象
			BitmapDrawable bd= new BitmapDrawable(getResources(), bm2);
						
			lat=(int)(Double.parseDouble(vehicleLocationsData.get(i).getLat())*1000000);
			lon=(int)(Double.parseDouble(vehicleLocationsData.get(i).getLon())*1000000);
			GeoPoint point=new GeoPoint(lat,lon);
			
			MyOverlay arrow_Overlay=new MyOverlay(bd,this);	
			OverlayItem overlayitem = new OverlayItem(point, vehicleLocationsData.get(i).getRouteTag(), 
					vehicleLocationsData.get(i).getDirTag()+vehicleLocationsData.get(i).getHeading()+
					vehicleLocationsData.get(i).getHeading());

			Route_Overlay.addOverlay(overlayitem);	
			arrow_Overlay.addOverlay(overlayitem);
			allArrow.add(arrow_Overlay);		
			
		}
		mapOverlays.clear();
		mapOverlays=mapView.getOverlays();
		mapOverlays.add(Route_Overlay);
		//注意图层放置的顺序,先放的在下面
		for (int i = 0; i < allArrow.size(); i++) {
			mapOverlays.add(allArrow.get(i));
		}
		GeoPoint lastpPoint=new GeoPoint(lat, lon );
	    myloctionController.animateTo(lastpPoint);
	    myloctionController.setZoom(13);
	    myloctionController.setCenter(lastpPoint);
	    
	    //mapView.invalidate();

	}


这样就能正常显示车辆的实时路线了。这个里面的MyOverlay是继承与 ItemizedOverlay<OverlayItem>的咯,这个类中继承了一些方法, 其中这个onTap方法就是点击了图标以后会执行的方法。
这个例子中的解析就不具体说了,毕竟每个网页对应的内容都不一样嘛。至于下载这个封装的方法到另外一篇文章里面讲吧

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
显示下一班车到达您设定的公交车站的时间。 一个简单的应用程序,显示在右上角直到下一辆巴士到达您选择的巴士站的分钟数。 为全国68个公交机构服务。 **要查看更多预测,请单击公交车图标** ==================================== NextBus:registered:跟踪服务提供的预测。 此处提供更多信息:http://www.nextbus.com可用于以下公交公司:AC Transit APL Asheville重新定义公交亚特兰大有轨电车-Beta大蓝巴士Brockton地区公交管理局Camarillo(CAT)CCRTA教堂山魅力城市循环器城市学院牛津市西好莱坞市Config Stuff CyRide直流循环器DC街车市区连接市区连接Dumbarton Exp查尔斯河EZRide东卡罗莱纳大学eTrans FAST费尔法克斯(CUE)麓山过境沃思堡T格伦代尔直线铁路黄金海岸过境印第安纳波利斯国际机场杰克逊维尔拉瓜迪亚机场员工拉瓜迪亚机场班车洛杉矶地铁洛杉矶地铁MBTA麻省理工学院Moorpark过境纽瓦克自由国际机场新星Omnitrans帕洛斯维德斯过境SRIA普利茅斯州立大学波特兰有轨电车乔治王子县RTC乘车,里诺拉德福德过境罗斯福岛Rutgers纽瓦克航天飞机Rutgers SEPTA SF蒙尼西雅图有轨电车Simi谷(SVT)熔岩 l索诺玛县过境Tahoe TART千橡市过境多伦多TTC Unitrans加州大学伯克利分校加利福尼亚大学旧金山分校马里兰大学文图拉分校(VCTC)西肯塔基大学温斯顿·塞勒姆约克学院 支持语言:English
以下是一个示例代码,可以将名为“车辆信息.txt”的文件车辆信息读入到链表: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define N 20 // 定义字符串数组长度 // 定义车辆信息结构体 struct chexinxi { char chexinghao[N]; char chepaihao[N]; struct chexinxi *next; }; // 全局变量,指向车辆信息链表头 struct chexinxi *head = NULL; // 将车辆信息从文件读取到链表的函数 void readFromFile(char *filename) { FILE *fp = fopen(filename, "r"); if (fp == NULL) { printf("打开文件失败!\n"); exit(1); } char chexinghao[N]; char chepaihao[N]; // 逐行读取文件内容 while (fscanf(fp, "%s %s", chexinghao, chepaihao) != EOF) { // 创建新的车辆信息结构体,并为其分配内存 struct chexinxi *new_node = (struct chexinxi*)malloc(sizeof(struct chexinxi)); if (new_node == NULL) { printf("分配内存失败!\n"); exit(1); } // 将读取到的车辆信息存入新的结构体 strcpy(new_node->chexinghao, chexinghao); strcpy(new_node->chepaihao, chepaihao); new_node->next = NULL; // 将新的结构体插入到链表末尾 if (head == NULL) { head = new_node; } else { struct chexinxi *p = head; while (p->next != NULL) { p = p->next; } p->next = new_node; } } fclose(fp); } int main() { char filename[] = "车辆信息.txt"; readFromFile(filename); // 遍历链表,输出所有车辆信息 struct chexinxi *p = head; while (p != NULL) { printf("%s %s\n", p->chexinghao, p->chepaihao); p = p->next; } return 0; } ``` 这个示例代码,定义了一个名为“chexinxi”的结构体,用于存储车辆信息。在`readFromFile`函数,通过逐行读取文件内容的方式,将每一辆车的车型号和车牌号读取到两个字符串数组,然后创建新的车辆信息结构体,并为其分配内存。接着,将读取到的车型号和车牌号存入新的结构体,并将新的结构体插入到链表末尾。 在`main`函数,调用`readFromFile`函数将文件车辆信息读入到链表,然后遍历链表,输出所有车辆信息

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值