基于高德地图的应用开发-----DIY地图
来源:互联网 发布:java程序员等级划分 编辑:程序博客网 时间:2024/05/17 01:05
1. 开发意义
在日益创新的网络技术促进下,我国的通讯技术早已经进入第四代,4G时代的到来,让人们享受到了更快速的网络传输速度和便捷的移动通讯。在现在的社会,手机已经成为了人们日常生活中不可缺少的一部分。随着现代科技的进步和人们生活质量的不断地提高,普通只可以打电话发信息手机已经无法满足人们的要求。从人们对智能手机的使用率反复的调查研究来看,可以说智能手机使用率在现代社会已经达到了90%以上,智能手机的功能也被开发得越来越人性化,人们可以通过手机完成很多的需求,可以说人们的生活已经离不开智能手机了。现在人们更多地使用Android Store上的APP应用来帮助人们解决问题,因此由我的这个基于高德地图开发的移动APP拓展开来,延伸并广泛的使用在高德地图API对Android系统的结合中,由于对地址查询最原始方式是使用PC版的百度地图,相比之下,显得就很麻烦,人们不可能随身携带电脑,并且不能保证电脑随时随地都能够用有线或WIFI的方式上网,但是在手机上,人们只需要在自己手机的Android Store上下载这个APP,就能通过在线定位、位置查询、位置信息检索等功能,解决生活中的一些问题。
2. 项目简介
本移动APP应用基于高德地图开发,基于高德地图官方提供的架包,主要的实现的功能有:定位、位置查询、位置信息检索;
3. 开发条件
软件:具有APP开发能力的Eclipse、Android手机模拟器;
硬件:系统为Android4.0以上的Android真机。
其他:高德地图API账号、密码、AppKey等;
推荐模拟器:海马玩 (http://droid4x.haimawan.com/)
Genymotion (http://www.genymotion.net/)。
4. 开发者注册
i. 在高德地图开放平台(http://lbs.amap.com)上注册成为开发者
ii. 在控制台创建移动APP应用
iii. 添加APP应用后,获取对应的key
Windows--->Prefences--->Android--->Build,获取安全码SHA1
获取报名Package Name
5. 环境搭建
i. 新建一个Android工程
ii. 添加 jar 包和 so 库
iii. 添加高德 Key
项目的“AndroidManifest.xml”文件中,添加如下代码
<application
android:icon="@drawable/icon"
android:label="@string/app_name" >
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="请输入您的用户Key"/>
……
</application>
iv. 配置权限
在AndroidManifest.xml中配置权限:
//地图包、搜索包需要的基础权限
<!-- 允许程序打开网络套接字 -->
<uses-permissionandroid:name="android.permission.INTERNET"/>
<!-- 允许程序设置内置sd卡的写权限 -->
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<!-- 允许程序获取网络状态 -->
<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>
<!-- 允许程序访问WiFi网络信息 -->
<uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/>
<!-- 允许程序读写手机状态和身份 -->
<uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/>
<!-- 用于进行网络定位 -->
<uses-permissionandroid:name="android.permission.ACCESS_COARSE_LOCATION">
</uses-permission>
<!-- 用于访问GPS定位 -->
<uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION">
</uses-permission>
<!-- 获取运营商信息,用于支持提供运营商信息相关的接口 -->
<uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE">
</uses-permission>
<!-- 用于访问网络,网络定位需要上网 -->
<uses-permissionandroid:name="android.permission.INTERNET">
</uses-permission>
<!-- 用于读取手机当前的状态 -->
<uses-permissionandroid:name="android.permission.READ_PHONE_STATE">
</uses-permission>
android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS">
</uses-permission>
<!-- 用于申请获取蓝牙信息进行室内定位 -->
<uses-permissionandroid:name="android.permission.BLUETOOTH">
</uses-permission>
<uses-permissionandroid:name="android.permission.BLUETOOTH_ADMIN">
</uses-permission>
一、 项目功能与架构
1. 项目功能
i. 地图显示
ii. 实时定位
iii. 位置蓝点标记
iv. 位置信息显示
v. 周边POI搜索
2. 程序架构
二、 项目实现
1. 功能详解
i. 地图显示
利用官方提供的接口,对定位点进行监听,声明locationClient对象,并对对象进行初始化,将实时的经纬度位置显示出来。
mMapView = (MapView) findViewById(R.id.map);
// 在activity执行onCreate时执行mMapView.onCreate(savedInstanceState),创建地图
mMapView.onCreate(savedInstanceState);
if (aMap ==null) {
aMap = mMapView.getMap();
// aMap.moveCamera(arg0);
// 设置定位监听
}
// 声明mlocationClient对象
AMapLocationClient mlocationClient;
// 声明mLocationOption对象
AMapLocationClientOption mLocationOption = null;
// AMapLocationClientOption mLocationOption = null;
mlocationClient = new AMapLocationClient(this);
// 初始化定位参数
mLocationOption = new AMapLocationClientOption();
// 设置定位监听
mlocationClient.setLocationListener(this);
// 设置定位模式为高精度模式,Battery_Saving为低功耗模式,Device_Sensors是仅设备模式
mLocationOption.setLocationMode(AMapLocationMode.Hight_Accuracy);
// 设置定位间隔,单位毫秒,默认为2000ms
mLocationOption.setInterval(2000);
// 设置定位参数
mlocationClient.setLocationOption(mLocationOption);
// 此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗,
// 注意设置合适的定位时间的间隔(最小间隔支持为1000ms),并且在合适时间调用stopLocation()方法来取消定位请求
// 在定位结束后,在合适的生命周期调用onDestroy()方法
// 在单次定位情况下,定位无论成功与否,都无需调用stopLocation()方法移除请求,定位sdk内部会移除
// 启动定位
mlocationClient.startLocation();
实时定位
重写onLocationChanged()方法,在定位成功后实时回调定位信息,并将获取到的经纬度等位置信息通过Activity传值跳转到MessageActivity或者PoiSearchActivity页面,如定位不成功,则日志打印错误信息,防止程序报错或闪退。
@Override
public void onLocationChanged(AMapLocation amapLocation) {
// TODO Auto-generated method stub
if (amapLocation !=null) {
if (amapLocation.getErrorCode() == 0) {
// 定位成功回调信息,设置相关消息
amapLocation.getLocationType();
// //获取当前定位结果来源,如网络定位结果,详见定位类型表
amapLocation.getLatitude();//获取纬度
x = amapLocation.getLatitude();
Log.i("TAG","纬度:" + amapLocation.getLatitude());
amapLocation.getLongitude();//获取经度
y = amapLocation.getLongitude();
Log.i("TAG","经度:" + amapLocation.getLongitude());
accuracy = amapLocation.getAccuracy();//获取精度信息
Log.i("TAG","地址::" + amapLocation.getAddress());
address = amapLocation.getAddress();
// 地址,如果option中设置isNeedAddress为false,则没有此结果,
网络定位结果中会有地址信息,GPS定位不返回地址信息。
country = amapLocation.getCountry();//国家信息
province = amapLocation.getProvince();//省信息
city = amapLocation.getCity();//城市信息
amapLocation.getDistrict();//城区信息
amapLocation.getStreet();//街道信息
amapLocation.getStreetNum();//街道门牌号信息
cityCode = amapLocation.getCityCode();//城市编码
Adcode = amapLocation.getAdCode();//地区编码
SimpleDateFormat df = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
Date date = new Date(amapLocation.getTime());
df.format(date);// 定位时间
} else {
// 显示错误信息ErrCode是错误码,errInfo是错误信息,详见错误码表。
Log.e("AmapError",
"location Error, ErrCode:"
+ amapLocation.getErrorCode() + ", errInfo:"
+ amapLocation.getErrorInfo());
}
}
}
iii. 位置蓝点标记
通过onLocationChanged()方法获取经纬度值,然后调用moveCamera()来将地图位置显示移动到定位点,并用蓝点进行标记。
aMap.moveCamera(CameraUpdateFactory.changeLatLng(new LatLng(x,y)));
// 标记点
try {
locationMarker = aMap.addMarker(new MarkerOptions()
.anchor(0.5f, 0.5f)
.icon(BitmapDescriptorFactory .fromBitmap(BitmapFactory.decodeResource( getResources(), R.drawable.point4))) .position(new LatLng(x,y)));
locationMarker.showInfoWindow();
} catch (Exception e) {
// TODO: handle exception
}
iv. 位置信息显示
监听定位按钮,获取经纬度值,再监听显示按钮,将全局变量的经纬度值传给MessageActivity进行显示。
// 显示监听、
findViewById(R.id.show).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,MessageActivity.class);
intent.putExtra("mess_key","经度:" +y +"\n" + "纬度:" +x +"\n"
+ "定位精度:" +accuracy +"\n" +"国家:" +country +"\n"
+ "省份:" +province +"\n" +"城市:" +city +"\n"
+ "城市编号:" +cityCode +"\n" +"地区编号:" +Adcode +"\n"
+ "详细地址:" +address +"\n");
startActivity(intent);
}
});
public class MessageActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.message);
String message = getIntent().getStringExtra("mess_key");
TextView show = (TextView) findViewById(R.id.message);
show.setText(message);
}
}
周边POI搜索
监听搜索按钮,通过定位点的经纬度的实时数据,检索周边5公里的信息,并将检索结果用标记标出,若没有搜索结果,则用Toast输出,其中需要写一个ToastUtil类来设置定位点的标记设置。
ToastUtil.java
public class ToastUtil {
public static void show(Context context, String info) {
Toast.makeText(context, info, Toast.LENGTH_LONG).show();
}
public static void show(Context context,int info) {
Toast.makeText(context, info, Toast.LENGTH_LONG).show();
}
public static void showerror(Context context,int rCode) {
try {
switch (rCode) {
// 服务错误码
…………………………(标记显示)
}
} catch (Exception e) {
Toast.makeText(context, e.getMessage(), Toast.LENGTH_LONG).show();
}
}
}
PoiSearchActivity.java
// AMap对象的初始化
private void init() {
if (mAMap ==null) {
mAMap = mapView.getMap();
// AMap对象的监事件
mAMap.setOnMapClickListener(this);
mAMap.setOnMarkerClickListener(this);
mAMap.setOnInfoWindowClickListener(this);
mAMap.setInfoWindowAdapter(this);
// 获取相关控件
TextView searchButton = (TextView) findViewById(R.id.btn_search);
searchButton.setOnClickListener(this);
x = getIntent().getDoubleExtra("x_key",x);
y = getIntent().getDoubleExtra("y_key",x);
lp=new LatLonPoint(x,y);//初始化位置
// 初始位置标记
locationMarker = mAMap
.addMarker(new MarkerOptions()
.anchor(0.5f, 0.5f)
.icon(BitmapDescriptorFactory
.fromBitmap(BitmapFactory.decodeResource(
getResources(), R.drawable.point4)))
.position(
new LatLng(lp.getLatitude(),lp
.getLongitude())));
locationMarker.showInfoWindow();
}
setup();
// 显示摄像头的大小
mAMap.moveCamera(CameraUpdateFactory.newLatLngZoom(
new LatLng(lp.getLatitude(),lp.getLongitude()), 14));
}
private void setup() {
mPoiDetail = (RelativeLayout) findViewById(R.id.poi_detail);
mPoiDetail.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
}
});
mPoiName = (TextView) findViewById(R.id.poi_name);
mPoiAddress = (TextView) findViewById(R.id.poi_address);
mSearchText = (EditText) findViewById(R.id.input_edittext);
}
protected void doSearchQuery() {
// Trim() 函数的功能是去掉首尾空格
keyWord = mSearchText.getText().toString().trim();
currentPage = 0;
// 第一个参数表示搜索字符串,第二个参数表示poi搜索类型,第三个参数表示poi搜索区域(空字符串代表全国)
query = newPoiSearch.Query(keyWord,"","孝感市");
query.setPageSize(20);// setting howmang itmes to return;
query.setPageNum(currentPage);// setup query the first page;
if (lp !=null) {
poiSearch = new PoiSearch(this, query);
poiSearch.setOnPoiSearchListener(this);
// 设置搜索区域为以lp点为圆心,其周围5000米范围
poiSearch.setBound(newPoiSearch.SearchBound(lp, 5000,true));
poiSearch.searchPOIAsyn();//asyn search
}
}
- 基于高德地图的应用开发-----DIY地图
- 基于高德地图开发--创建基本的地图
- 高德地图开发--地图的显示
- 基于高德地图的app开发打包报错
- 高德地图API开发应用-----地图显示+定位+marker
- 最新基于高德地图的android进阶开发(3)GPS地图定位
- 最新基于高德地图的android进阶开发 GPS地图定位
- 高德地图应用
- 高德地图应用
- 基于Vue 2和高德地图的地图组件
- 基于高德地图的地理编码
- 高德地图开发
- 高德地图开发
- 安卓开发——Intent跳转地图应用(百度地图、高德地图)
- 高德地图API的应用
- Android Studio 关于高德地图的开发:显示地图
- 【高德地图开发】---地图显示
- Android高德地图开发 地图事件
- cookie和sessionStorage、localStorage的区别
- JavaSE 反射 Part8
- android百度地图开发V4.5最新版(7)---POI搜索之全城搜索
- spring基于构造方法的依赖注入
- angularJs 基础学习
- 基于高德地图的应用开发-----DIY地图
- Lucene介绍和实战
- sdp文件详细总结
- ijkplayer
- 程序5
- Appium链接参数详解 for python
- MIME类型
- Linux 常用命令
- Hugepages你用了吗?----原理概念篇