基于高德地图的应用开发-----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中设置isNeedAddressfalse,则没有此结果,

网络定位结果中会有地址信息,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

        }

    }