安卓开发google地图天地图开发

&&&&&&&&&&&&天地图·移动API(Android)V2.0版 使用说明
正在努力加载播放器,请稍等…
正在努力加载播放器
大小:1.26MB&&所需金币:50
&& & 金币不足怎么办?
下载量:-次 浏览量:658次
贡献时间: 23:00:00
文档标签:
已有-位用户参与评分
同类热门文档
你可能喜欢
看过这篇文档的还看过
阅读:2804&&下载:18
阅读:143&&下载:6
阅读:481&&下载:3
阅读:283&&下载:2
阅读:114&&下载:2
阅读:273&&下载:2
阅读:180&&下载:1
阅读:210&&下载:0
阅读:79&&下载:0
阅读:164&&下载:0
该用户的其他文档
所需财富值:
50文件大小:1.26MB
您当前剩余财富值:&&
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
举报该文档侵犯版权。
例: /help.shtml对天地图移动API各方面的信息进行简单介绍,使您对其有一个快速全面的了解。
详细介绍天地图移动API中的每一个类,及其拥有的所有属性和方法。
形象、直观的展示各种天地图移动API应用接口的实现效果,便于您的使用。
提供天地图移动API相关的所有文档资料、开发包及示例包的下载,方便查阅。
地址:北京市海淀区莲花池西路28号
邮编:100830
电话:010-
QQ群:;;&  ͟
天地图移动API(Android)v3.0版(以下简称天地图移动API)是一套基于Android2.2及以上版本设备的应用程序接口,以jar包的形式提供各种地图服务和数据,如地图展示、标注、定位等等。使用天地图移动API开发包可以轻松地构建各类功能丰富、交互性强的地图应用程序。
天地图移动API(Android)v3.0版具有以下特点:
1. 接口完备,迁移方便,让您轻松开发各类应用。
2. 地图载入速度快,使用顺畅。
3. 拥有GPS、网络等多种定位方式,定位更准确。
4. 提供覆盖全球、数据精细的矢量地图和影像地图。
5. 提供海量权威POI信息,并支持多种POI搜索方式。详解android studio百度地图开发教程(百度地图API使用教程)
新建一个BaiduMapDemo项目
一直点Next,创建之后,点击右侧工具栏Gradle,发现是空的。
这时候,我们运行一下app。然后刷新一下Gradle projects发现里面有项目了。Gradle→BaiduMapDemo→Tasks→android→signingReport,再点击右下角的Gradle Console,可以查到SHA1指纹。(每个人的SHA1指纹是不一样的)
接下来,我们需要申请一个百度地图API,打开浏览器或者打开百度搜索”百度地图API”进入官网。进入之后,点击申请密钥。(需要注册账号 )
点击创建应用。输入应用名称BaiduMapDemo,应用类型选择Android SDK,发布版SHA1和开发版SHA1,我们都可以填之前获取的SHA1指纹。
提交创建成功之后,我们就可以看见我们申请到的API Key。光有这个是不够的,我们还需要准备好百度LBS开放平台的SDK。下载地址:,这里我们需要,基础定位和基础地图两个功能的SDK,点击“开发包”进行下载。
下载完成之后,对该压缩包解压,里面有一个libs目录,这里面的内容分两部分,BaiduLBS_Android.jar这个文件是jar文件,其他的是so文件,因为这些文件都是百度已经封装好了,我们只需要将libs目录下的没一个文件放置在正确的位置。
打开android studio的BaiduMapDemo项目,点击project,可以看见app模块下面有一个libs目录,这里用来存放jar包,我们将刚才下载的BaiduLBS_Android.jar复制到这个文件夹下。然后展开,src/main目录,右击main→New→Directory,创建一个名为jniLibs的文件夹,这里是专门存放so文件的,然后把压缩包里的其他5个文件直接复制到这里。
这里我们直接将jar包复制libs目录下,没有修改gradle文件,所以不会弹出我们平时熟悉的Sync Now提示。因此这时候,我们需要手动点击android studio顶部工具栏的Sync按钮,不然,项目无法引用jar包中提供的接口。 然后我们会发现,libs目录下的BaiduLBS_Android.jar文件多了一个向右的小三角形,这就表示,现在项目可以引用这些jar包了。
现在LBS的SDK都准备好了,就可以开始写代码了。
一:确定自己的位置的经纬度
activity_main.xml代码
&?xml version="1.0" encoding="utf-8"?&
xmlns:android="/apk/res/android"
android:id="@+id/activity_main"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"&
android:id="@+id/position_text_view"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:visibility="gone"/&
android:id="@+id/bmapView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true"/&
修改AndroidManifest.xml文件中的代码:
&?xml version="1.0" encoding="utf-8"?&
xmlns:android="/apk/res/android"
package="com.example.ivan_keung.baidumapdemo"&
android:name="android.permission.ACCESS_COARSE_LOCATION"/&
android:name="android.permission.ACCESS_FINE_LOCATION"/&
android:name="android.permission.ACCESS_WIFI_STATE"/&
android:name="android.permission.ACCESS_NETWORK_STATE"/&
android:name="android.permission.CHANGE_WIFI_STATE"/&
android:name="android.permission.READ_PHONE_STATE"/&
android:name="android.permission.WRITE_EXTERNAL_STORAGE"/&
android:name="android.permission.INTERNET"/&
android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/&
android:name="android.permission.WAKE_LOCK"/&//都是百度地图需要的授权
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme"&
android:name="com.baidu.lbsapi.API_KEY"
android:value="eQG7xRsSCFRxDxgFEL90wI5lzaccs2jf"/&//申请的API Key
android:name=".MainActivity"&
android:name="android.intent.action.MAIN" /&
android:name="android.intent.category.LAUNCHER" /&
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote"&//LBS SDK中的服务
MainActivity中的代码:
package com.example.ivan_keung.
import android.M
import android.content.pm.PackageM
import android.os.B
import android.support.annotation.NonN
import android.support.v4.app.ActivityC
import android.support.v4.content.ContextC
import android.support.v7.app.AppCompatA
import android.widget.TextV
import android.widget.T
import com.baidu.location.BDL
import com.baidu.location.BDLocationL
import com.baidu.location.LocationC
import com.baidu.location.LocationClientO
import com.baidu.mapapi.SDKI
import com.baidu.mapapi.map.BaiduM
import com.baidu.mapapi.map.MapStatusU
import com.baidu.mapapi.map.MapStatusUpdateF
import com.baidu.mapapi.map.MapV
import com.baidu.mapapi.map.MyLocationD
import com.baidu.mapapi.model.LatL
import java.util.ArrayL
import java.util.L
public class MainActivity extends AppCompatActivity {
public LocationClient mLocationC
private TextView positionT
private MapView mapV
private BaiduMap baiduM
private boolean isFirstLocate=true;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLocationClient=new LocationClient(getApplicationContext());
mLocationClient.registerLocationListener(new MyLocationListener());
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
mapView= (MapView) findViewById(R.id.bmapView);
baiduMap=mapView.getMap();
baiduMap.setMyLocationEnabled(true);
positionText= (TextView) findViewById(R.id.position_text_view);
List&String& permissionList=new ArrayList&&();
if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION)!= PackageManager.PERMISSION_GRANTED){
permissionList.add(Manifest.permission.ACCESS_FINE_LOCATION);
if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_PHONE_STATE)!= PackageManager.PERMISSION_GRANTED){
permissionList.add(Manifest.permission.READ_PHONE_STATE);
if(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED){
permissionList.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
if(!permissionList.isEmpty()){
String[]permissions=permissionList.toArray(new String[permissionList.size()]);
ActivityCompat.requestPermissions(MainActivity.this,permissions,1);
requestLocation();
private void requestLocation(){
initLocation();
mLocationClient.start();
private void navigateTo(BDLocation location){
if(isFirstLocate){
LatLng ll=new LatLng(location.getLatitude(),location.getLongitude());
MapStatusUpdate update= MapStatusUpdateFactory.newLatLng(ll);
baiduMap.animateMapStatus(update);
update=MapStatusUpdateFactory.zoomTo(16f);
baiduMap.animateMapStatus(update);
isFirstLocate=false;
MyLocationData.Builder locationBuilder=new MyLocationData.Builder();
locationBuilder.latitude(location.getLatitude());
locationBuilder.longitude(location.getLongitude());
MyLocationData locationData=locationBuilder.build();
baiduMap.setMyLocationData(locationData);
private void initLocation() {
LocationClientOption option=new LocationClientOption();
option.setScanSpan(5000);
option.setIsNeedAddress(true);
option.setLocationMode(LocationClientOption.LocationMode.Device_Sensors);
mLocationClient.setLocOption(option);
protected void onResume() {
super.onResume();
mapView.onResume();
protected void onPause() {
super.onPause();
mapView.onPause();
protected void onDestroy() {
super.onDestroy();
mLocationClient.stop();
mapView.onDestroy();
baiduMap.setMyLocationEnabled(false);
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode){
if(grantResults.length&0){
for(int result:grantResults){
if(result!=PackageManager.PERMISSION_GRANTED){
Toast.makeText(this,"必须同意所有权限才能使用本程序",Toast.LENGTH_LONG).show();
requestLocation();
Toast.makeText(this,"发生未知错误",Toast.LENGTH_LONG).show();
public class MyLocationListener implements BDLocationListener {
public void onReceiveLocation(BDLocation location) {
if(location.getLocType()==BDLocation.TypeGpsLocation||location.getLocType()==BDLocation.TypeNetWorkLocation){
navigateTo(location);
写的应该还算比较详细了,如果有什么疑问,可以留言,我们一起学习,一起进步。
看过本文的人也看了:
我要留言技术领域:
取消收藏确定要取消收藏吗?
删除图谱提示你保存在该图谱下的知识内容也会被删除,建议你先将内容移到其他图谱中。你确定要删除知识图谱及其内容吗?
删除节点提示无法删除该知识节点,因该节点下仍保存有相关知识内容!
删除节点提示你确定要删除该知识节点吗?博客分类:
前一阵子我们物联网编程课老师要求班上每个人都要做一个地图应用,说是要利用起来安卓的GPS信息什么什么的……不过昨晚后觉得这根本就是在学Android开发嘛。。。
之前接触过一点安卓,也有JAVA基础,所以这次做东西还是比较快的,虽然已钱没有做过类似应用(其实都没有做过什么安卓应用),两天下来差不多把老师的要求都实现了,今天也顺利通过验收了。地图API我选的是百度的,支持国产~哈~全部的文件上传到附件了,有需要的同学可以下载~~
先看下Logo~哈~
按照百度地图开发者文档的指示一步一步做还是很顺利的~里面说的很清楚,我就直接贴代码了:
package com.micro.
import android.app.AlertD
import android.content.I
import android.location.L
import android.os.B
import android.view.KeyE
import android.view.M
import android.view.MenuI
import android.view.MotionE
import android.view.V
import android.view.View.OnClickL
import android.view.View.OnTouchL
import android.widget.B
import android.widget.T
import android.widget.ToggleB
import com.baidu.mapapi.BMapM
import com.baidu.mapapi.GeoP
import com.baidu.mapapi.LocationL
import com.baidu.mapapi.MKLocationM
import com.baidu.mapapi.MapA
import com.baidu.mapapi.MapC
import com.baidu.mapapi.MapV
import com.baidu.mapapi.MyLocationO
public class MyMapActivity extends MapActivity {
public static BMapManager mBMapMan =
private MKLocationManager mLocationM
private static MyLocationOverlay myLocationO
private MapController mMapC
// 位置变化监听器
private MyLocationL
static MapView mMapV
// 卫星视图、交通视图按键
private ToggleButton WX_But, JT_But, FL_B
// 返回自己位置按键
private Button Return_B
// 按键监听器
private OnClickListener wx_but_
private OnClickListener jt_but_
private OnClickListener fl_but_
private OnClickListener Re_L
// 我的位置
protected static GeoPoint myL
// 地图是否随位置变化而变化
private boolean isFollow =
// 是否是第一次定位
private boolean isFirst =
// 退出事件监听器
private ExitButL
// 标注点的数量
private int Pnum = 0;
private boolean ceFlag =
protected GeoPoint FirP;
protected GeoPoint SecP;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
* 初始化地图
mBMapMan = new BMapManager(getApplication());
mBMapMan.init("百度KEY", null);// KEY
super.initMapActivity(mBMapMan);
mMapView = (MapView) findViewById(R.id.bmapsView);
// 初始化位置监听器
mllis = new MyLocationListener();
mLocationManager = mBMapMan.getLocationManager();
// 注册位置更新事件
mLocationManager.requestLocationUpdates(mllis);
// 优先使用用GPS定位
mLocationManager
.enableProvider((int) MKLocationManager.MK_GPS_PROVIDER);
mLocationManager.setNotifyInternal(3, 1);
// 优先使用网络来定位
// mLocationManager.enableProvider((int)MKLocationManager.MK_NETWORK_PROVIDER);
// 添加定位图层
myLocationOverlay = new MyLocationOverlay(this, mMapView);
// 注册GPS位置更新的事件,让地图能实时显示当前位置
myLocationOverlay.enableMyLocation();
// 开启磁场感应传感器
myLocationOverlay.enableCompass();
mMapView.getOverlays().add(myLocationOverlay);
// 设置在缩放动画过程中也显示overlay,默认为不绘制
mMapView.setDrawOverlayWhenZooming(true);// 在缩放的时候显示覆盖物
mMapView.setBuiltInZoomControls(true); // 设置启用内置的缩放控件
mMapController = mMapView.getController(); // 得到mMapView的控制权,可以用它控制和驱动平移和缩放
// GeoPoint point = new GeoPoint((int) (39.915 * 1E6),
// (int) (116.404 * 1E6)); // 用给定的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6) 天,安。门坐标
mMapController.setZoom(12); // 设置地图zoom级别
mMapView.setSatellite(false);// 设置卫星视图
mMapView.setTraffic(false);// 设置交通状况视图
// mMapView.getOverlays().add(new MyOverlay());// 在地图上添加自己设置的覆盖物
// 初始化按键及监听器
WX_But = (ToggleButton) findViewById(R.id.WX_But);
JT_But = (ToggleButton) findViewById(R.id.JT_But);
FL_But = (ToggleButton) findViewById(R.id.FL_But);
Return_But = (Button) findViewById(R.id.ReturnMyPlace);
// 卫星视图按键监听器
wx_but_lis = new OnClickListener() {
public void onClick(View v) {
if (WX_But.isChecked()) {
mMapView.setSatellite(true);
mMapView.setSatellite(false);
WX_But.setOnClickListener(wx_but_lis);
// 交通视图按键监听器
jt_but_lis = new OnClickListener() {
public void onClick(View v) {
if (JT_But.isChecked()) {
mMapView.setTraffic(true);
mMapView.setTraffic(false);
JT_But.setOnClickListener(jt_but_lis);
// 地图跟随按键监听器
fl_but_lis = new OnClickListener() {
public void onClick(View v) {
if (JT_But.isChecked()) {
isFollow =
isFollow =
FL_But.setOnClickListener(fl_but_lis);
// 返回我的位置按钮监听器
Re_Lis = new OnClickListener() {
public void onClick(View v) {
if (myLocation == null) {
DisplayToast("暂未获取到位置信息~");
mMapController.setZoom(15);
mMapController.animateTo(myLocation); // 设置地图中心点
Return_But.setOnClickListener(Re_Lis);
exitlis = new ExitButLinstener();
mMapView.setOnTouchListener(new OnTouchListener() {
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
if (ceFlag)
if (event.getAction() == MotionEvent.ACTION_DOWN) {
if (Pnum == 0) {
System.out.println("第一次");
FirP = mMapView.getProjection().fromPixels(
(int) event.getX(), (int) event.getY());
mMapView.getOverlays().add(new PointOverLay(FirP));
} else if (Pnum == 1) {
System.out.println("第二次");
SecP = mMapView.getProjection().fromPixels(
(int) event.getX(), (int) event.getY());
mMapView.getOverlays().add(new PointOverLay(SecP));
mMapView.getOverlays().add(
new LineOverLay(FirP, SecP));
Distence dis = new Distence();
double dist = dis.GetShortDistance(
FirP.getLongitudeE6(),
FirP.getLatitudeE6(),
SecP.getLongitudeE6(), SecP.getLatitudeE6());
DisplayToast("距离为" + ((int) dist / 1000000) + "米");
DisplayToast("请清空后继续测量");
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
protected void onDestroy() {
if (mBMapMan != null) {
mBMapMan.destroy();
mBMapMan =
super.onDestroy();
protected void onPause() {
if (mBMapMan != null) {
// 移除listener
mBMapMan.getLocationManager().removeUpdates(mllis);
mBMapMan.stop();
super.onPause();
protected void onResume() {
if (mBMapMan != null) {
// 注册Listener
mBMapMan.getLocationManager().requestLocationUpdates(mllis);
mBMapMan.start();
super.onResume();
* 根据MyLocationOverlay配置的属性确定是否在地图上显示当前位置
protected boolean isLocationDisplayed() {
return myLocationOverlay.isMyLocationEnabled();
// @Override
// public boolean onCreateOptionsMenu(Menu menu) {
// // 调用父类方法来加入系统菜单
// // 虽然目前android还没有系统菜单,但是为了兼容到以后的版本,最好加上
// super.onCreateOptionsMenu(menu);
// // 添加菜单项(多种方式)
// // 1.直接指定标题
// menu.add("菜单项1");
// // 2.通过资源指定标题
// menu.add(R.string.jiaotong);
// // 3.显示指定菜单项的组号、ID、排序号、标题
// menu.add(1, // 组号
// Menu.FIRST, // 唯一的ID号
// Menu.FIRST, // 排序号
// "菜单项3"); // 标题
// // 如果希望显示菜单,请返回true
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
// 添加4个菜单项,分成2组
int group1 = 1;
int gourp2 = 2;
int gourp3 = 3;
menu.add(group1, 1, 1, "地图查询");
menu.add(group1, 2, 2, "线路搜索");
menu.add(gourp2, 3, 3, "距离测量");
menu.add(gourp2, 4, 4, "地图复位");
menu.add(gourp3, 5, 5, "关于软件");
menu.add(gourp3, 6, 6, "退出应用");
// 显示菜单
public boolean onOptionsItemSelected(MenuItem item) {
Intent intent =
switch (item.getItemId()) {
// 响应每个菜单项(通过菜单项的ID)
// do something here
// DisplayToast("地图查询");
intent = new Intent(MyMapActivity.this, SearchActivity.class);
this.startActivity(intent);
// do something here
// DisplayToast("线路搜索");
intent = new Intent(MyMapActivity.this, RoutePlan.class);
this.startActivity(intent);
// do something here
// DisplayToast("距离测量");
clearMap();
// do something here
DisplayToast("地图复位");
clearMap();
JT_But.setChecked(false);
mMapView.setTraffic(false);
WX_But.setChecked(false);
mMapView.setSatellite(false);
FL_But.setChecked(false);
isFollow =
mMapController.setZoom(15);
if (myLocation != null)
mMapController.animateTo(myLocation);
// do something here
DisplayToast("关于软件");
new AlertDialog.Builder(this).setTitle("关于软件")
.setMessage("制作:中南大学——李众力\n谢谢使用本软件~O(∩_∩)O~")
.setPositiveButton("确定", null).show();
// do something here
// DisplayToast("退出应用");
new AlertDialog.Builder(this).setTitle("确认退出")
.setMessage("是否退出本应用?").setPositiveButton("是", exitlis)
.setNegativeButton("否", null).show();
// 对没有处理的事件,交给父类来处理
return super.onOptionsItemSelected(item);
// 返回true表示处理完菜单项的事件,不需要将该事件继续传播下去了
// 显示提示
public void DisplayToast(String str) {
Toast.makeText(this, str, Toast.LENGTH_SHORT).show();
// 将当前位置转换成地理坐标点
public GeoPoint Lo2Gp(Location location) {
if (location == null)
return new GeoPoint((int) (location.getLatitude() * 1000000),
(int) (location.getLongitude() * 1000000));
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
AlertDialog.Builder build = new AlertDialog.Builder(this);
build.setTitle("注意").setMessage("确定要退出吗?")
.setPositiveButton("确定", exitlis)
.setNegativeButton("取消", null).show();
// return super.onKeyDown(keyCode, event);
// 清除多余overlay方法
public static void clearMap() {
mMapView.getOverlays().clear();
mMapView.getOverlays().add(myLocationOverlay);
* 内部类,实现位置变化监听
* @author Micro
class MyLocationListener implements LocationListener {
* 位置变化监听器
public void onLocationChanged(Location location) {
System.out.println("位置变化!\n");
if (location != null) {
// 将当前位置转换成地理坐标点
final GeoPoint pt = new GeoPoint(
(int) (location.getLatitude() * 1000000),
(int) (location.getLongitude() * 1000000));
myLocation =
if (isFirst) {
mMapController.setZoom(15);
mMapController.animateTo(myLocation);
if (isFollow) {
mMapController.animateTo(myLocation);
界面的xml文件:
&?xml version="1.0" encoding="utf-8"?&
&LinearLayout xmlns:android="/apk/res/android"
xmlns:tools="/tools"
android:id="@+id/LinearLayout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" &
&RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" &
&com.baidu.mapapi.MapView
android:id="@+id/bmapsView"
android:layout_width="fill_parent"
android:layout_height="400dp"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:clickable="true" &
&/com.baidu.mapapi.MapView&
android:id="@+id/ReturnMyPlace"
style="?android:attr/buttonStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:text="@string/returnMyP" /&
&/RelativeLayout&
&RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent" &
&ToggleButton
android:id="@+id/JT_But"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:layout_marginLeft="30dp"
android:textOff="@string/jiaotong"
android:textOn="@string/jiaotong" /&
&ToggleButton
android:id="@+id/WX_But"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/JT_But"
android:layout_alignBottom="@+id/JT_But"
android:layout_centerHorizontal="true"
android:textOff="@string/weixing"
android:textOn="@string/weixing" /&
&ToggleButton
android:id="@+id/FL_But"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/WX_But"
android:layout_alignBottom="@+id/WX_But"
android:layout_marginLeft="28dp"
android:layout_toRightOf="@+id/WX_But"
android:textOff="@string/Follow"
android:textOn="@string/Follow" /&
&/RelativeLayout&
&/LinearLayout&
因为响应按钮操作的OnClickLinstener和View里面的方法名字一样,我救另外建了一个类来实现监听方法:
退出按钮:
package com.micro.
import android.content.DialogI
import android.content.DialogInterface.OnClickL
public class ExitButLinstener implements OnClickListener {
public void onClick(DialogInterface dialog, int which) {
System.exit(0);
搜索界面:我把MapView设置为了静态的全局变量,搜索结果显示在主界面上,另外设这个这个界面是透明的,这样看起来就像是之前被隐藏起来了一样,另外这个界面是通过百度提供的Demo修改来的,其中有个Suggestion的方法我没有用到,但是也没删除,而是在界面的XML文件里把相应的组件隐藏起来了,这样一后可以接着学~
java文件:
package com.micro.
import com.baidu.mapapi.MKAddrI
import com.baidu.mapapi.MKBusLineR
import com.baidu.mapapi.MKDrivingRouteR
import com.baidu.mapapi.MKPoiR
import com.baidu.mapapi.MKS
import com.baidu.mapapi.MKSearchL
import com.baidu.mapapi.MKSuggestionR
import com.baidu.mapapi.MKTransitRouteR
import com.baidu.mapapi.MKWalkingRouteR
import com.baidu.mapapi.PoiO
import android.app.A
import android.os.B
import android.view.V
import android.view.View.OnClickL
import android.widget.ArrayA
import android.widget.B
import android.widget.EditT
import android.widget.ListV
import android.widget.T
public class SearchActivity extends Activity {
Button mBtnSearch = // 搜索按钮
Button mSuggestionSearch = // suggestion搜索
ListView mSuggestionList =
public static String mStrSuggestions[] = {};
MKSearch mSearch = // 搜索模块,也可去掉地图模块独立使用
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.searchact);
// 初始化搜索模块,注册事件监听
mSearch = new MKSearch();
mSearch.init(MyMapActivity.mBMapMan, new MKSearchListener() {
public void onGetPoiResult(MKPoiResult res, int type, int error) {
// 错误号可参考MKEvent中的定义
if (error != 0 || res == null) {
Toast.makeText(SearchActivity.this, "抱歉,未找到结果",
Toast.LENGTH_LONG).show();
// 将地图移动到第一个POI中心点
if (res.getCurrentNumPois() & 0) {
// 将poi结果显示到地图上
PoiOverlay poiOverlay = new PoiOverlay(SearchActivity.this,
MyMapActivity.mMapView);
poiOverlay.setData(res.getAllPoi());
MyMapActivity.clearMap();
MyMapActivity.mMapView.getOverlays().add(poiOverlay);
MyMapActivity.mMapView.invalidate();
MyMapActivity.mMapView.getController().setCenter(
res.getPoi(0).pt);
closeit();
} else if (res.getCityListNum() & 0) {
String strInfo = "在";
for (int i = 0; i & res.getCityListNum(); i++) {
strInfo += res.getCityListInfo(i).
strInfo += ",";
strInfo += "找到结果";
Toast.makeText(SearchActivity.this, strInfo,
Toast.LENGTH_LONG).show();
public void onGetDrivingRouteResult(MKDrivingRouteResult res,
int error) {
public void onGetTransitRouteResult(MKTransitRouteResult res,
int error) {
public void onGetWalkingRouteResult(MKWalkingRouteResult res,
int error) {
public void onGetAddrResult(MKAddrInfo res, int error) {
public void onGetBusDetailResult(MKBusLineResult result, int iError) {
public void onGetSuggestionResult(MKSuggestionResult res, int arg1) {
// TODO Auto-generated method stub
if (arg1 != 0 || res == null) {
Toast.makeText(SearchActivity.this, "抱歉,未找到结果",
Toast.LENGTH_LONG).show();
int nSize = res.getSuggestionNum();
mStrSuggestions = new String[nSize];
for (int i = 0; i & nS i++) {
mStrSuggestions[i] = res.getSuggestion(i).city
+ res.getSuggestion(i).
ArrayAdapter&String& suggestionString = new ArrayAdapter&String&(
SearchActivity.this,
android.R.layout.simple_list_item_1, mStrSuggestions);
mSuggestionList.setAdapter(suggestionString);
Toast.makeText(SearchActivity.this, "suggestion callback",
Toast.LENGTH_LONG).show();
mSuggestionList = (ListView) findViewById(R.id.listView1);
// 设定搜索按钮的响应
mBtnSearch = (Button) findViewById(R.id.search);
OnClickListener clickListener = new OnClickListener() {
public void onClick(View v) {
SearchButtonProcess(v);
mBtnSearch.setOnClickListener(clickListener);
// 设定suggestion响应
mSuggestionSearch = (Button) findViewById(R.id.suggestionsearch);
OnClickListener clickListener1 = new OnClickListener() {
public void onClick(View v) {
SuggestionSearchButtonProcess(v);
mSuggestionSearch.setOnClickListener(clickListener1);
void SearchButtonProcess(View v) {
if (mBtnSearch.equals(v)) {
// Intent intent =
// intent = new Intent(SearchActivity.this, MyMapActivity.class);
// this.startActivity(intent);
EditText editCity = (EditText) findViewById(R.id.city);
EditText editSearchKey = (EditText) findViewById(R.id.searchkey);
mSearch.poiSearchInCity(editCity.getText().toString(),
editSearchKey.getText().toString());
void SuggestionSearchButtonProcess(View v) {
EditText editSearchKey = (EditText) findViewById(R.id.suggestionkey);
mSearch.suggestionSearch(editSearchKey.getText().toString());
private void closeit() {
this.finish();
protected void onPause() {
MyMapActivity.mBMapMan.stop();
super.onPause();
protected void onResume() {
MyMapActivity.mBMapMan.start();
super.onResume();
地图查询XML文件:
&?xml version="1.0" encoding="utf-8"?&
&LinearLayout xmlns:android="/apk/res/android"
xmlns:tools="/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical"
android:visibility="visible"
tools:ignore="HardcodedText,TextFields" &
&LinearLayout
xmlns:android="/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@color/translucent_background"
android:orientation="horizontal" &
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="在" &
&/TextView&
android:id="@+id/city"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="北京" /&
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="市内找" &
&/TextView&
android:id="@+id/searchkey"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="清华大学" /&
android:id="@+id/search"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="搜索" /&
&/LinearLayout&
&LinearLayout
xmlns:android="/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@color/translucent_background"
android:orientation="horizontal"
android:visibility="invisible" &
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="关键词" &
&/TextView&
android:id="@+id/suggestionkey"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="清华大学" /&
android:id="@+id/suggestionsearch"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="关键词搜索" /&
&/LinearLayout&
&LinearLayout
xmlns:android="/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" &
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/translucent_background"
android:visibility="invisible" &
&/ListView&
&/LinearLayout&
&/LinearLayout&
下面是路线规划界面,也是直接从百度提供的Demo修改而来,这个功能有缺陷,比如说当起点和终点名称有歧义的时候就不能返回查询线路信息,但是由于时间比较紧,我救只把界面写出来了,相应的功能还没实现,接下来再做吧。
java代码:
package com.micro.
import android.os.B
import android.view.V
import android.view.View.OnClickL
import android.widget.B
import android.widget.EditT
import android.widget.ListV
import android.widget.T
import com.baidu.mapapi.MKAddrI
import com.baidu.mapapi.MKBusLineR
import com.baidu.mapapi.MKDrivingRouteR
import com.baidu.mapapi.MKGeocoderAddressC
import com.baidu.mapapi.MKPlanN
import com.baidu.mapapi.MKPoiR
import com.baidu.mapapi.MKS
import com.baidu.mapapi.MKSearchL
import com.baidu.mapapi.MKSuggestionR
import com.baidu.mapapi.MKTransitRouteR
import com.baidu.mapapi.MKWalkingRouteR
import com.baidu.mapapi.MapA
import com.baidu.mapapi.RouteO
import com.baidu.mapapi.TransitO
public class RoutePlan extends MapActivity {
private Button mBtnDrive = // 驾车搜索
private Button mBtnTransit = // 公交搜索
private Button mBtnWalk = // 步行搜索
private MKSearch mSearch = // 搜索模块,也可去掉地图模块独立使用
private static String MyCity = "长沙市";// 默认为长沙市
private EditText editSt;// 输入起点的输入框
private EditText editEn;// 输入终点的输入框
Button ckS// 确认起点按钮
Button ckE// 确认起点按钮
ListV// 如果结果不唯一,显示结果
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.routeplan);
// 初始化搜索模块,注册事件监听
mSearch = new MKSearch();
mSearch.init(MyMapActivity.mBMapMan, new MKSearchListener() {
public void onGetDrivingRouteResult(MKDrivingRouteResult res,
int error) {
// 错误号可参考MKEvent中的定义
if (error != 0 || res == null) {
// if (error == 4/* 线路起点终点有歧义 */) {
// Toast.makeText(RoutePlan.this, "线路起点终点有歧义",
// Toast.LENGTH_SHORT).show();
// if (res == null)
Toast.makeText(RoutePlan.this, "抱歉,未找到结果",
Toast.LENGTH_SHORT).show();
RouteOverlay routeOverlay = new RouteOverlay(RoutePlan.this,
MyMapActivity.mMapView);
// 此处仅展示一个方案作为示例
routeOverlay.setData(res.getPlan(0).getRoute(0));
MyMapActivity.clearMap();
MyMapActivity.mMapView.getOverlays().add(routeOverlay);
MyMapActivity.mMapView.invalidate();
MyMapActivity.mMapView.getController().animateTo(
res.getStart().pt);
public void onGetTransitRouteResult(MKTransitRouteResult res,
int error) {
if (error != 0 || res == null) {
// if (error == 4/* 线路起点终点有歧义 */) {
// Toast.makeText(RoutePlan.this, "线路起点终点有歧义",
// Toast.LENGTH_SHORT).show();
// if (res == null)
Toast.makeText(RoutePlan.this, "抱歉,未找到结果",
Toast.LENGTH_SHORT).show();
TransitOverlay routeOverlay = new TransitOverlay(
RoutePlan.this, MyMapActivity.mMapView);
// 此处仅展示一个方案作为示例
routeOverlay.setData(res.getPlan(0));
MyMapActivity.clearMap();
MyMapActivity.mMapView.getOverlays().add(routeOverlay);
MyMapActivity.mMapView.invalidate();
MyMapActivity.mMapView.getController().animateTo(
res.getStart().pt);
public void onGetWalkingRouteResult(MKWalkingRouteResult res,
int error) {
if (error != 0 || res == null) {
// if (error == 4/* 线路起点终点有歧义 */) {
// Toast.makeText(RoutePlan.this, "线路起点终点有歧义",
// Toast.LENGTH_SHORT).show();
// if (res == null)
Toast.makeText(RoutePlan.this, "抱歉,未找到结果",
Toast.LENGTH_SHORT).show();
RouteOverlay routeOverlay = new RouteOverlay(RoutePlan.this,
MyMapActivity.mMapView);
// 此处仅展示一个方案作为示例
routeOverlay.setData(res.getPlan(0).getRoute(0));
MyMapActivity.clearMap();
MyMapActivity.mMapView.getOverlays().add(routeOverlay);
MyMapActivity.mMapView.invalidate();
MyMapActivity.mMapView.getController().animateTo(
res.getStart().pt);
public void onGetAddrResult(MKAddrInfo res, int error) {
MKGeocoderAddressComponent kk = res.addressC
MyCity = kk.
Toast.makeText(RoutePlan.this, "所在城市:" + MyCity,
Toast.LENGTH_SHORT).show();
public void onGetPoiResult(MKPoiResult res, int arg1, int arg2) {
public void onGetBusDetailResult(MKBusLineResult result, int iError) {
public void onGetSuggestionResult(MKSuggestionResult res, int arg1) {
// TODO Auto-generated method stub
// 查询当先所在城市
mSearch.reverseGeocode(MyMapActivity.myLocation);
// 设定搜索按钮的响应
mBtnDrive = (Button) findViewById(R.id.drive);
mBtnTransit = (Button) findViewById(R.id.transit);
mBtnWalk = (Button) findViewById(R.id.walk);
OnClickListener clickListener = new OnClickListener() {
public void onClick(View v) {
SearchButtonProcess(v);
mBtnDrive.setOnClickListener(clickListener);
mBtnTransit.setOnClickListener(clickListener);
mBtnWalk.setOnClickListener(clickListener);
ckStr = (Button) findViewById(R.id.strCon);
ckEnd = (Button) findViewById(R.id.endCon);
list = (ListView) findViewById(R.id.listView1);
// 处理搜索按钮响应
editSt = (EditText) findViewById(R.id.start);
editEn = (EditText) findViewById(R.id.end);
private void SearchButtonProcess(View v) {
// 对起点终点的name进行赋值,也可以直接对坐标赋值,赋值坐标则将根据坐标进行搜索
MKPlanNode stNode = new MKPlanNode();
String stName = editSt.getText().toString();
if (stName.equals("")) {
if (MyMapActivity.myLocation == null) {
Toast.makeText(RoutePlan.this, "暂未获取到位置信息~", Toast.LENGTH_SHORT)
stNode.pt = MyMapActivity.myL
Toast.makeText(RoutePlan.this, "以自身作为起点", Toast.LENGTH_SHORT)
stNode.name = stN
String enName = editEn.getText().toString();
if (enName.equals("")) {
Toast.makeText(RoutePlan.this, "请输入目的地", Toast.LENGTH_SHORT).show();
MKPlanNode enNode = new MKPlanNode();
enNode.name = enN
// 实际使用中请对起点终点城市进行正确的设定
if (mBtnDrive.equals(v)) {
mSearch.drivingSearch(MyCity, stNode, MyCity, enNode);
} else if (mBtnTransit.equals(v)) {
mSearch.transitSearch(MyCity, stNode, enNode);
} else if (mBtnWalk.equals(v)) {
mSearch.walkingSearch(MyCity, stNode, MyCity, enNode);
Toast.makeText(RoutePlan.this,
MyCity + "从" + editSt.getText() + "到" + editEn.getText(),
Toast.LENGTH_SHORT).show();
protected void onPause() {
MyMapActivity.mBMapMan.stop();
super.onPause();
protected void onResume() {
MyMapActivity.mBMapMan.start();
super.onResume();
protected boolean isRouteDisplayed() {
// TODO Auto-generated method stub
* 查询起点和终点,确定线路起终点唯一
class CkStrListener implements OnClickListener {
public void onClick(View v) {
Button but = (Button)
if (but.getText().equals("确认起点")) {
路线规划XML文件:
&?xml version="1.0" encoding="utf-8"?&
&LinearLayout xmlns:android="/apk/res/android"
xmlns:tools="/tools"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
tools:ignore="TextFields,HardcodedText" &
&LinearLayout
android:id="@+id/LinearLayout1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/translucent_background" &
android:id="@+id/tableRow1"
android:layout_width="wrap_content"
android:layout_height="match_parent" &
&/TableRow&
android:id="@+id/start"
android:layout_width="240dp"
android:layout_height="wrap_content"
android:ems="10"
android:hint="起点(默认为用户当前位置)"
tools:ignore="HardcodedText" &
&requestFocus /&
&/EditText&
android:id="@+id/strCon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="确认起点" /&
&/LinearLayout&
&LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/translucent_background" &
android:id="@+id/end"
android:layout_width="240dp"
android:layout_height="match_parent"
android:ems="10"
android:hint="终点"
tools:ignore="HardcodedText" /&
android:id="@+id/endCon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="确认终点" /&
&/LinearLayout&
&LinearLayout
xmlns:android="/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/translucent_background"
android:orientation="horizontal" &
android:id="@+id/drive"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="驾车搜索" /&
android:id="@+id/transit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="公交搜索" /&
android:id="@+id/walk"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="步行搜索" /&
&/LinearLayout&
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/translucent_background" &
&/ListView&
&/LinearLayout&
最后一个功能就是测距,百度也提供了示例代码:
package com.micro.
public class Distence {
static double DEF_PI = 3.; // PI
static double DEF_2PI = 6.; // 2*PI
static double DEF_PI180 = 0.; // PI/180.0
static double DEF_R = ; // radius of earth
public double GetShortDistance(double lon1, double lat1, double lon2,
double lat2) {
double ew1, ns1, ew2, ns2;
double dx, dy,
// 角度转换为弧度
ew1 = lon1 * DEF_PI180;
ns1 = lat1 * DEF_PI180;
ew2 = lon2 * DEF_PI180;
ns2 = lat2 * DEF_PI180;
dew = ew1 - ew2;
// 若跨东经和西经180 度,进行调整
if (dew & DEF_PI)
dew = DEF_2PI -
else if (dew & -DEF_PI)
dew = DEF_2PI +
dx = DEF_R * Math.cos(ns1) * // 东西方向长度(在纬度圈上的投影长度)
dy = DEF_R * (ns1 - ns2); // 南北方向长度(在经度圈上的投影长度)
// 勾股定理求斜边长
distance = Math.sqrt(dx * dx + dy * dy);
public double GetLongDistance(double lon1, double lat1, double lon2,
double lat2) {
double ew1, ns1, ew2, ns2;
// 角度转换为弧度
ew1 = lon1 * DEF_PI180;
ns1 = lat1 * DEF_PI180;
ew2 = lon2 * DEF_PI180;
ns2 = lat2 * DEF_PI180;
// 求大圆劣弧与球心所夹的角(弧度)
distance = Math.sin(ns1) * Math.sin(ns2) + Math.cos(ns1)
* Math.cos(ns2) * Math.cos(ew1 - ew2);
// 调整到[-1..1]范围内,避免溢出
if (distance & 1.0)
distance = 1.0;
else if (distance & -1.0)
distance = -1.0;
// 求大圆劣弧长度
distance = DEF_R * Math.acos(distance);
double mLat1 = 39.90923; // point1纬度
double mLon1 = 116.357428; // point1经度
double mLat2 = 39.90923;// point2纬度
double mLon2 = 116.397428;// point2经度
double distance = GetShortDistance(mLon1, mLat1, mLon2, mLat2);
然后在主界面设置一个标志变量,当选择测量距离的时候监听触摸屏幕事件,当第一次触摸的时候画一个五角星并记录该点的地理坐标,第二次触摸则画一条线加一个五角星,并计算两点间的距离,现在计算出来的距离貌似偏差有点大,可能是数据处理的不对吧。下面是自己重写的两个Overlay:
package com.micro.
import android.graphics.C
import android.graphics.P
import android.graphics.P
import com.baidu.mapapi.GeoP
import com.baidu.mapapi.MapV
import com.baidu.mapapi.O
public class PointOverLay extends Overlay {
GeoPoint geoP
Paint paint = new Paint();
public PointOverLay(GeoPoint geoPoint){
this.geoPoint=geoP
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
Point point = mapView.getProjection().toPixels(geoPoint, null);
canvas.drawText("★", point.x, point.y, paint);
package com.micro.
import android.graphics.C
import android.graphics.P
import android.graphics.P
import com.baidu.mapapi.GeoP
import com.baidu.mapapi.MapV
import com.baidu.mapapi.O
public class LineOverLay extends Overlay {
GeoPoint geoPoint1;
GeoPoint geoPoint2;
Paint paint = new Paint();
public LineOverLay(GeoPoint geoPoint1, GeoPoint geoPoint2) {
this.geoPoint1 = geoPoint1;
this.geoPoint2 = geoPoint2;
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
Point point1 = mapView.getProjection().toPixels(geoPoint1, null);
Point point2 = mapView.getProjection().toPixels(geoPoint2, null);
canvas.drawLine(point1.x, point1.y, point2.x, point2.y, paint);
两天时间几乎都在搞这个,感觉利用API做程序还是挺简单的,就是写界面什么的比较麻烦,主要还是要加上自己的创意吧~
下载次数: 229
浏览 12189
浏览: 87329 次
来自: Ottawa
jcs130 写道thebest 写道感觉保存JSON数据会很 ...
膨胀腐蚀大概是什么意思,能留个微信吗
thebest 写道感觉保存JSON数据会很浪费空间啊。如果每 ...
感觉保存JSON数据会很浪费空间啊。如果每个记录的标签都是重复 ...
liuyar 写道更新很快嘛。加油。谢谢啦,不过接下来要继续研 ...

我要回帖

更多关于 安卓开发百度地图定位 的文章

 

随机推荐