61阅读

百度地图api实时定位-美团app怎么使用订单中百度地图定位餐厅位置?

发布时间:2018-02-03 所属栏目:android实现实时定位

一 : 美团app怎么使用订单中百度地图定位餐厅位置?

在美团中看中了一家餐厅,但是不想让他们送餐,想要下了订单以后直接去找这家餐厅,该怎么找呢?下面我们就来看看详细的教程。

软件名称:
美团团购 for android V7.0.1 安卓版
软件大小:
21.4MB
更新时间:
2016-06-25

1、在手机中找到美团app标志,点按进入该应用。

2、进入美团之后点按界面下方的订单标志,在下一个界面点按界面上方的待使用标志

3、在待使用界面中找到其中一个待使用的订单,点按进入该订单,如下图所示。

4、进入该待使用订单后点按箭头指向的商家信息下的店名,如下图所示。

5、进入店名之后点按该店的位置,如下图所示。

6、此时界面进入地图界面,由于默认的地图是高德地图,高德地图并没有百度地图用起来方便,因此点按界面上方的使用其他地图标志。

7、进入百度地图界面后,点按箭头指向的“到这去”标志。

8、根据实际情况选择出行方式后,点按导航标志

以上就是通过美团订单查找餐厅位置的方法,感兴趣的朋友可以查看店家具体位置,请继续关注61阅读。

相关推荐:

美团app怎么在跑腿代购下单?

美团外卖app怎么删除订单记录?

美团外卖app怎么购买会员? 美团外卖会员的特权

二 : Android应用中使用百度地图API定位自己的位置(二)

百度地图SDK为开发者们提供了如下类型的地图覆盖物:

  • 我的位置图层(MyLocationOverlay):用于显示用户当前位置的图层(支持自定义位置图标);

  • Poi搜索结果图层(PoiOverlay):用于显示兴趣点搜索结果的图层;

  • 路线图层(RouteOverlay):公交、步行和驾车线路图层,将公交、步行和驾车出行方案的路线及关键点显示在地图上(起、终点图标用户可自定义);

  • 公交换乘图层(TransitOverlay):公交换乘线路图层,将某一特定地区的公交出行方案的路线及换乘位置显示在地图上(起、终点图标用户可自定义);

  • 自定义图层(ItemizedOverlay):可将一个或多个兴趣点绘制到地图上,且支持自定义图标(支持动态更新Item位置、图标);

  • 弹出窗图层(PopupOverlay):在地图上显示一个弹出窗口;

  • 几何图形绘制图层(GraphicsOverlay):用于绘制点、折线段、弧线、圆、矩形、多边形等几何图形的图层;

  • 文字绘制图层(TextOverlay):用于绘制文字的图层。

  • 图片图层(GroundOverlay):用于展示用户传入图片的图层。

  • 全景图图层(PanoramaOverlay):在全景图内标绘兴趣点,支持自定义图标样式。

    注:除弹出窗图层外,其他各个图层均已实现多实例。全景图图层是针对全景图所使用的特殊图层。(www.61k.com)

    MapView使用一个List管理覆盖物,通过向MapView.getOverlays() add或remove上述类或其基类的实例即可向地图添加或删除覆盖物。在更新地图覆盖物后,需调用MapView.refresh() 使更新生效。

    定位原理

    使用百度Android定位SDK必须注册GPS和网络使用权限。定位SDK采用GPS、基站、Wi-Fi信号进行定位。当应用程序向定位SDK发起定位请求时,定位SDK会根据应用的定位因素(GPS、基站、Wi-Fi信号)的实际情况(如是否开启GPS、是否连接网络、是否有信号等)来生成相应定位依据进行定位。
    用户可以设置满足自身需求的定位依据:
    若用户设置GPS优先,则优先使用GPS进行定位,如果GPS定位未打开或者没有可用位置信息,且网络连接正常,定位SDK则会返回网络定位(即Wi-Fi与基站)的最优结果。为了使获得的网络定位结果更加精确,请打开手机的Wi-Fi开关。

    下面我们将利用 MyLocationOverlay和 PopupOverlay 这两个类

    一 . 导入库文件

    在使用百度定位SDKv4.0之前,我们要下载最新的库文件,下载地址:点击下载相关库文件,将liblocSDK4.so文件拷贝到libs/armeabi目录下。将locSDK4.0.jar文件拷贝到工程的libs目录下

    目录结构如下:

    库文件下载地址:http:/喎?http://www.2cto.com/kf/ware/vc/" target="_blank">vcGFuLmJhaWR1LmNvbS9zLzFudE5xS3dwPC9wPgo8cD62/iAuILK8vtbOxLz+o6zSu7j2sNm2yLXYzby/2Lz+o6y809K7uPbK1ravteO798q1z9a2qM67tcSwtMWlPC9wPgo8cD4mbmJzcDs8L3A+CjxwcmUgY2xhc3M9"brush:java;">
    然后是主 Activity

    package com.majianjie.baidumap;import android.app.Activity;import android.graphics.Bitmap;import android.graphics.drawable.Drawable;import android.os.Bundle;import android.view.LayoutInflater;import android.view.Menu;import android.view.MenuItem;import android.view.View;import android.view.View.MeasureSpec;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.mapapi.BMapManager;import com.baidu.mapapi.MKGeneralListener;import com.baidu.mapapi.map.LocationData;import com.baidu.mapapi.map.MKEvent;import com.baidu.mapapi.map.MKMapViewListener;import com.baidu.mapapi.map.MapController;import com.baidu.mapapi.map.MapPoi;import com.baidu.mapapi.map.MapView;import com.baidu.mapapi.map.MyLocationOverlay;import com.baidu.mapapi.map.PopupClickListener;import com.baidu.mapapi.map.PopupOverlay;import com.baidu.platform.comapi.basestruct.GeoPoint;import com.example.baidumap.R;public class MainActivity extends Activity {//声明控件private Button request;private Toast mToast=null;private BMapManager mBMapManager=null;private MapView mMapView = null;//MapView 是地图主控件private MapController mMapController = null;//用MapController完成地图控制private LocationClient mLocClient; public LocationData mLocData = null; private LocationOverlay myLocationOverlay = null;//定位图层private boolean isRequest = false;//是否手动触发请求定位 private boolean isFirstLoc = true;//是否首次定位 private PopupOverlay mPopupOverlay = null;//弹出泡泡图层,浏览节点时使用 private View viewCache=null; public BDLocation location = new BDLocation(); @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//**使用地图sdk前需先初始化BMapManager,这个必须在setContentView()先初始化mBMapManager = new BMapManager(this);//第一个参数是API key, 第二个参数是常用事件监听,用来处理通常的网络错误,授权验证错误等,你也可以不添加这个回调接口mBMapManager.init(LDtH1sVwr7kygaF0aTqaVwWU, new MKGeneralListener() {//授权错误的时候调用的回调函数@Overridepublic void onGetPermissionState(int iError) {if (iError == MKEvent.ERROR_PERMISSION_DENIED) {showToast(API KEY错误, 请检查!); }}//一些网络状态的错误处理回调函数@Overridepublic void onGetNetworkState(int iError) {if (iError == MKEvent.ERROR_NETWORK_CONNECT) {Toast.makeText(getApplication(), 您的网络出错啦!, Toast.LENGTH_LONG).show(); }}});//初始化init();//单击事件click();}//* 显示Toast消息 private void showToast(String msg){ if(mToast == null){ mToast = Toast.makeText(this, msg, Toast.LENGTH_SHORT); }else{ mToast.setText(msg); mToast.setDuration(Toast.LENGTH_SHORT); } mToast.show(); } private void click() {request.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View arg0) {requestLocation();}});}@Overrideprotected void onResume() { //MapView的生命周期与Activity同步,当activity挂起时需调用MapView.onPause()mMapView.onResume();mBMapManager.start();//重新启动super.onResume();}@Overrideprotected void onPause() {//MapView的生命周期与Activity同步,当activity挂起时需调用MapView.onPause()mMapView.onPause();super.onPause();}private void init() {//使用自定义的title,注意顺序setContentView(R.layout.activity_main); //activity的布局 //这里是添加自己定义的titlebtn.xml//通过id找到他们mMapView = (com.baidu.mapapi.map.MapView) findViewById(R.id.bmapView);mMapController=mMapView.getController(); //获取地图控制器mMapController.enableClick(true); //设置地图是否响应点击事件request=(Button)findViewById(R.id.request);viewCache = LayoutInflater.from(this).inflate(R.layout.pop_layout, null);mPopupOverlay= new PopupOverlay(mMapView, new PopupClickListener() {// * 点击弹出窗口图层回调的方法@Overridepublic void onClickedPopup(int arg0) {//隐藏弹出窗口图层 mPopupOverlay.hidePop(); }}); mMapController.enableClick(true); //* 设置地图是否响应点击事件 . mMapController.setZoom(12);// * 设置地图缩放级别 mMapView.setBuiltInZoomControls(true); // * 显示内置缩放控件 mMapView.setTraffic(true); mLocData = new LocationData(); mLocClient = new LocationClient(getApplicationContext()); // * 定位SDK的核心类 //实例化定位服务,LocationClient类必须在主线程中声明 mLocClient.registerLocationListener(new BDLocationListenerImpl());//注册定位监听接口 /** * 设置定位参数 */LocationClientOption option = new LocationClientOption();option.setOpenGps(true); //打开GPRSoption.setAddrType(all);//返回的定位结果包含地址信息option.setCoorType(bd09ll);//返回的定位结果是百度经纬度,默认值gcj02option.setScanSpan(5000); //设置发起定位请求的间隔时间为5000msoption.disableCache(false);//禁止启用缓存定位option.setPoiNumber(5); //最多返回POI个数 option.setPoiDistance(1000); //poi查询距离 option.setPoiExtraInfo(true); //是否需要POI的电话和地址等详细信息 mLocClient.setLocOption(option);mLocClient.start(); //调用此方法开始定位 myLocationOverlay = new LocationOverlay(mMapView);//定位图层初始化 //将定位数据设置到定位图层里 myLocationOverlay.setMarker(getResources().getDrawable(R.drawable.set)); //添加定位图层 mMapView.getOverlays().add(myLocationOverlay); myLocationOverlay.enableCompass(); //更新图层数据执行刷新后生效 mMapView.refresh(); /* //准备要添加的Overlay double mLat1 = 39.910159; double mLon1 = 119.544697; // 用给定的经纬度构造GeoPoint,单位是微度 (度 * 1E6) GeoPoint p1 = new GeoPoint((int) (mLat1 * 1E6), (int) (mLon1 * 1E6)); //准备overlay图像数据,根据实情情况修复 Drawable mark= getResources().getDrawable(R.drawable.set); //用OverlayItem准备Overlay数据 OverlayItem item1 = new OverlayItem(p1,item1,item1); //使用setMarker()方法设置overlay图片,如果不设置则使用构建ItemizedOverlay时的默认设置 //创建IteminizedOverlay CustomItemizedOverlay itemOverlay = new CustomItemizedOverlay(mark, mMapView); //将IteminizedOverlay添加到MapView中 mMapView.getOverlays().clear(); mMapView.getOverlays().add(itemOverlay); //现在所有准备工作已准备好,使用以下方法管理overlay. //添加overlay, 当批量添加Overlay时使用addItem(List

    扩展:android定位api / android 谷歌定位api / android 基站定位api

    )效率更高 itemOverlay.addItem(item1); //删除overlay . //itemOverlay.removeItem(itemOverlay.getItem(0)); //mMapView.refresh(); //清除overlay // itemOverlay.removeAll(); // mMapView.refresh(); mMapView.refresh(); */ // mMapController.setCenter(p1); mMapView.regMapViewListener(mBMapManager, new MKMapViewListener() { // * 地图移动完成时会回调此接口 方法@Overridepublic void onMapMoveFinish() {showToast(地图移动完毕!);} //* 地图加载完毕回调此接口方法@Overridepublic void onMapLoadFinish() {showToast(地图载入完毕!);} //* 地图完成带动画的操作(如: animationTo())后,此回调被触发@Overridepublic void onMapAnimationFinish() {} //当调用过 mMapView.getCurrentMap()后,此回调会被触发 可在此保存截图至存储设备@Overridepublic void onGetCurrentMap(Bitmap arg0) {} //* 点击地图上被标记的点回调此方法@Overridepublic void onClickMapPoi(MapPoi arg0) {if (arg0 != null){showToast(arg0.strText);}}}); }@Overridepublic boolean onCreateOptionsMenu(Menu menu) {super.onCreateOptionsMenu(menu);CreateMenu(menu);return true;}private void CreateMenu(Menu menu){MenuItem mnu1 =menu.add(0,0,0,显示卫星地图);{mnu1.setAlphabeticShortcut('a');//设置快捷键//mnu1.serIcon(R.drawable.icon);//设置图片}MenuItem mnu2 =menu.add(0,1,1,显示街道地图);{mnu2.setAlphabeticShortcut('b');//设置快捷键//mnu1.serIcon(R.drawable.icon);//设置图片}MenuItem mnu3 =menu.add(0,2,2,3D地图);{mnu3.setAlphabeticShortcut('c');//设置快捷键//mnu1.serIcon(R.drawable.icon);//设置图片}}@Override public boolean onOptionsItemSelected(MenuItem item) { if(item.getItemId() == 0){ mMapView.setSatellite(true);//设置显示为卫星地图: mMapView.setTraffic(false); }else if(item.getItemId() == 1){ mMapView.setTraffic(true);//显示街道地图 mMapView.setSatellite(false); }else if(item.getItemId() == 2){ //mMapView.se } return true; }public class BDLocationListenerImpl implements BDLocationListener { // * 接收异步返回的定位结果,参数是BDLocation类型参数 @Override public void onReceiveLocation(BDLocation location) { if (location == null) { return; } /* StringBuffer sb = new StringBuffer(256); sb.append(time : ); sb.append(location.getTime()); sb.append(error code : ); sb.append(location.getLocType()); sb.append(latitude : ); sb.append(location.getLatitude()); sb.append(lontitude : ); sb.append(location.getLongitude()); sb.append(radius : ); sb.append(location.getRadius()); if (location.getLocType() == BDLocation.TypeGpsLocation){ sb.append(speed : ); sb.append(location.getSpeed()); sb.append(satellite : ); sb.append(location.getSatelliteNumber()); } else if (location.getLocType() == BDLocation.TypeNetWorkLocation){ sb.append(addr : ); sb.append(location.getAddrStr()); } */ MainActivity.this.location = location; mLocData.latitude = location.getLatitude(); mLocData.longitude = location.getLongitude(); //如果不显示定位精度圈,将accuracy赋值为0即可 mLocData.accuracy = location.getRadius(); mLocData.direction = location.getDerect(); //将定位数据设置到定位图层里 myLocationOverlay.setData(mLocData); //更新图层数据执行刷新后生效 mMapView.refresh(); if(isFirstLoc || isRequest){ //将给定的位置点以动画形式移动至地图中心 mMapController.animateTo(new GeoPoint( (int) (location.getLatitude() * 1e6), (int) (location.getLongitude() * 1e6))); showPopupOverlay(location); //载入时候就弹出 isRequest = false; } isFirstLoc = false; } // 接收异步返回的POI查询结果,参数是BDLocation类型参数 @Override public void onReceivePoi(BDLocation poiLocation) { } } private void requestLocation() {isRequest = true; if(mLocClient != null && mLocClient.isStarted()){ showToast(正在定位......); mLocClient.requestLocation(); } } //继承MyLocationOverlay重写dispatchTap方法 private class LocationOverlay extends MyLocationOverlay{ public LocationOverlay(MapView arg0) { super(arg0); } // * 在“我的位置”坐标上处理点击事件。 @Override protected boolean dispatchTap() { //点击我的位置显示PopupOverlay showPopupOverlay(location); return super.dispatchTap(); } @Overridepublic void setMarker(Drawable arg0) {super.setMarker(arg0);} } @Overrideprotected void onDestroy() {//MapView的生命周期与Activity同步,当activity销毁时需调用MapView.destroy()mMapView.destroy();//退出应用调用BMapManager的destroy()方法if(mBMapManager != null){mBMapManager.destroy();mBMapManager = null;}//退出时销毁定位 if (mLocClient != null){ mLocClient.stop(); }super.onDestroy();} //* 显示弹出窗口图层PopupOverlay private void showPopupOverlay(BDLocation location){ TextView popText = ((TextView)viewCache.findViewById(R.id.location_tips)); popText.setText([我的位置] + location.getAddrStr()); mPopupOverlay.showPopup(getBitmapFromView(popText), new GeoPoint((int)(location.getLatitude()*1e6), (int)(location.getLongitude()*1e6)), 15); } // * 将View转换成Bitmap的方法 public static Bitmap getBitmapFromView(View view) { view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)); view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight()); view.buildDrawingCache(); Bitmap bitmap = view.getDrawingCache(); return bitmap; } }

    扩展:android定位api / android 谷歌定位api / android 基站定位api

    大家注意:这里我把上一次的添加marker的代码注释了,原因是当我这两个同时弄的时候会无法给当前位置添加标记。。。这个问题稍后会得到解决。

    下面的布局文件是弹出框的布局,一个 很简单的文件:pop_layout.xml

    />
    • LocationClient 定位SDK的核心类,LocationClient类必须在主线程中声明。需要Context类型的参数。Context需要时全进程有效的context,推荐用getApplicationConext获取全进程有效的context,我们调用registerLocationListener(BDLocationListener)方法来注册定位监听接口,BDLocationListener里面有两个方法,onReceiveLocation()(接收异步返回的定位结果),onReceivePoi()(接收异步返回的POI查询结果,POI是“Point of Interest”的缩写,可以翻译成“信息点”,每个POI包含四方面信息,名称、类别、经度、纬度、附近的酒店、饭店,商铺等信息。我们可以叫它为“导航地图信息”,导航地图数据是整个导航产业的基石),我们这里只需要重写onReceiveLocation就行了BDLocation 封装了定位SDK的定位结果,在BDLocationListener的onReceive方法中获取。通过该类用户可以获取error code,位置的坐标,精度半径,地址等信息,对于其getLocType ()方法获取的error code一些情况
      1. 61 : GPS定位结果62 : 扫描整合定位依据失败。此时定位结果无效。63 : 网络异常,没有成功向服务器发起请求。此时定位结果无效。65 : 定位缓存的结果。66 : 离线定位结果。通过requestOfflineLocaiton调用时对应的返回结果67 : 离线定位失败。通过requestOfflineLocaiton调用时对应的返回结果68 : 网络连接失败时,查找本地离线定位时对应的返回结果161: 表示网络定位结果162~167: 服务端定位失败
        • LocationClientOption 用来设置定位SDK的定位方式,比如设置打开GPS,设置是否需要地址信息,设置发起定位请求的间隔时间等等,参数设置完后调用LocationClient 的setLocOption方法LocationOverlay MyLocationOverlay的子类,重写里面的dispatchTap()方法,显示弹出窗口图层PopupOverlay,调用mMapView.getOverlays().add(myLocationOverlay)就将我的位置图层添加到地图里面PopupOverlay 弹出图层,这个类还是比较简单,里面只有三个方法,hidePop() (隐藏弹出图层)showPopup(Bitmap pop, GeoPoint point, int yOffset) (显示弹出图层)和showPopup显示多张图片的重载方法,由于showPopup方法只接受Bitmap对象,所以我们必须将我们的弹出图层View对象转换成Bitmap对象,我们调用getBitmapFromView方法就实现这一转换BDLocationListener接口的onReceiveLocation(BDLocation location) 方法我还要重点讲解下,我们会发现onReceiveLocation方法会反复执行,他执行的间隔跟LocationClientOption类的setScanSpan()方法设定的值有关,我们设定的是5000毫秒,则onReceiveLocation方法每隔5秒执行一次,注意,当我们设定的值大于1000(ms),定位SDK内部使用定时定位模式。调用requestLocation( )后,每隔设定的时间,定位SDK就会进行一次定位。如果定位SDK根据定位依据发现位置没有发生变化,就不会发起网络请求,返回上一次定位的结果;如果发现位置改变,就进行网络请求进行定位,得到新的定位结果。如果你只需要定位一次的话,这个设置小于1000,或者不用设置就可以了,定时定位时,调用一次requestLocation,会定时监听到定位结果 四 . 在运行程序之前,我们还必须在AndroidManifest.xml进行相关配置和权限的声明

          还有很重要的一点就是在AndroidManifest.xml中添加下面的内容android:name=com.baidu.location.f
          android:enabled=true
          android:process=:remote >



          android:name=com.baidu.lbsapi.API_KEY
          android:value=6KOX4mXHeBRzgriV6OP1T2Hw
          />

          其中的meta-data问题:网上这样说,大家记住就得了。。。。

          因为单独的定位sdk需要一个key值,而定位sdk的值又不像mapManager中可以直接赋值
          所以就需要在注册表单中注册

          运行图示:

          apk地址:http://pan.baidu.com/s/1hqqWSuw

          部分内容摘自百度官方文档。部分来自博客:http://blog.csdn.net/xiaanming/article/details/11380619

          扩展:android定位api / android 谷歌定位api / android 基站定位api

          定位自己的位置基本就这些内容,出现的问题随后会补充上。。今天就这样吧。。吃饭去了。。

扩展:android定位api / android 谷歌定位api / android 基站定位api

三 : 为何在Google地图、百度地图进行GPS定位时,开启WiFi有助

[gps定位精度]为何在Google地图、百度地图进行GPS定位时,开启WiFi有助于提高定位速度和精度,可达到20m级别?
大家注意到没:在Google地图、百度地图进行GPS定位时且暂未收到GPS信息时,如果打开Wi-Fi时,定位速度很快且精度达到50m级别,相反,不开WiFi时,定位精度就下降到km级别?

值得说明的是,我们在大街上周围能够搜索到的WiFi其实都是无法连接的(没有密码),只是能搜索到WiFi信号而已,但是就是这样,只要打开WiFi,就能明显发现定位精度提高很大,能够从km的范围缩小到20m左右,这其中具体的原理是什么呢?

我搜索了一些资料发现,有声称Google和Skyhook公司分别建立了全球的WiFi的MAC地址对应到GPS坐标的数据库,但是由于国内WiFi的普及也才是近几年开始的,那么这两个公司如何建立起全球范围这样的数据库呢,他们是怎么做到关联WiFi的MAC地址到GPS坐标呢?

希望业内的专业人士解惑?
下面就看看www.61k.com小编为您搜集整理的参考答案吧。

网友ventlam[gps定位精度]为何在Google地图、百度地图进行GPS定位时,开启WiFi有助于提高定位速度和精度,可达到20m级别?给出的答复:
主要讨论一下室外定位,所知有限,抛砖引玉。会有原理分析过程,可以直接看结论部分
目前应用最广泛的定位技术可分为两类:卫星定位技术和地面三角测量技术。
1. 卫星定位技术
名词解释:全球导航卫星系统(Global Navigation Satellite System,GNSS) 它是欧空局和国际民航组织倡导发起的全球定位测时系统。其中最著名的全球定位系统(GlobalPositioning System,GPS),几乎被等同为卫星定位技术。 同属GNSS的还包括GLONASS[1],北斗[2],Galileo[3],IRNSS[4]。这些技术基本使用三维交会原理来实现空间定位,即通过测量多颗卫星到移动目标的距离,结合已知的卫星精确的实时位置信息,计算移动目标的三维坐标。如图1所示:图1 卫星测距交会原理(来自google image search) 图1 卫星测距交会原理(来自google image search)
定位精度与时间:GPS军码精度优于10m,仅提供美军及其盟军使用。民码精度20~30m,全球开放。题主所说的精度在KM级别,是会出现。因为卫星信号功率低(避免干扰雷达),无法穿透建筑物,这就是常说的定位遮挡问题。建筑物密集的城市中室外定位精度会大受影响,同时导致室内无法使用GPS导航。传统GPS定位响应时间一般30s~3min之间。 2. 地面三角测量技术
名词解释:地面三角测量定位技术利用多台位置已知的探测器(多为基站)在不同位置探测目标的方位或距离,然后运用三角测量交会原理确定移动目标的位置。如图2所示:

定位精度与时间:不同的定位方法(Cell-ID,TOA,TDOA,AOA,E-OTD)精度不同,基本在100m~500m范围之间。定位响应时间在10s之内。但是目前的智能手机基本不会单纯使用以上两种定位方法,而是基于这两种方法的混合定位技术。原因,参见表一:
表一 不同定位方法对比 表一 不同定位方法对比
3. 混合定位技术,目前主流的包括A-GPS、GPSOne和XPS技术。
A-GPS[5]技术在定位时,网络根据移动终端所在蜂窝小区标识确定上空的卫星,加速卫星搜索过程,从而提高全球定位系统卫星定位速度。同时发送差分信号到移动终端,提高定位精度。GPSOne[6]首先使用A-GPS技术定位,如果全球定位系统卫星视野被阻挡时,辅助采用AFLT三角测量技术进行定位。它只要有一颗全球定位系统卫星和一个基站信号即可完成定位过程,确保定位精度和速度。XPS技术[7]结合无线保真定位、移动通讯网络蜂窝定位和全球定位系统定位技术的组合定位。该项技术是题主所说的Skyhook公司的技术。原理如图3所示: 图3 XPS定位原理 图3 XPS定位原理结论:(对应题主问号顺序)
开启WIFI的确是作为辅助手段来提高定位速度和精度的,同时定位精度并不完全由于WIFI决定。WIFI数据库的确是由WIFI热点MAC地址对应经纬度实现的。
定位原理如表一和混合定位一节所阐述。Google建立WIFI库的途径很多,包括他们的地图应用、街景车。后者在全球拍摄的时候同时会记录WIFI热点[8](好像有一段时间这事闹挺大的)。同样在伟大的天朝,也有类似性质的测绘车辆会收集这些数据,Google得到它们的途径包括商业合作和购买。SkyHook的数据库应该也是车采回来的,他们有在招聘汽车司机[9]。不过Skyhook的数据库覆盖范围就相对较小[10]。大概如图4(蓝色区域)所示:图4 skyhook覆盖范围

参考文献:
[1] GLONASS wikipedia [el]http://en.wikipedia.org/wiki/GLONASS
[2] 北斗衛星導航系統 [el]wikipedia http://zh.wikipedia.org/wiki/%E5%8C%97%E6%96%97%E5%AF%BC%E8%88%AA%E7%B3%BB%E7%BB%9F
[3]Galileo (satellite navigation)[el] wikipedia
http://en.wikipedia.org/wiki/Galileo_(satellite_navigation)
[4]Indian Regional Navigational Satellite System[el] wikipedia
http://en.wikipedia.org/wiki/Indian_Regional_Navigational_Satellite_System
[5]Assisted GPS [el]wikipedia http://en.wikipedia.org/wiki/Assisted_GPS
[6]GpsOne [el]wikipedia http://en.wikipedia.org/wiki/GpsOne
[7]Hybrid Positioning System (XPS)[el] Skyhook Wireless,Inc.
http://www.61k.comhowitworks/xps.php
[8]Google Street View logs WiFi networks, Mac addresses [el] The Register
http://www.61k.comuk/2010/04/22/google_streetview_logs_wlans/
[9]We're Hiring[el]Skyhook Wireless,Inc.
http://www.61k.comwhoweare/careers.php
[10]Coverage Area [el]Skyhook Wireless,Inc.
http://www.61k.comlocation-technology/coverage.php
[11]基于位置服务的分析与展望[J] 李清泉等 中国计算机学会通讯 第6卷第6期 2010年6月


网友匿名用户[gps定位精度]为何在Google地图、百度地图进行GPS定位时,开启WiFi有助于提高定位速度和精度,可达到20m级别?给出的答复:
一、WiFi对外广播时,会附带自己的设备信息,所以不需要了解Wifi密码

二、WiFi库的来源
1、扫街,比如Google街景扫街会搜集到大量的WiFi,这个可以当作种子。
2、来自用户,比如你使用Google的定位时,会上传GPS坐标、周边基站、周边WiFi数据,这些WiFi的设备数据就被收录到母库里。
3、合作及购买


网友蒙面大侠[gps定位精度]为何在Google地图、百度地图进行GPS定位时,开启WiFi有助于提高定位速度和精度,可达到20m级别?给出的答复:
你错
这个问题与基于WiFi的室内定位是一个道理。
一个wifi热点的覆盖范围比蜂窝小区小太多了
这意味着高得多的位置相关性
而且wifi热点的定位数据中同样有信号强度的部分,这是室内定位可以成立的关键,可是,室外的wifi热点的定位也可以利用信号强度信息。
对于这种微波信号,它的强度衰减主要来自自由空间的路径损失,阴影衰落和多径衰落,前面两者的对数形式和距离的相关性很高(线性/高斯分布),多径衰落是场强瞬时值随时间快速变化的特性,和定位没什么关系。


网友蒙面大侠[gps定位精度]为何在Google地图、百度地图进行GPS定位时,开启WiFi有助于提高定位速度和精度,可达到20m级别?给出的答复:
1)wifi连上,google的location 服务器会根据SSID查是否有登记过这个ap的location,有的话直接返回location,这个数据库里的SSID location会随时更新。所以很准,很快。

2)没有wifi辅助,google map应该是退而求其次通过手机网络,即所谓基站定位来获得,location,速度快,但是精度低。

3)如果没有信号,则采用gps,但是需要在室外,时间长,优点是精度高。GPS定位后拿到的location会用于1)的SSID-location数据库的更新。


网友匿名用户[gps定位精度]为何在Google地图、百度地图进行GPS定位时,开启WiFi有助于提高定位速度和精度,可达到20m级别?给出的答复:
首先必须纠正一下,GPS卫星定位系统即使是民用的精度也不可能是km级别,而是一般能达到10m级别。至于为什么打开wifi能提高精度,我认为是每个热点都有位置记录,而且有一个数据库记录了所有这些数据,访问这些数据就能知道位置了。


网友xujian wu[gps定位精度]为何在Google地图、百度地图进行GPS定位时,开启WiFi有助于提高定位速度和精度,可达到20m级别?给出的答复:
回答最后一问“那么这两个公司如何建立起全球范围这样的数据库呢,他们是怎么做到关联WiFi的MAC地址到GPS坐标呢?”

你的手机就是坐标采集器。市面上的手机何其多啊。。。。。


网友宋钊[gps定位精度]为何在Google地图、百度地图进行GPS定位时,开启WiFi有助于提高定位速度和精度,可达到20m级别?给出的答复:
“开启WiFi有助于提高定位速度和精度,可达到20m级别 ”这 个结论并不具有普遍性,或者说是错误的。

四 : Android调用百度地图API实现——实时定位代码

为了方便,我特意新建1个Android优秀交流总群,
案例代码加入QQ群:179730949(500人)249919939(1000人)可以下载
MainActivity.class

package yu.hong.map;
import com.baidu.mapapi.BMapManager;import com.baidu.mapapi.GeoPoint;import com.baidu.mapapi.LocationListener;import com.baidu.mapapi.MKGeneralListener;import com.baidu.mapapi.MKLocationManager;import com.baidu.mapapi.MapActivity;import com.baidu.mapapi.MapController;import com.baidu.mapapi.MapView;import com.baidu.mapapi.MyLocationOverlay;import android.location.Location;import android.os.Bundle;import android.view.KeyEvent;import android.view.Menu;import android.view.MenuItem;import android.widget.Toast;
public class MainActivity extends MapActivity {// 初始为于勉庄private double userLongitude = 33.49087222349736 * 1E6;//纬度private double userLatitude = 115.27130064453128 * 1E6;//经度// 添加百度相关控件private MapView mapView;private BMapManager bMapManager;// 加载地图的引擎// 百度地图上的key值private String keyString ="01331AFA954E7E300428A5F0C9C829E0E16F87A3";// 在百度地图上添加一些控件,例如放大、缩小private MapController mapController;private MKLocationManager mLocationManager;
@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);// 实例化控件mapView = (MapView) this.findViewById(R.id.bmapView);bMapManager = new BMapManager(MainActivity.this);// 必须要加载keybMapManager.init(keyString, new MKGeneralListener() {// key值不正确@Overridepublic void onGetPermissionState(int arg0) {if (arg0 == 300) {Toast.makeText(MainActivity.this, R.string.key_error,Toast.LENGTH_LONG).show();}}//网络出错@Overridepublic void onGetNetworkState(int arg0) {Toast.makeText(MainActivity.this, R.string.net_error,Toast.LENGTH_LONG).show();}});this.initMapActivity(bMapManager);mapView.setBuiltInZoomControls(true);// 表示可以设置缩放功能mapController = mapView.getController();// 初始化Location模块mLocationManager = bMapManager.getLocationManager();// 通过enableProvider和disableProvider方法,选择定位的ProvidermLocationManager.enableProvider(MKLocationManager.MK_NETWORK_PROVIDER);mLocationManager.disableProvider(MKLocationManager.MK_GPS_PROVIDER);//返回手机位置mLocationManager.requestLocationUpdates(locationListener);mLocationManager.setNotifyInternal(5, 2);// 添加定位图层MyLocationOverlay myLocationOverlay = newMyLocationOverlay(this,mapView);myLocationOverlay.enableMyLocation(); // 启用定位myLocationOverlay.enableCompass(); // 启用指南针mapView.getOverlays().add(myLocationOverlay);mapView.setTraffic(true);// 交通地图// mapView.setSatellite(true);// 卫星地图mapController.setZoom(15);// 设置缩放级别mapView.invalidate();// 刷新地图}//获取经度纬度private LocationListener locationListener = newLocationListener() { @Overridepublic void onLocationChanged(Location location) {if (location != null) { userLatitude = location.getLatitude() * 1E6; userLongitude =location.getLongitude() * 1E6; GeoPoint mypoint = newGeoPoint((int)(userLatitude), (int)(userLongitude)); mapView.getController().animateTo(mypoint); }}};// 销毁@Overrideprotected void onDestroy[www.61k.com)() {super.onDestroy();if (bMapManager != null) {bMapManager.destroy();bMapManager = null;}}
// 停止@Overrideprotected void onPause() {super.onPause();if (bMapManager != null) {mLocationManager.removeUpdates(locationListener);bMapManager.stop();}}
// 重启@Overrideprotected void onResume() {super.onResume();if (bMapManager != null) {bMapManager.start();}}
//@Overrideprotected boolean isRouteDisplayed() {
return false;}
// Menu// 当点击Menu按钮时,调用该方法@Overridepublic boolean onCreateOptionsMenu(Menu menu) {menu.add(0, 1, 1, R.string.exit).setIcon(android.R.drawable.ic_menu_close_clear_cancel);return super.onCreateOptionsMenu(menu);}@Overridepublic boolean onContextItemSelected(MenuItem item) { //选中某个菜单项if (item.getItemId() == 1) {MainActivity.this.finish(); }return super.onOptionsItemSelected(item);}// 返回键 @Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if (keyCode == KeyEvent.KEYCODE_BACK) { finish();}return super.onKeyDown(keyCode, event);}}activity_mainmain.xml
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" >
<!--添加显示百度地图的控件 -->
<com.baidu.mapapi.MapView android:id="@+id/bmapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" tools:context=".MainActivity"/>
</LinearLayout>

AndroidManifest.xml

<manifestxmlns:android="http://schemas.android.com/apk/res/android" package="yu.hong.map" android:versionCode="1" android:versionName="1.0" >
<uses-sdk android:minSdkVersion="10" android:targetSdkVersion="15"/> <!--添加百度地图开发授权--> <uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permissionandroid:name="android.permission.ACCESS_FINE_LOCATION"/> <uses-permissionandroid:name="android.permission.INTERNET" /> <uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permissionandroid:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permissionandroid:name="android.permission.CHANGE_WIFI_STATE"/> <uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/> <!--添加对屏幕的支持--> <supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true"/>
<application android:icon="@drawable/ic_maplauncher" android:label="@string/app_name" android:theme="@style/AppTheme"> <activity android:name=".MainActivity" android:label="@string/title_activity_main" > <intent-filter> <actionandroid:name="android.intent.action.MAIN" />
<categoryandroid:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application>
</manifest>


本文标题:百度地图api实时定位-美团app怎么使用订单中百度地图定位餐厅位置?
本文地址: http://www.61k.com/1120790.html

61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1