• 基于Android的手机导航系统设计与实现


    目 录

    摘 要 I
    Abstract II
    第一章 绪 论 1
    1.1 课题来源 1
    1.2 研究背景和存在问题 1
    1.2.1 手机导航背景 1
    1.2.2 手机导航面临的问题 2
    1.3 研究目标和方法 2
    1.3.1 研究的目标 2
    1.3.2 研究的方法 3
    1.4 本文的内容安排 4

    第二章 手机导航软件现状和各种技术选择依据 6
    2.1手机导航的发展和未来 6
    2.2 Google Maps的选择 7
    2.3 Android 技术选择 9
    2.3.1开发背景 9
    2.3.2 android平台和其他平台比较 10
    2.3.3 选择依据 13
    2.4 本章小结 14

    第三章 需求分析 15
    3.1 功能性需求分析 15
    3.1.1 地图管理 15
    3.1.2 轨迹管理 16
    3.1.3规划导航路径 17
    3.1.4远程跟踪监视 18
    3.2 界面需求分析 18
    3.3数据存储需求 19
    3.4 环境需求 20
    3.5本章小结 20

    第四章 Android手机导航的总体设计 21
    4.1 系统功能模块划分 21
    4.2 系统架构设计 22
    4.3用户界面设计 23
    4.4 本章小结 25

    第五章 数据存储设计 27
    5.1数据存储设计原理 27
    5.2数据库存储实现 27
    5.2.1 数据库和数据表的创建和打开 27
    5.2.2 对数据表的操作 31
    5.3 使用SharePreference存储 33
    5.3 本章小结 34

    第六章 系统子模块的设计和实现 35
    6.1地图管理模块的实现 35
    6.1.1 在线地图 35
    6.2.2 任意界面的缩放 36
    6.2.3 随时定位个人位置 37
    6.2.4 调整地图偏移 38
    6.2.5 保持跟踪 39
    6.2轨迹管理模块的实现 39
    6.2.1 新建跟踪记录 39
    6.2.2 地图展示 40
    6.2.3 查询以往轨迹 42
    6.2.4 显示轨迹信息 43
    6.3 规划导航路径模块实现 43
    6.3.1 已知经纬度查询 43
    6.3.2 地址反查 44
    6.3.3规划导航路径 45
    6.4本章小结 45
    第七章 系统测试 46
    7.1地图管理模块测试 46
    7.1.1 在线地图 46
    7.1.2 地图的缩放 47
    7.1.3 定位个人位置 47
    7.1.4 保持跟踪 48
    7.1.5 调整地图偏移 48
    7.2轨迹管理模块测试 49
    7.2.1 新建跟踪界面 49
    7.2.2 显示过往所有轨迹 49
    7.2.3 地图展示轨迹 50
    7.2.4 路径信息 50
    7.3 规划导航模块测试 51
    7.3.1 经纬度查询 51
    7.3.2 地址查询 51
    7.3.3 选择地图模式 52
    7.3.4调用手机内置地图规划导航路径 52
    7.4 本章小结 53
    结论 54
    总结 54
    展望 54
    参考文献 56
    致谢 58
    1.3研究目标和方法
    1.3.1研究的目标
    本系统的主要功能包括手机实时定位,指定地点的寻址,规划导航路径,个人位置跟踪、监视、展示的应用程序。
    一、地图管理
    1.在线地图
    2.离线地图(SQLite 数据库存储)
    3.任意界面的地图缩放
    4.随时定位个人位置
    5.调整地图偏移
    6.保持跟踪,随时显示
    二、轨迹管理

    1. 记录跟踪轨迹,存储数据
    2. 导入导出数据文件
    3. 读取轨迹记录,并显示在地图上
    4. 显示各个轨迹的时间、距离、平均速度等信息
    5. 查看以往所有轨迹
      三、规划导航路径
    6. 已知经纬度查询
    7. 输入地址的反查
    8. 调用手机内置地图规划导航路径
      四、远程跟踪监视
    9. 连接服务器
    10. 传递位置信息到服务器
      1.3.2研究的方法
      本文的目标结合Google Maps 位置服务针对手机实时定位[7],指定地点的寻址,规划导航路径,个人位置跟踪、监视、展示等方面来设计基于Android平台的GPS导航系统。
      系统设计主要研究方法:
      1.已知经纬度的查询
      用户只需输入目的地的坐标,通过GeoPoint的定位,就可以在MapView
      上显示目的地的正确位置。
      2.指定地点的寻址
      通过EditText接受User输入欲寻找的地址,再利用Google提供的Geocoder无误来取得该地址的GeoPoint,接着取出GeoPoint对象之后,便可通过方才开发好的自定义函数,更新Google Map的内容。
      3.规划导航路径
      在正式版的Android SDK 中,删除了原有M5版本的DrivingDirection package,所以无法通过程序来规划导航路径,但可以调用手机内置的地图程序来传递导航坐标规划路径。
      4.个人的位置跟踪、记录、展示
      创建一个新的跟踪,然后后台启动Service,定时读取GPS数据获得用户目前所在的位置信息,将其存入数据库中;用户可以选择以往的跟踪记录,将其轨迹显示在Map上,由此可以记录用户去过的位置。
      5.远程跟踪
      连接远程服务器,后台启动Service,定时上传用户的位置,将其存入服务器端数据库;服务器端可随时查看用户手机位置,和以往用户的跟踪记录。
      1.4 本文的内容安排
      本文共分7章
      第一章 阐述了课题的来源,选题的背景、存在的问题和研究的目标、方法。
      第二章 剖析了手机导航软件的现状和本系统各种技术选择的依据。
      第三章 提出了系统的需求分析,包括功能分析,界面需求分析,数据存储需求,还有环境需求。
      第四章 介绍了手机导航的总体设计思路,系统功能模块,系统总体架构设计,系统的界面设计等。
      第五章 详细的研究了数据存储的设计,包括数据存储设计的原理、数据存储的实现和文件存储。
      第六章 分块实现了系统的各项功能,以及详细的设计过程。
      第七章 展示了系统的测试结果,及对结果的分析。
      本文的目标结合Google Maps 位置服务针对手机实时定位,指定地点的寻址,规划导航路径,本文转载自http://www.biyezuopin.vip/onews.asp?id=12818个人位置跟踪、监视、展示等方面来设计基于Android平台的GPS导航系统。
      系统设计主要围绕下列几项用户需求展开:
      3.1.1 地图管理
      1.在线地图
      2.离线地图(SQLite 数据库存储)
      3.任意界面的地图缩放
      4.随时定位个人位置
      5.调整地图偏移
      6.保持跟踪,随时显示
    package com.xlkj.gps;
    
    import java.util.List;
    
    import com.xlkj.gps.R;
    import com.xlkj.gps.maps.db.DAO;
    import com.xlkj.gps.maps.db.GeoBookmark;
    import com.xlkj.gps.maps.ui.AddBookmarkDialog;
    import com.xlkj.gps.maps.ui.OnDialogClickListener;
    
    
    import android.app.AlertDialog;
    import android.app.ListActivity;
    import android.content.Context;
    import android.content.DialogInterface;
    import android.content.Intent;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.AdapterView;
    import android.widget.BaseAdapter;
    import android.widget.LinearLayout;
    import android.widget.TextView;
    import android.widget.AdapterView.OnItemLongClickListener;
    
    public class AllGeoBookmarks extends ListActivity {
    
    	private static final String BOOKMARK_DATA = "bookmark";
    	private List geoBookmarks;
    
    	@Override
    	public void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setData();
    	}
    
    	private void setData() {
    		DAO dao = new DAO(this);
    		geoBookmarks = dao.getBookmarks();
    		setListAdapter(new GeoBookmarkListAdapter(this));
    		getListView().setOnItemLongClickListener(new OnItemLongClickListener(){
    
    			public boolean onItemLongClick(AdapterView parent, View view,
    					int position, long id) {
    				Intent intent = new Intent();
    				intent.putExtra(BOOKMARK_DATA, geoBookmarks.get(position));
    				setResult(RESULT_OK,intent);
    				finish();
    				return false;
    			}
    			
    		});
    	}
    
    	/**
    	 * Создает элементы меню
    	 */
    	@Override
    	public boolean onCreateOptionsMenu(Menu menu) {
    		super.onCreateOptionsMenu(menu);
    		menu.add(0, 0, 0, R.string.EDIT_MENU).setIcon(R.drawable.edit);
    		menu.add(0, 1, 0, R.string.DELETE_MENU).setIcon(R.drawable.delete);
    		return true;
    	}
    
    	@Override
    	public boolean onPrepareOptionsMenu(Menu menu) {
    		boolean isSelected = this.getSelectedItemId() >= 0;
    		menu.findItem(0).setEnabled(isSelected);
    		menu.findItem(1).setEnabled(isSelected);
    		return true;
    	}
    
    	@Override
    	public boolean onOptionsItemSelected(MenuItem item) {
    		final int bookmarkId = (int) this.getSelectedItemId();
    
    		switch (item.getItemId()) {
    		case 0: // edit
    
    			AddBookmarkDialog.show(AllGeoBookmarks.this, 
    					geoBookmarks.get(bookmarkId), new OnDialogClickListener() {
    
    				@Override
    				public void onCancelClick() {
    
    				}
    
    				@Override
    				public void onOkClick(Object obj) {
    					GeoBookmark geoBookmark = (GeoBookmark) obj;
    					DAO d = new DAO(AllGeoBookmarks.this);
    					d.saveGeoBookmark(geoBookmark);
    					setData();
    				}
    			});
    
    			break;
    
    		case 1: // delete
    			new AlertDialog.Builder(this).setTitle(R.string.REMOVE_BOOKMARK_TITLE)
    					.setMessage(R.string.REMOVE_BOOKMARK_MESSAGE)
    					.setPositiveButton(R.string.YES_LABEL,
    							new DialogInterface.OnClickListener() {
    								public void onClick(DialogInterface dialog,
    										int whichButton) {
    									DAO dao = new DAO(AllGeoBookmarks.this);
    									dao.removeGeoBookmark(geoBookmarks.get(bookmarkId).getId());
    									setData();
    								}
    							}).setNegativeButton(R.string.NO_LABEL, null).show();
    			break;
    		default:
    			break;
    		}
    
    		return true;
    	}
    
    	private class GeoBookmarkListAdapter extends BaseAdapter {
    
    		public GeoBookmarkListAdapter(Context context) {
    			mContext = context;
    		}
    
    		public int getCount() {
    			return geoBookmarks.size();
    		}
    
    		public Object getItem(int position) {
    			return position;
    		}
    
    		public long getItemId(int position) {
    			return position;
    		}
    
    		public View getView(int position, View convertView, ViewGroup parent) {
    			GeoBookmarkView sv;
    			GeoBookmark bookmark = geoBookmarks.get(position);
    			if (convertView == null) {
    				sv = new GeoBookmarkView(mContext, bookmark.getName(), bookmark.getDescription());
    			} else {
    				sv = (GeoBookmarkView) convertView;
    				sv.setName(bookmark.getName());
    				sv.setDescription(bookmark.getDescription());
    				sv.id = bookmark.getId();
    			}
    			return sv;
    		}
    
    		private Context mContext;
    
    	}
    
    	public class GeoBookmarkView extends LinearLayout {
    		public GeoBookmarkView(Context context, String name, String description) {
    			super(context);
    			View v = View.inflate(AllGeoBookmarks.this, R.layout.geobookmark, null);
    			nameLabel = (TextView) v.findViewById(android.R.id.text1);
    			nameLabel.setText(name);
    
    			descriptionLabel = (TextView) v.findViewById(android.R.id.text2);
    			descriptionLabel.setText(description);
    			addView(v);
    		}
    
    		public void setName(String name) {
    			descriptionLabel.setText(name);
    		}
    
    		public void setDescription(String description) {
    			descriptionLabel.setText(description);
    		}
    
    		protected long id;
    
    		private TextView nameLabel;
    		private TextView descriptionLabel;
    	}
    
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • 113
    • 114
    • 115
    • 116
    • 117
    • 118
    • 119
    • 120
    • 121
    • 122
    • 123
    • 124
    • 125
    • 126
    • 127
    • 128
    • 129
    • 130
    • 131
    • 132
    • 133
    • 134
    • 135
    • 136
    • 137
    • 138
    • 139
    • 140
    • 141
    • 142
    • 143
    • 144
    • 145
    • 146
    • 147
    • 148
    • 149
    • 150
    • 151
    • 152
    • 153
    • 154
    • 155
    • 156
    • 157
    • 158
    • 159
    • 160
    • 161
    • 162
    • 163
    • 164
    • 165
    • 166
    • 167
    • 168
    • 169
    • 170
    • 171
    • 172
    • 173
    • 174
    • 175
    • 176
    • 177
    • 178
    • 179
    • 180
    • 181
    • 182
    • 183
    • 184
    • 185

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    第五届“传智杯”全国大学生计算机大赛(练习赛) [传智杯 #5 练习赛] 复读
    Prometheus抓取springBoot指标并grafana可视化
    提升汽车APP用户体验,火山引擎APMPlus的“独家秘笈”
    二刷力扣--哈希表
    .Net C# 发送带背景图html邮件(解决Outlook不显示背景图问题)
    WebSocket的那些事(5-Spring STOMP支持之连接外部消息代理)
    harbor网桥修复 产生了多个br-设备
    L72.linux命令每日一练 -- 第十章 Linux网络管理命令 -- mail和nslookup
    解决websocket使用@Autowired、@Value获取值为null解决方法
    博客记录生活
  • 原文地址:https://blog.csdn.net/sheziqiong/article/details/127443318