百度地图开发介绍

一.定位服务
在地图开发中我们都会用到地图服务。首先是要获取位置 ,我们可以把定位这一块 写到服务里 在想用的时候直接获取。

public class LocationService extends Service implements BDLocationListener {

private LocationClient mLocationClient;

public static BDLocation mBdLocation;

private LocationClientOption.LocationMode tempMode = LocationClientOption.LocationMode.Hight_Accuracy;

private String tempcoor = "bd09ll";     //"gcj02";

public BDLocation getLastKnownLocation() {
    return this.mLocationClient.getLastKnownLocation();
}

public boolean isStarted() {
    return this.mLocationClient.isStarted();
}

public void registerLocationListener(BDLocationListener locationListener) {
    this.mLocationClient.registerLocationListener(locationListener);
}

public void unRegisterLocationListener(BDLocationListener locationListener) {
    this.mLocationClient.unRegisterLocationListener(locationListener);
}

public void disconnectLocationClient() {
    if (mLocationClient != null && !mLocationClient.isStarted()) {
        unRegisterLocationListener(this);
        this.stop();
    }
}

public void setLocOption(LocationClientOption clientOption) {
    this.mLocationClient.setLocOption(clientOption);
}

public void start() {
    this.mLocationClient.start();
}

public void stop() {
    this.mLocationClient.stop();
}

@Override
public void onCreate() {
    super.onCreate();

    mLocationClient = new LocationClient(this);
    LocationClientOption option = new LocationClientOption();

    option.setLocationMode(tempMode);
    option.setCoorType(tempcoor);
    option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
    option.setOpenGps(true);//可选,默认false,设置是否使用gps
    option.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果
    option.setIgnoreKillProcess(true);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
    option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤gps仿真结果,默认需要
    option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
    option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
    option.setIsNeedAddress(true);

    setLocOption(option);
    registerLocationListener(this);
    start();
    mBdLocation  = mLocationClient.getLastKnownLocation();
}

public void onDestroy() {
    super.onDestroy();
    disconnectLocationClient();
}

@Override
public void onReceiveLocation(BDLocation location) {

    mBdLocation = location;

}

}

二.反地理编码
反地理编码就是通过百度的坐标定位引擎,插叙出坐标对应的物体所在的行政区划、街道等信息在地图上点击的时候,或者拖动marker的时候得到的LatLng对象,就可以通过反地理编码得到具体的地址了。
效果如下



开发步骤(不再介绍地图定位)
1.布局文件

    <?xml version="1.0" encoding="utf-8"?>
  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:orientation="vertical">

  <com.baidu.mapapi.map.MapView
      android:id="@+id/main_bdmap"
      android:layout_width="match_parent"
      android:layout_height="250dp"
      android:onClick="true"></com.baidu.mapapi.map.MapView>

  <ListView
      android:id="@+id/main_pois"
      android:layout_width="match_parent"
      android:layout_height="0dp"
      android:layout_weight="1"></ListView>

 </LinearLayout>

2.获取地理编码检索(有两种方法)
(1)通过创建 GeoCoder 回调获取

  /**
   * 定位监听
  *
  * @param bdLocation
*/
@Override
public void onReceiveLocation(BDLocation bdLocation) {

//如果bdLocation为空或mapView销毁后不再处理新数据接收的位置
if (bdLocation == null || mBaiduMap == null) {
    return;
}

//定位数据
MyLocationData data = new MyLocationData.Builder()
        //定位精度bdLocation.getRadius()
        .accuracy(bdLocation.getRadius())
                //此处设置开发者获取到的方向信息,顺时针0-360
        .direction(bdLocation.getDirection())
                //经度
        .latitude(bdLocation.getLatitude())
                //纬度
        .longitude(bdLocation.getLongitude())
                //构建
        .build();

//设置定位数据
mBaiduMap.setMyLocationData(data);

//是否是第一次定位
if (isFirstLoc) {
    isFirstLoc = false;
    LatLng ll = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude());
    MapStatusUpdate msu = MapStatusUpdateFactory.newLatLngZoom(ll, 18);
    mBaiduMap.animateMapStatus(msu);
}
//创建GeoCoder实例对象
geoCoder = GeoCoder.newInstance();
//发起反地理编码请求(经纬度->地址信息)
ReverseGeoCodeOption reverseGeoCodeOption = new ReverseGeoCodeOption();
//设置反地理编码位置坐标
reverseGeoCodeOption.location(new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude()));
geoCoder.reverseGeoCode(reverseGeoCodeOption);

//设置查询结果监听者
geoCoder.setOnGetGeoCodeResultListener(this);
}

   //地理编码查询结果回调函数
  @Override
  public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
 }

           //反地理编码查询结果回调函数
     @Override
    public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
       List<PoiInfo> poiInfos = reverseGeoCodeResult.getPoiList();
      PoiAdapter poiAdapter = new PoiAdapter(MainActivity.this, poiInfos);
      poisLL.setAdapter(poiAdapter);
   }

(2)通过Web服务API获取
首先要创建一个 服务端类型 的 百度地图应用
设置 ip白名单 设置为0.0.0.0/0 即可

   只有IP白名单内的服务器才能成功发起调用
   格式: 202.198.16.3,202.198.0.0/16 填写IP地址或IP前缀网段,英文半角逗号分隔
   如果不想对IP做任何限制,请设置为0.0.0.0/0 (谨慎使用,AK如果泄露配额会被其用户
  消费,上线前可以用作Debug,线上正式ak请设置合理的IP白名单)

请求 接口

      http://api.map.baidu.com/geocoder/v2/?callback=renderReverse&location=39.983424,116.322987&output=json&pois=1&ak=您的ak

三。移动选址
移动选址 通过setOnMapStatusChangeListener 方法 获取 地图拖动 动作 结束 时 地图图层中心 点 的坐标
效果如下



开发步骤(不再介绍地图定位)
1.布局文件

  <?xml version="1.0" encoding="utf-8"?>
 <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

    <RelativeLayout
        android:id="@+id/main_top_RL"
        android:layout_width="match_parent"
        android:layout_height="250dp">

        <com.baidu.mapapi.map.MapView
            android:id="@+id/main_bdmap"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:onClick="true"></com.baidu.mapapi.map.MapView>

        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:background="@android:color/transparent"
            android:src="@mipmap/baidumap_ico_poi_on" />
    </RelativeLayout>

    <ListView
        android:id="@+id/main_pois"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"></ListView>
</LinearLayout>

2.移动选址
首先要设置
//地图状态改变相关监听
mBaiduMap.setOnMapStatusChangeListener(this);

/**
 * 定位监听
 *
 * @param bdLocation
 */
@Override
public void onReceiveLocation(BDLocation bdLocation) {

    //如果bdLocation为空或mapView销毁后不再处理新数据接收的位置
    if (bdLocation == null || mBaiduMap == null) {
        return;
    }

    //定位数据
    MyLocationData data = new MyLocationData.Builder()
            //定位精度bdLocation.getRadius()
            .accuracy(bdLocation.getRadius())
                    //此处设置开发者获取到的方向信息,顺时针0-360
            .direction(bdLocation.getDirection())
                    //经度
            .latitude(bdLocation.getLatitude())
                    //纬度
            .longitude(bdLocation.getLongitude())
                    //构建
            .build();

    //设置定位数据
    mBaiduMap.setMyLocationData(data);

    //是否是第一次定位
    if (isFirstLoc) {
        isFirstLoc = false;
        LatLng ll = new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude());
        MapStatusUpdate msu = MapStatusUpdateFactory.newLatLngZoom(ll, 18);
        mBaiduMap.animateMapStatus(msu);
    }

    //创建GeoCoder实例对象
    geoCoder = GeoCoder.newInstance();
    //发起反地理编码请求(经纬度->地址信息)
    ReverseGeoCodeOption reverseGeoCodeOption = new ReverseGeoCodeOption();
    //设置反地理编码位置坐标
    reverseGeoCodeOption.location(new LatLng(bdLocation.getLatitude(), bdLocation.getLongitude()));
    geoCoder.reverseGeoCode(reverseGeoCodeOption);

    //设置查询结果监听者
    geoCoder.setOnGetGeoCodeResultListener(this);
}

//地理编码查询结果回调函数
@Override
public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
}

//反地理编码查询结果回调函数
@Override
public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
    List<PoiInfo> poiInfos = reverseGeoCodeResult.getPoiList();
    PoiAdapter poiAdapter = new PoiAdapter(MainActivity.this, poiInfos);
    poisLL.setAdapter(poiAdapter);
}


/**
 * 手势操作地图,设置地图状态等操作导致地图状态开始改变
 *
 * @param mapStatus 地图状态改变开始时的地图状态
 */
@Override
public void onMapStatusChangeStart(MapStatus mapStatus) {
}

/**
 * 地图状态变化中
 *
 * @param mapStatus 当前地图状态
 */
@Override
public void onMapStatusChange(MapStatus mapStatus) {
}

/**
 * 地图状态改变结束
 *
 * @param mapStatus 地图状态改变结束后的地图状态
 */
@Override
public void onMapStatusChangeFinish(MapStatus mapStatus) {
    //地图操作的中心点
    LatLng cenpt = mapStatus.target;
    geoCoder.reverseGeoCode(new ReverseGeoCodeOption().location(cenpt));
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,265评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,078评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,852评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,408评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,445评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,772评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,921评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,688评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,130评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,467评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,617评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,276评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,882评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,740评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,967评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,315评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,486评论 2 348

推荐阅读更多精彩内容