【4858美高梅】百度地图,获取用户精准地理位置音信

By admin in 4858美高梅 on 2019年4月8日

拿到用户精准地理地点音信步骤:

转发请证实出处!

  • 开发工具:android studio 贰.贰.三
  • 测试手提式有线电话机:夜神模拟器,HTCMT二
  • 百度地图版本:四.叁.0

近日在做LBS应用,当中使用了高德的LBS技术,须要UPAJEROL情势得以实现地理编码/逆地理编码,官网提供了JS
SDK,Android SDK和iOS SDK,正是在网上找到的材质都不周详

百度对外接口的坐标系,都以经过国家测量绘制局加密处理,符合国家测量绘制局对地理消息保密须要。

一.通过 navigator.geolocation.getCurrentPosition(showPosition,
showError); 方法得到经纬度;

效果图:

4858美高梅 1

Map.gif

品种扫尾后,那里为大家整理出1份完整的高德LBS
UPRADOL地理编码/逆地理编码文书档案,希望能帮到我们:

国际经纬度坐标标准为WGS-八4,国内必须至少使用国测局制定的GCJ- 0二,对地理地点展早先次加密。百度坐标在此基础上,进行了BD-0玖拾伍次加密方法,越发入保证障了个人隐衷。百度对外接口的坐标系并不是GPS采集的诚实经
纬度,必要通过坐标转换接口进行转移。

二.运用百度地图坐标转换接口( 

Activity:

package com.wentong.zt.map;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.CardView;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.location.LocationClientOption.LocationMode;
import com.baidu.location.Poi;
import com.baidu.mapapi.SDKInitializer;
import com.baidu.mapapi.map.BaiduMap;
import com.baidu.mapapi.map.MapStatus;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;
import com.baidu.mapapi.search.core.PoiInfo;
import com.baidu.mapapi.search.core.SearchResult;
import com.baidu.mapapi.search.geocode.GeoCodeResult;
import com.baidu.mapapi.search.geocode.GeoCoder;
import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption;
import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult;
import com.baidu.mapapi.search.poi.OnGetPoiSearchResultListener;
import com.baidu.mapapi.search.poi.PoiDetailResult;
import com.baidu.mapapi.search.poi.PoiIndoorResult;
import com.baidu.mapapi.search.poi.PoiNearbySearchOption;
import com.baidu.mapapi.search.poi.PoiResult;
import com.baidu.mapapi.search.poi.PoiSearch;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {

/**
 * 我的位置
 */
private Button btn_myPosition;
/**
 * 地图
 */
private MapView mapView;
/**
 * 当前位置信息
 */
private TextView tv_myPosition;
/**
 * 卡片
 */
private CardView cardView;
/**
 * 定义 BaiduMap 地图对象的操作方法与接口
 */
private BaiduMap baiduMap;
/**
 * 定位服务的客户端。宿主程序在客户端声明此类,并调用,目前只支持在主线程中启动
 */
private LocationClient locationClient;
/**
 * 定位请求回调接口
 */
private BDLocationListener listener = new MyLocationListener();
/**
 * 是否第一次定位
 */
private boolean isFirstLogin = true;
/**
 * 纬度
 */
private double latitude;
/**
 * 经度
 */
private double longitude;
/**
 * POI检索接口
 */
PoiSearch poiSearch;
/**
 * 展示列表
 */
private RecyclerView recycler;
/**
 * RecyclerView适配器
 */
AdapterRecyclerView adapter;
/**
 * 地理编码查询接口
 */
GeoCoder geocode;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    //在使用SDK各组件之前初始化context信息,传入ApplicationContext 注意该方法要再setContentView方法之前实现
    SDKInitializer.initialize(getApplicationContext());
    setContentView(R.layout.activity_main);

    initView();
}

/**
 * create at 2017/4/13 13:37
 * 方法名:initView
 * <p>
 * 方法说明: 初始化界面
 * <p>
 */
private void initView() {
    //绑定控件
    btn_myPosition = (Button) findViewById(R.id.act_main_btn_myPosition);
    mapView = (MapView) findViewById(R.id.act_main_mapView);
    recycler = (RecyclerView) findViewById(R.id.act_main_recycler);
    tv_myPosition = (TextView) findViewById(R.id.act_main_tv_myPosition);
    cardView = (CardView) findViewById(R.id.act_main_cardView);
    //recyclerView属性设置
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
    linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    recycler.setLayoutManager(linearLayoutManager);
    //实例化定位服务的客户端
    locationClient = new LocationClient(getApplicationContext());
    //注册监听函数
    locationClient.registerLocationListener(listener);
    //配置定位SDK各配置参数,比如定位模式、定位时间间隔、坐标系类型等
    LocationClientOption option = new LocationClientOption();
    option.setLocationMode(LocationMode.Hight_Accuracy);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备
    option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系
    int span = 1000;
    option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的
    option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要
    option.setOpenGps(true);//可选,默认false,设置是否使用gps
    option.setLocationNotify(true);//可选,默认false,设置是否当GPS有效时按照1S/1次频率输出GPS结果
    option.setIsNeedLocationDescribe(true);//可选,默认false,设置是否需要位置语义化结果,可以在BDLocation.getLocationDescribe里得到,结果类似于“在北京天安门附近”
    option.setIsNeedLocationPoiList(true);//可选,默认false,设置是否需要POI结果,可以在BDLocation.getPoiList里得到
    option.setIgnoreKillProcess(false);//可选,默认true,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认不杀死
    option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集
    option.setEnableSimulateGps(false);//可选,默认false,设置是否需要过滤GPS仿真结果,默认需要
    //地图对象的操作方法与接口
    baiduMap = mapView.getMap();
    baiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);//设置地图类型 MAP_TYPE_NORMAL 普通图; MAP_TYPE_SATELLITE 卫星图;MAP_TYPE_NONE 卫星图
    baiduMap.setBuildingsEnabled(true);//设置是否允许楼块效果
    baiduMap.setMyLocationEnabled(true);//设置是否允许定位图层
    locationClient.setLocOption(option);
    locationClient.start();//开始定位
    //实例化recyclerView适配器
    adapter = new AdapterRecyclerView(this);
    //地图移动监听
    baiduMap.setOnMapStatusChangeListener(onMapStatusChangeListener);
    //我的位置点击事件
    btn_myPosition.setOnClickListener(onClickListener);

}
//地图状态改变相关接口
BaiduMap.OnMapStatusChangeListener onMapStatusChangeListener = new BaiduMap.OnMapStatusChangeListener() {
    /**
     * 手势操作地图,设置地图状态等操作导致地图状态开始改变。
     * @param status 地图状态改变开始时的地图状态
     */
    @Override
    public void onMapStatusChangeStart(MapStatus mapStatus) {

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

    }
    /**
     * 地图状态改变结束
     * @param status 地图状态改变结束后的地图状态
     */
    @Override
    public void onMapStatusChangeFinish(MapStatus mapStatus) {
        LatLng latLng = baiduMap.getMapStatus().target;
        if (geocode == null) {//如果地理编码查询接口为空
            geocode = GeoCoder.newInstance();//获取其唯一实例化
        }
        geocode.setOnGetGeoCodeResultListener(onGetGeoCoderResultListener);//设置查询结果监听者
        geocode.reverseGeoCode(new ReverseGeoCodeOption().location(latLng));//发起反地理编码请求(经纬度->地址信息)
        retrieval(latLng);
    }
} ;
//点击事件
View.OnClickListener onClickListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        switch (v.getId()){
            case R.id.act_main_btn_myPosition:
                LatLng latLng = new LatLng(latitude, longitude);//地理坐标基本数据结构
                MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newLatLngZoom(latLng, 16f);//描述地图状态将要发生的变化
                baiduMap.animateMapStatus(mapStatusUpdate);//以动画方式更新地图状态,动画耗时 300 ms
                break;
        }
    }
} ;
//地理编码/反地理编码结果
OnGetGeoCoderResultListener onGetGeoCoderResultListener = new OnGetGeoCoderResultListener() {
    @Override
    public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
        if (geoCodeResult == null || geoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {//没有检索到结果
            return;
        }
        Log.e("地理编码结果", geoCodeResult.getAddress().toString());
        Toast.makeText(MainActivity.this, geoCodeResult.getAddress().toString(), Toast.LENGTH_SHORT).show();

    }

    @Override
    public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
        if (reverseGeoCodeResult == null || reverseGeoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {//没有找到检索结果
            return;
        }
        Log.e("反 Geo Code 结果", reverseGeoCodeResult.getAddress().toString());
        if (cardView.getVisibility() == cardView.GONE) {
            cardView.setVisibility(cardView.VISIBLE);
        }
        //reverseGeoCodeResult.getAddress()简要地址信息
        tv_myPosition.setText(reverseGeoCodeResult.getAddress().toString());
    }
};
/**
 * create at 2017/4/12 11:23
 * 方法名:retrieval
 * <p>
 * 方法说明: 检索周边位置
 * <p>
 */
private void retrieval(LatLng latLng) {
    poiSearch = PoiSearch.newInstance();//创建POI检索实例
    poiSearch.setOnGetPoiSearchResultListener(poiListener);//设置POI检索监听者
    poiSearch.searchNearby(new PoiNearbySearchOption()
            .keyword("小")//检索关键字
            .radius(100)//设置检索的半径范围
            .location(latLng)//检索位置
            .pageNum(10)
            .pageCapacity(10));//发起检索请求
}

//创建POI检索监听者
OnGetPoiSearchResultListener poiListener = new OnGetPoiSearchResultListener() {
    @Override
    public void onGetPoiResult(PoiResult poiResult) {//获取POI检索结果
        Log.e("PoiResult", "城市:" + poiResult.getAllPoi().get(0).city + "/n名称:" + poiResult.getAllPoi().get(0).name + "/n地址:" + poiResult.getAllPoi().get(0).address);
        List<PoiInfo> list_poi = poiResult.getAllPoi(); //获取Poi检索结果
        for (PoiInfo p : list_poi) {
            Log.e("poi地址信息", p.address);
            Log.e("poi所在城市", p.city);
            Log.e("poi名称", p.name);
            Log.e("poi类型", p.type + "");
        }
        ArrayList<PoiInfo> arr = (ArrayList) poiResult.getAllPoi();
        adapter.setArrayList(arr);
        recycler.setAdapter(adapter);
    }

    @Override
    public void onGetPoiDetailResult(PoiDetailResult poiDetailResult) {//获取Place详情页检索结果
        Log.e("PoiDetailResult", "进入了PoiDetailResult方法");
    }

    @Override
    public void onGetPoiIndoorResult(PoiIndoorResult poiIndoorResult) {//获取室内POI搜索结果
        Log.e("PoiIndoorResult", "进入了PoiIndoorResult方法");
    }
};

public class MyLocationListener implements BDLocationListener {

    @Override
    public void onReceiveLocation(BDLocation location) {
        //获取定位结果
        StringBuffer sb = new StringBuffer(256);
        sb.append("time : ");
        sb.append(location.getTime());    //获取定位时间
        sb.append("\nerror code : ");
        sb.append(location.getLocType());    //获取类型类型
        sb.append("\nlatitude : ");
        sb.append(location.getLatitude());    //获取纬度信息
        sb.append("\nlontitude : ");
        sb.append(location.getLongitude());    //获取经度信息
        sb.append("\nradius : ");
        sb.append(location.getRadius());    //获取定位精准度
        if (location.getLocType() == BDLocation.TypeGpsLocation) {
            // GPS定位结果
            sb.append("\nspeed : ");
            sb.append(location.getSpeed());    // 单位:公里每小时
            sb.append("\nsatellite : ");
            sb.append(location.getSatelliteNumber());    //获取卫星数
            sb.append("\nheight : ");
            sb.append(location.getAltitude());    //获取海拔高度信息,单位米
            sb.append("\ndirection : ");
            sb.append(location.getDirection());    //获取方向信息,单位度
            sb.append("\naddr : ");
            sb.append(location.getAddrStr());    //获取地址信息
            sb.append("\ndescribe : ");
            sb.append("gps定位成功");
        } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {
            // 网络定位结果
            sb.append("\naddr : ");
            sb.append(location.getAddrStr());    //获取地址信息
            sb.append("\noperationers : ");
            sb.append(location.getOperators());    //获取运营商信息
            sb.append("\ndescribe : ");
            sb.append("网络定位成功");
        } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {
            // 离线定位结果
            sb.append("\ndescribe : ");
            sb.append("离线定位成功,离线定位结果也是有效的");
        } else if (location.getLocType() == BDLocation.TypeServerError) {
            sb.append("\ndescribe : ");
            sb.append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因");
        } else if (location.getLocType() == BDLocation.TypeNetWorkException) {
            sb.append("\ndescribe : ");
            sb.append("网络不同导致定位失败,请检查网络是否通畅");
        } else if (location.getLocType() == BDLocation.TypeCriteriaException) {
            sb.append("\ndescribe : ");
            sb.append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机");
        }
        sb.append("\nlocationdescribe : ");
        sb.append(location.getLocationDescribe());    //位置语义化信息
        List<Poi> list = location.getPoiList();    // POI数据
        if (list != null) {
            sb.append("\npoilist size = : ");
            sb.append(list.size());
            for (Poi p : list) {
                sb.append("\npoi= : ");
                sb.append(p.getId() + " " + p.getName() + " " + p.getRank());
            }
        }
        Log.i("BaiduLocationApiDem", sb.toString());

        latitude = location.getLatitude();
        longitude = location.getLongitude();
        // map view 销毁后不在处理新接收的位置
        if (location == null || mapView == null)
            return;
        MyLocationData locData = new MyLocationData.Builder()
                .accuracy(location.getRadius())
                .direction(100)// 此处设置开发者获取到的方向信息,顺时针0-360
                .latitude(location.getLatitude())
                .longitude(location.getLongitude())
                .build();
        baiduMap.setMyLocationData(locData);
        if (isFirstLogin) {//如果是第一次加载地图
            isFirstLogin = false;
            LatLng ll = new LatLng(location.getLatitude(), location.getLongitude());//地理坐标基本数据结构
            MapStatusUpdate u = MapStatusUpdateFactory.newLatLngZoom(ll, 16.0f);//设置地图中心点以及缩放级别
            baiduMap.animateMapStatus(u);//以动画方式更新地图状态,动画耗时 300 ms
            retrieval(new LatLng(latitude, longitude));//检索周边信息
            geocode = GeoCoder.newInstance();//获取新建地理编码查询
            geocode.setOnGetGeoCodeResultListener(onGetGeoCoderResultListener);//设置查询结果监听者
            geocode.reverseGeoCode(new ReverseGeoCodeOption().location(ll));//发起反地理编码请求(经纬度->地址信息)
        }
    }

    @Override
    public void onConnectHotSpotMessage(String s, int i) {

    }
}

@Override
protected void onPause() {
    mapView.onPause();//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
    super.onPause();
}

@Override
protected void onDestroy() {
    mapView.onDestroy();//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
    if (poiSearch != null) {
        poiSearch.destroy();
    }
    if (geocode != null) {
        geocode.destroy();
    }
    super.onDestroy();
}

@Override
protected void onRestart() {
    mapView.onResume();//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
    super.onRestart();}}

4858美高梅 2

百度地图坐标转换接口如下:  

三.使用百度地图逆地理编码服务接口(

XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.wentong.zt.map.MainActivity">

<RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="?actionBarSize"
    android:gravity="center_vertical">

    <Button
        android:id="@+id/act_main_btn_retrieval"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_alignParentLeft="true"
        android:text="返回" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="位置信息" />

    <Button
        android:id="@+id/act_main_btn_myPosition"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_alignParentRight="true"
        android:text="我的位置" />

</RelativeLayout>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

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

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                android:gravity="center"
                android:orientation="vertical">

                <android.support.v7.widget.CardView
                    android:id="@+id/act_main_cardView"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:visibility="gone">

                    <TextView
                        android:id="@+id/act_main_tv_myPosition"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_margin="5dp"
                        android:textColor="#000000" />

                </android.support.v7.widget.CardView>

                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/mark_normal" />

            </LinearLayout>

        </RelativeLayout>

  </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        android:layout_weight="2">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/act_main_recycler"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="#ffffff">
        </android.support.v7.widget.RecyclerView>

    </LinearLayout>

</LinearLayout>

</LinearLayout>

什么是地理编码/逆地理编码?

  BMap.Convertor.translate(gpsPoint,0,translateCallback);    
//真实经纬度转成都百货度坐标

*
注意五个接口填写的经纬度的次第不雷同:

AdapterRecyclerView:

package com.wentong.zt.map;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.baidu.mapapi.search.core.PoiInfo;
import java.util.ArrayList;
import static com.baidu.location.h.j.ar;
/**
 * Created by Administrator on 2017/4/12.
 */

public class AdapterRecyclerView extends RecyclerView.Adapter<AdapterRecyclerView.My>{


Context context ;
ArrayList<PoiInfo> arrayList ;

public AdapterRecyclerView(Context context) {
    this.context = context;
    arrayList = new ArrayList<>() ;
}

public ArrayList<PoiInfo> getArrayList() {
    return arrayList;
}

public void setArrayList(ArrayList<PoiInfo> arrayList) {
    this.arrayList = arrayList;
}

@Override
public My onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(context).inflate(R.layout.adapter_recycler , parent , false) ;
    My my = new My(view) ;
    return my;
}

@Override
public void onBindViewHolder(My holder, int position) {
    holder.tv_city.setText(arrayList.get(position).address);
    holder.tv_name.setText(arrayList.get(position).name);
}

@Override
public int getItemCount() {
    return arrayList.size();
}

class My extends RecyclerView.ViewHolder{

    TextView tv_name , tv_city ;
    public My(View itemView) {
        super(itemView);
        tv_name = (TextView) itemView.findViewById(R.id.ada_recycler_tv_name) ;
        tv_city = (TextView) itemView.findViewById(R.id.ada_recycler_tv_city) ;
    }
}
 }

地理编码又称地点相称,指的是从已知的结构化地址描述(如:柳河县阜通东北高校街
陆 号)到相应的中纬度坐标(如:11陆.482268,3九.99016一)的变换,即基于结构化的地方新闻,查询所对应的点坐标的历程。高德地图地理编码接口通过
HTTP  请求直接待上访问。同时帮忙地理编码的逆进程,即:逆地理编码。

中间gpsPoint var gpsPoint = new
BMap.Point(经度,纬度); ( GPS坐标)    0:代表GPS,也能够是贰:google坐标    translateCallback:回掉函数

  坐标转换接口:经度在前,纬度在后(经度,纬度);逆地理编码:纬度在前,经度在后(纬度,经度)

adapter_recycler XML:

 <?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="wrap_content"
android:layout_marginBottom="5dp"
android:layout_marginTop="5dp"
android:orientation="vertical">

<android.support.v7.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        android:padding="10dp">

        <TextView
            android:id="@+id/ada_recycler_tv_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center" />

        <TextView
            android:id="@+id/ada_recycler_tv_city"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp"
            android:gravity="center" />

    </LinearLayout>

</android.support.v7.widget.CardView>

</LinearLayout>

API密钥

 

 

题外话:

  • 收10思路:
    一、大家要在手提式无线电话机上显得出百度地图:
    xml:
    <com.baidu.mapapi.map.MapView
    android:id=”@+id/act_main_【4858美高梅】百度地图,获取用户精准地理位置音信。mapView”
    android:layout_width=”match_parent”
    android:layout_height=”match_parent”>
    </com.baidu.mapapi.map.MapView>
    在采取SDK各组件在此之前起头化context音信,传入ApplicationContext
    注意该办法要再setContentView方法此前完成
    4858美高梅,SDKInitializer.initialize(getApplicationContext());
    二、怎么样获得大家的职位

定位请求回调接口

private BDLocationListener listener = new MyLocationListener();

       public class MyLocationListener implements BDLocationListener {

        @Override
        public void onReceiveLocation(BDLocation location) {
        //获取定位结果
        StringBuffer sb = new StringBuffer(256);
        sb.append("time : ");
        sb.append(location.getTime());    //获取定位时间
        sb.append("\nerror code : ");
        sb.append(location.getLocType());    //获取类型类型
        sb.append("\nlatitude : ");
        sb.append(location.getLatitude());    //获取纬度信息
        sb.append("\nlontitude : ");
        sb.append(location.getLongitude());    //获取经度信息
        sb.append("\nradius : ");
        sb.append(location.getRadius());    //获取定位精准度
        if (location.getLocType() == BDLocation.TypeGpsLocation) {
            // GPS定位结果
            sb.append("\nspeed : ");
            sb.append(location.getSpeed());    // 单位:公里每小时
            sb.append("\nsatellite : ");
            sb.append(location.getSatelliteNumber());    //获取卫星数
            sb.append("\nheight : ");
            sb.append(location.getAltitude());    //获取海拔高度信息,单位米
            sb.append("\ndirection : ");
            sb.append(location.getDirection());    //获取方向信息,单位度
            sb.append("\naddr : ");
            sb.append(location.getAddrStr());    //获取地址信息
            sb.append("\ndescribe : ");
            sb.append("gps定位成功");
        } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {
            // 网络定位结果
            sb.append("\naddr : ");
            sb.append(location.getAddrStr());    //获取地址信息
            sb.append("\noperationers : ");
            sb.append(location.getOperators());    //获取运营商信息
            sb.append("\ndescribe : ");
            sb.append("网络定位成功");
        } else if (location.getLocType() == BDLocation.TypeOffLineLocation) {
            // 离线定位结果
            sb.append("\ndescribe : ");
            sb.append("离线定位成功,离线定位结果也是有效的");
        } else if (location.getLocType() == BDLocation.TypeServerError) {
            sb.append("\ndescribe : ");
            sb.append("服务端网络定位失败,可以反馈IMEI号和大体定位时间到loc-bugs@baidu.com,会有人追查原因");
        } else if (location.getLocType() == BDLocation.TypeNetWorkException) {
            sb.append("\ndescribe : ");
            sb.append("网络不同导致定位失败,请检查网络是否通畅");
        } else if (location.getLocType() == BDLocation.TypeCriteriaException) {
            sb.append("\ndescribe : ");
            sb.append("无法获取有效定位依据导致定位失败,一般是由于手机的原因,处于飞行模式下一般会造成这种结果,可以试着重启手机");
        }
        sb.append("\nlocationdescribe : ");
        sb.append(location.getLocationDescribe());    //位置语义化信息
        List<Poi> list = location.getPoiList();    // POI数据
        if (list != null) {
            sb.append("\npoilist size = : ");
            sb.append(list.size());
            for (Poi p : list) {
                sb.append("\npoi= : ");
                sb.append(p.getId() + " " + p.getName() + " " + p.getRank());
            }
        }
        Log.i("BaiduLocationApiDem", sb.toString());

        location.getLatitude();//纬度
        location.getLongitude();//经度

    @Override
    public void onConnectHotSpotMessage(String s, int i) {

    }
  }

咱俩的职责(经纬度)

location.getLatitude();//纬度
location.getLongitude();//经度

3、怎么样在显示屏中展现大家脚下的岗位:

LatLng latLng = new LatLng(纬度, 经度);
MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newLatLngZoom(latLng, 16f);
baiduMap.animateMapStatus(mapStatusUpdate);

四、滑动地图标注跟着一块儿动?

唯其如此说马上自家也是懵逼状态,万幸本少爷天资纵横。
那实际是本人的一种错觉,依据初级中学物理所学,物体的活动是互相的。笔者看看的标注随着地图滑动而运动是漏洞百出的,其实10分标注从未移动,是自家的眼眸欺诈了本人。想理解那点做那几个就很简短了。大家在布局中的地图正核心钉死一张图片,然后大家赢得在荧屏正着力的经纬度。依照经纬度获取地理地点消息,依据经纬度举行Poi检索。

高德地图地理编码 API 使用 API 密钥来标识用户的施用。服务请求 url 中的
key  参数为必填参数,要求填写此密钥。所以,使用接口前请获取
Key

 

演示代码:注意引进jQuery文件

XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.wentong.zt.map.MainActivity">

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent">

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

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                android:gravity="center"
                android:orientation="vertical">

                <android.support.v7.widget.CardView
                    android:id="@+id/act_main_cardView"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:visibility="gone">

                    <TextView
                        android:id="@+id/act_main_tv_myPosition"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_margin="5dp"
                        android:textColor="#000000" />

                </android.support.v7.widget.CardView>


                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/mark_normal" />

            </LinearLayout>

        </RelativeLayout>

    </LinearLayout>
</LinearLayout>

伍、地图移动监听:

地图对象的操作方法与接口

baiduMap = mapView.getMap();

地图移动监听

baiduMap.setOnMapStatusChangeListener(onMapStatusChangeListener);

地图状态改变相关接口

BaiduMap.OnMapStatusChangeListener onMapStatusChangeListener = new BaiduMap.OnMapStatusChangeListener() {
    /**
     * 手势操作地图,设置地图状态等操作导致地图状态开始改变。
     * @param status 地图状态改变开始时的地图状态
     */
    @Override
    public void onMapStatusChangeStart(MapStatus mapStatus) {

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

    }
    /**
     * 地图状态改变结束
     * @param status 地图状态改变结束后的地图状态
     */
    @Override
    public void onMapStatusChangeFinish(MapStatus mapStatus) {
        LatLng latLng = baiduMap.getMapStatus().target;//地图操作中心点在屏幕中的坐标
        if (geocode == null) {
            geocode = GeoCoder.newInstance();
        }
        //根据坐标获取地理位置信息,也就是百度官网所说的反Geo地理编码
        geocode.setOnGetGeoCodeResultListener(onGetGeoCoderResultListener);
        geocode.reverseGeoCode(new ReverseGeoCodeOption().location(latLng));
        retrieval(latLng);//根据经纬度检索周边信息
    }
} ;

六、地理编码,反地理编码

通俗点讲 :
地理编码正是依照地理地点音讯获得经纬度(例:广岛–(经度,纬度))
反地理编码正是依照经纬度获取地理地点消息(例:(经度,纬度)–长崎)

地理编码查询接口

GeoCoder geocode = GeoCoder.newInstance();
geocode.setOnGetGeoCodeResultListener(onGetGeoCoderResultListener);
geocode.reverseGeoCode(new ReverseGeoCodeOption().location(latLng));

地理编码、反地理编码结果

OnGetGeoCoderResultListener onGetGeoCoderResultListener = new OnGetGeoCoderResultListener() {
    @Override
    public void onGetGeoCodeResult(GeoCodeResult geoCodeResult) {
        if (geoCodeResult == null || geoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {//没有检索到结果
            return;
        }
        Log.e("地理编码结果", geoCodeResult.getAddress().toString());

    }

    @Override
    public void onGetReverseGeoCodeResult(ReverseGeoCodeResult reverseGeoCodeResult) {
        if (reverseGeoCodeResult == null || reverseGeoCodeResult.error != SearchResult.ERRORNO.NO_ERROR) {//没有找到检索结果
            return;
        }
        Log.e("反 Geo Code 结果", reverseGeoCodeResult.getAddress().toString());
    }
};

七、Poi之广大音信寻找

PoiSearch poiSearch = PoiSearch.newInstance();//创建POI检索实例
poiSearch.setOnGetPoiSearchResultListener(poiListener);//设置POI检索监听者
poiSearch.searchNearby(new PoiNearbySearchOption()
            .keyword("小")//检索关键字
            .radius(100)//设置检索的半径范围
            .location(new LatLng(纬度, 经度))//检索位置
            .pageNum(10)//分页编号
            .pageCapacity(10));//发起检索请求

应用表明

上面是一体化的测试GPS坐标转换百度坐标JS源码:

 1 <!DOCTYPE HTML>
 2 <html>
 3 <head>
 4     <meta charset="utf-8">
 5     <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
 6     <title>HTML5获取地理位置定位信息</title>
 7     <meta name="keywords" content="html5,地理位置"/>
 8 </head>
 9 <body>
10 
11 <div class="demo">
12     <p>地理坐标:<br/></p>
13     <div class="geo">
14         <p>百度地图定位位置:</p>
15         <p id="baidu_geo"></p>
16     </div>
17 </div>
18 
19 <script type="text/javascript" src="js/jquery.min.js"></script>
20 <script>
21     function getLocation() {
22         if (navigator.geolocation) {
23             navigator.geolocation.getCurrentPosition(showPosition, showError);
24         } else {
25             alert("浏览器不支持地理定位...");
26         }
27     }
28 
29     function showPosition(position) {
30         $("#latlon").html("纬度:" + position.coords.latitude + ',经度:' + position.coords.longitude);
31         // 坐标转换:经度在前,纬度在后(经度,纬度)
32         // 逆地理编码:纬度在前,经度在后(纬度,经度)
33         var latlon = position.coords.longitude + ',' + position.coords.latitude;
34         var changeLatlon = '';
35         // 百度地图坐标转换
36         var changeUrl = 'http://api.map.baidu.com/geoconv/v1/?coords=' + latlon + '&from=1&to=5&ak=lRRyy6qoBwnAgj3w4ugGFqoSsWC8du3v';
37         $.ajax({
38             type: "GET",
39             dataType: "jsonp",
40             url: changeUrl,
41             success: function (json) {
42                 if (json.status == 0) {
43                     $.each(json.result,function (i,v) {
44                         // 逆地理编码:纬度在前,经度在后
45                         changeLatlon = v.y + ',' + v.x;
46                     });
47                     //百度地图逆地理编码
48                     var url = "http://api.map.baidu.com/geocoder/v2/?ak=lRRyy6qoBwnAgj3w4ugGFqoSsWC8du3v&callback=renderReverse&location=" + changeLatlon + "&output=json&pois=0";
49                     $.ajax({
50                         type: "GET",
51                         dataType: "jsonp",
52                         url: url,
53                         beforeSend: function () {
54                             $("#baidu_geo").html('正在定位...');
55                         },
56                         success: function (json) {
57                             if (json.status == 0) {
58                                 $("#baidu_geo").html(json.result.formatted_address);
59                             }
60                         },
61                         error: function (XMLHttpRequest, textStatus, errorThrown) {
62                             $("#baidu_geo").html(changeLatlon + "的地址位置获取失败");
63                         }
64                     });
65                 }
66             },
67             error: function (XMLHttpRequest, textStatus, errorThrown) {
68                 alert("坐标转换失败");
69             }
70         });
71     }
72 
73     // 定位失败 传 默认地址
74     function showError(error) {
75         switch (error.code) {
76             case error.PERMISSION_DENIED:
77                 alert("定位失败,用户拒绝请求地理定位");
78                 break;
79             case error.POSITION_UNAVAILABLE:
80                 alert("定位失败,位置信息不可用");
81                 break;
82             case error.TIMEOUT:
83                 alert("定位失败,请求获取用户位置超时");
84                 break;
85             case error.UNKNOWN_ERROR:
86                 alert("定位失败,定位系统失效");
87                 break;
88         }
89     }
90 
91     getLocation();
92 
93 </script>
94 </body>
95 </html>

8、github地址:https://github.com/DingMr/Map

如无特殊注明,接口的输入参数和出据编码全体合并为 utf-八。

 

 

地理编码请求

4858美高梅 3

—————————————–END—————————————

高德地图地理编码 API  服务地点:

4858美高梅 4

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
body, html,#allmap {width: 100%;height: 100%;overflow: hidden;margin:0;}
#l-map{height:100%;width:78%;float:left;border-right:2px solid #bcbcbc;}
#r-result{height:100%;width:20%;float:left;}
</style>
<script type="text/javascript" src="http://api.map.baidu.com/api?v=1.5&ak=ofB5rD1KWbtxVkTAIqscalKf2uOf55En"></script>
<script type="text/javascript" src="http://developer.baidu.com/map/jsdemo/demo/convertor.js"></script>
<title>GPS转百度</title>
</head>
<body>
<div id="allmap"></div>
</body>
</html>
<script type="text/javascript">
//GPS坐标
var xx = 117.126575995835;
var yy = 36.6702207308909;
var gpsPoint = new BMap.Point(xx,yy);

//地图初始化
var bm = new BMap.Map("allmap");
bm.centerAndZoom(gpsPoint, 15);
bm.addControl(new BMap.NavigationControl());

//添加谷歌marker和label
var markergps = new BMap.Marker(gpsPoint);
bm.addOverlay(markergps); //添加GPS标注
var labelgps = new BMap.Label("我是GPS标注哦",{offset:new BMap.Size(20,-10)});
markergps.setLabel(labelgps); //添加GPS标注

//坐标转换完之后的回调函数
translateCallback = function (point){
    var marker = new BMap.Marker(point);
    bm.addOverlay(marker);
    var label = new BMap.Label("我是百度标注哦",{offset:new BMap.Size(20,-10)});
    marker.setLabel(label); //添加百度label
    bm.setCenter(point);
    alert("转化为百度坐标为:"+point.lng + "," + point.lat);
}

setTimeout(function(){
    BMap.Convertor.translate(gpsPoint,0,translateCallback);     //真实经纬度转成百度坐标
}, 2000);
</script>

parameters
 代表的参数包含必填参数和可选参数。全部参数均使用和号字符(&)举行分隔。

4858美高梅 5

下边的列表枚举了这一个参数及其恐怕的值。

4858美高梅 6

必填参数

 

参数名称

找到百度的API转换方法为:

含义

 

规则表达

    

key

 

用户唯壹标识

    其中:
    from: 来源坐标系   (0表示原始GPS坐标,二象征谷歌坐标)
      to: 转换后的坐标   (4正是百度协调啦,好像这些必须是四才行)
        x: 经度
            y: 纬度
            再次回到的结果是一个json字符串:
          
{“error”:0,”x”:”MTIxLjUwMDIyODIxNDk2″,”y”:”MzEuMjM1ODUwMjYwMTE3″}

用户在高德地图官网申请

 

address

            其中:
            error:是结果是或不是出错标志位,”0″表示OK
            x: 百度坐标系的经度(Base6四加密)
            y: 百度坐标系的纬度(Base64加密)

格式化地址音信

 

东京市二道区阜通东北大学街陆号

证实:address
参数值输入尽或者详细的地点消息,以便赢得精准的地方相称结果;同时 address
 参数值也支撑标志性建筑名称,如“安定门”。

地理编码响应

地理编码的响应结果格式由请求参数 outputoutput output 钦赐

下边示例地理编码 API 关于“东京市长白朝鲜族自治县阜通东北高校街 陆  号”查询请求:

回到的JSON结果示例:

{ status: “1”, info: “OK”, count: “1”, geocodes: [ {
formatted_address: “盛冈市梅河口市阜通东北大学街六号”, province: “法国巴黎市”,
citycode: “010”, city: [ ], district: “朝阳区”, township: [ ],
neighborhood: { name: [ ], type: [ ] }, building: { name: [
],type: [ ] }, adcode: “1十105”, street: “阜通东北大学街”, number: “6号”,
location: “11陆.482605,3九.9901九三”, level: “门牌号” } ] }

逆地理编码请求

高德地图逆地理编码 API  服务地点:

parameters
 代表的参数包蕴必填参数和可选参数。全部参数均使用和号字符(&)举办分隔。

上面包车型客车列表枚举了这一个参数及其恐怕的值。

必填参数

参数名称

含义

规则表达

key

用户唯1标识

用户在高德地图官网申请

location

经纬度坐标音讯

经度在前,维度在后,经纬度间以“,”分隔,经纬度小数点后不超越五个人

地理编码的响应结果格式由请求参数 outputoutput output 钦定

逆地理编码响应

上边是逆地编码理json请求示例:

初稿链接:

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 美高梅手机版4858 版权所有