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

本文探讨了基于Android平台的GPS导航系统设计,重点介绍了手机导航软件现状、Google Maps的选择、关键技术选型,以及系统需求分析、功能模块设计、数据存储和测试。通过Google Maps API实现定位、寻址、路径规划和位置跟踪功能,适用于实时导航和个人位置监控。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目 录

摘 要 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<GeoBookmark> 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;
	}

}

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shejizuopin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值