美文网首页
高德地图(2D)使用方法大全

高德地图(2D)使用方法大全

作者: Wang_Mr | 来源:发表于2019-02-23 17:09 被阅读0次
    • 创建应用

    进入高德控制台后,点击“创建应用”按钮,进入创建应用的界面。 填上你的应用程序的名称以及选择应用类型就可以了, 最后点击最下方的 “创建”按钮,创建应用完毕。

    创建应用1.png
    创建应用2.png
    • 添加key

    在我的应用列表中点击刚才创建的应用的右边的➕号。

    添加key1.png

    填写Key名称、包名以及选择服务平台。

    添加key2.png

    获取发布版的SHA1(Mac电脑)

    1.打开 终端
    2.输入keytool -list -v -keystore  然后把签名文件直接拖进控制台 回车
    3.输入签名的密码
    
    获取签名文件的SHA1.png

    获取debug的SHA1(Mac电脑)

    1.打开 AndroidStudio的Terminal
    2.输入keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android 回车
    
    获取debug的SHA1.png
    • 集成key

    高德 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>
    
    根据需要选择功能.png

    jar包复制到工程的 libs 目录下并右键 Add As Library

    集成.png
    • 定位的使用

    声明Service组件

    <service android:name="com.amap.api.location.APSService" />
    

    声明权限

    <!--用于进行网络定位-->
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <!--用于访问GPS定位-->
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <!--用于获取运营商信息,用于支持提供运营商信息相关的接口-->
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <!--用于访问wifi网络信息,wifi信息会用于进行网络定位-->
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
        <!--用于获取wifi的获取权限,wifi信息会用来进行网络定位-->
        <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
        <!--用于访问网络,网络定位需要上网-->
        <uses-permission android:name="android.permission.INTERNET" />
        <!--用于读取手机当前的状态-->
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        <!--用于写入缓存数据到扩展存储卡-->
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
        <!--用于申请调用A-GPS模块-->
        <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
        <!--用于申请获取蓝牙信息进行室内定位-->
        <uses-permission android:name="android.permission.BLUETOOTH" />
        <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    
    

    初始化定位

    /**
    * 请在主线程中声明AMapLocationClient类对象,需要传Context类型的参数
    * 推荐用getApplicationContext()方法获取全进程有效的context
    */
    
    // 声明AMapLocationClient类对象
    public AMapLocationClient mLocationClient = null;
    
    // 初始化定位
    mLocationClient = new AMapLocationClient(getApplicationContext());
    //设置定位回调监听
    mlocationClient.setLocationListener(new AMapLocationListener() {
        @Override
        public void onLocationChanged(AMapLocation amapLocation) {
            if (amapLocation != null) {
                if (amapLocation.getErrorCode() == 0) {
                    amapLocation.getLocationType();//获取当前定位结果来源,如网络定位结果,详见定位类型表
                    amapLocation.getLatitude();//获取纬度
                    amapLocation.getLongitude();//获取经度
                    amapLocation.getAccuracy();//获取精度信息
                    amapLocation.getAddress();//地址,如果option中设置isNeedAddress为false,则没有此结果,网络定位结果中会有地址信息,GPS定位不返回地址信息。
                    amapLocation.getCountry();//国家信息
                    amapLocation.getProvince();//省信息
                    amapLocation.getCity();//城市信息
                    amapLocation.getDistrict();//城区信息
                    amapLocation.getStreet();//街道信息
                    amapLocation.getStreetNum();//街道门牌号信息
                    amapLocation.getCityCode();//城市编码
                    amapLocation.getAdCode();//地区编码
                    amapLocation.getAoiName();//获取当前定位点的AOI信息
                    amapLocation.getBuildingId();//获取当前室内定位的建筑物Id
                    amapLocation.getFloor();//获取当前室内定位的楼层
                    amapLocation.getGpsAccuracyStatus();//获取GPS的当前状态
                    //获取定位时间
                    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());
                }
            }
        }
    });
    

    配置定位参数

    // 初始化定位参数对象
    AMapLocationClientOption mLocationOption = new AMapLocationClientOption();
    
    /**
     * 设置单次定位或连续定位 不设置默认间隔2秒定位一次
     */
    
    // 设置定位一次
    mLocationOption.setOnceLocation(true);
    
    // 设置连续定位,定位间隔,单位毫秒,默认为2000ms,最低1000ms。
    mLocationOption.setInterval(1000);
    
    
    /**
     * 设置定位模式(三种模式) 不设置默认高精度定位模式
     */
    
    // 高精度定位模式:会同时使用网络定位和GPS定位,优先返回最高精度的定位结果,以及对应的地址描述信息。
    mLocationOption.setLocationMode(AMapLocationMode.Hight_Accuracy);
    // 低功耗定位模式:不会使用GPS和其他传感器,只会使用网络定位(Wi-Fi和基站定位);
    mLocationOption.setLocationMode(AMapLocationMode.Battery_Saving);
    // 仅用设备定位模式:不需要连接网络,只使用GPS进行定位,这种模式下不支持室内环境的定位,需要在室外环境下才可以成功定位。注意,自 v2.9.0 版本之后,仅设备定位模式下支持返回地址描述信息。
    mLocationOption.setLocationMode(AMapLocationMode.Device_Sensors);
    

    给定位客户端对象设置定位参数并启动定位

    mLocationClient.setLocationOption(mLocationOption);
    // 启动定位
    mLocationClient.startLocation();
    
    • 2D地图的使用

    声明权限

    <!--允许程序打开网络套接字-->
    <uses-permission android:name="android.permission.INTERNET" />
    <!--允许程序设置内置sd卡的写权限-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />   
    <!--允许程序获取网络状态-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 
    <!--允许程序访问WiFi网络信息-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> 
    <!--允许程序读写手机状态和身份-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />     
    <!--允许程序访问CellID或WiFi热点来获取粗略的位置-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
    

    布局xml文件中添加地图控件

    <com.amap.api.maps.MapView
        android:id="@+id/map"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    

    查找控件并对Map的生命周期进行管理

    public class MainActivity extends Activity {
        MapView mMapView = null;
        //初始化地图控制器对象
        AMap aMap;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState); 
            setContentView(R.layout.activity_main);
            //获取地图控件引用
            mMapView = (MapView) findViewById(R.id.map);
            //在activity执行onCreate时执行mMapView.onCreate(savedInstanceState),创建地图
            mMapView.onCreate(savedInstanceState);
    
            if (aMap == null) {
                aMap = mMapView.getMap();
            }
        }
      
        @Override
        protected void onResume() {
            super.onResume();
            //在activity执行onResume时执行mMapView.onResume (),重新绘制加载地图
            mMapView.onResume();
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            //在activity执行onPause时执行mMapView.onPause (),暂停地图的绘制
            mMapView.onPause();
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            //在activity执行onDestroy时执行mMapView.onDestroy(),销毁地图
            mMapView.onDestroy();
        }
    
        @Override
        protected void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            //在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),保存地图当前的状态
            mMapView.onSaveInstanceState(outState);
        } 
    }
    

    绘制标记

    // 声明标记
    private Marker locationMarker;
    
    /**
    * 往地图上添加marker
    */
    private void addMarker(double latitude,double longitude) {
        
       LatLng latLng = new LatLng(latitude, longitude);
    
        if (locationMarker != null) {
            // maker已存在直接更换经纬度
            locationMarker.setPosition(latLng);
            // 缩放地图
            aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 20));
            return;
        }
    
        MarkerOptions markerOptions = new MarkerOptions();
        // 在地图上标记位置的经纬度值。必填参数
        markerOptions.position(latLng);
        // 点标记的标题
        markerOptions.title("长按此标记");
        // 点标记的内容
        markerOptions.snippet("可进行拖动");
        // 点标记是否可拖拽
        markerOptions.draggable(true);
        // 点标记的锚点(不设置,默认中心点) 根据图片调节
        markerOptions.anchor(0.5f, 1f);
        // 图标不支持svg
        markerOptions.icon(BitmapDescriptorFactory.fromBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.gd_maker)));
    
        // 地图上添加标记
        locationMarker = aMap.addMarker(markerOptions);
        // 缩放地图
        // 参数二:地图缩放级别为4-20级
        aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(latLng, 20));
    }
    

    标记拖拽监听

    aMap.setOnMarkerDragListener(new AMap.OnMarkerDragListener() {
        @Override
        public void onMarkerDragStart(Marker marker) {
    
        }
    
        // 在marker拖动过程中回调此方法, 这个marker的位置可以通过getPosition()方法返回。
        // 这个位置可能与拖动的之前的marker位置不一样。
        // marker 被拖动的marker对象。
        @Override
        public void onMarkerDrag(Marker marker) {
                    
        }
    
        // 在marker拖动完成后回调此方法, 这个marker的位置可以通过getPosition()方法返回。
        // 这个位置可能与拖动的之前的marker位置不一样。
        // marker 被拖动的marker对象。
        @Override
        public void onMarkerDragEnd(Marker marker) {
            LatLng latLng = marker.getPosition();
            // 拖拽结束 更改原来标记的经纬度
            addMarker(latLng.latitude,latLng.longitude);
        }
    });
    

    监听地图的点击

    aMap.setOnMapClickListener(new AMap.OnMapClickListener() {
        @Override
        public void onMapClick(LatLng latLng) {
            // 地图 点击 更换marker的经纬度
            addMarker(latLng.latitude,latLng.longitude);
        }
    });
    

    根据经纬度查询相关信息

    // 地理编码搜索
    private GeocodeSearch geocodeSearch;
    
    
    // 初始化地理编码搜索
    geocodeSearch = new GeocodeSearch(this);
    // 设置地理编码搜索监听
    geocodeSearch.setOnGeocodeSearchListener(new GeocodeSearch.OnGeocodeSearchListener() {
        @Override
        public void onRegeocodeSearched(RegeocodeResult regeocodeResult, int rCode) {
            // 地理逆编码回调函数
            if (rCode == 1000) {
                //解析result获取地址描述信息
            } else {
                Log.e("onGeocodeSearchedError", "地理逆编码查询失败,错误码" + rCode);
            }
        }
    
        @Override
        public void onGeocodeSearched(GeocodeResult geocodeResult, int rCode) {
            // 地理编码查询回调
        }
    });
    
    // 根据经纬度逆地理编码查询
    private void query(LatLng latLng) {
    
        //逆地理编码查询条件:逆地理编码查询的地理坐标点、查询范围、坐标类型。
        LatLonPoint latLonPoint = new LatLonPoint(latLng.latitude, latLng.longitude);
        // 第一个参数表示一个Latlng,第二参数表示范围多少米,第三个参数表示是火系坐标系还是GPS原生坐标系
        RegeocodeQuery query = new RegeocodeQuery(latLonPoint, 200, GeocodeSearch.AMAP);
        //异步查询
        geocodeSearch.getFromLocationAsyn(query);
    
    }
    

    相关文章

      网友评论

          本文标题:高德地图(2D)使用方法大全

          本文链接:https://www.haomeiwen.com/subject/jeauyqtx.html