美文网首页
高德地图(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