百度地图API 安卓项目 实时获取地图中心点经纬度
来源:互联网 发布:电气autocad软件下载 编辑:程序博客网 时间:2024/06/08 05:44
附DEmo记录百度地图API哪些坑
项目可以实时获取当前位置并且计算和某固定位置的距离,并显示在屏幕上方。
做项目时遇到的难点:
- 如何把覆盖物固定在屏幕中间,不随着地图的移动而移动
- 如何获取地图中间位置的坐标/经纬度
- 如何把两点之间的距离在textView中显示出来
首先第一点折腾了比较久,思维太僵硬了,只想着把覆盖物固定在地图中间,其实换个角度想,只要把覆盖物固定在屏幕中心点,不就可以让覆盖物不随着地图一起移动了吗?想通之后就好解决了,把覆盖物当做一个控件,放在layout文件中设置layout属性为center,这样覆盖物就可以固定在屏幕中间了,可以随意移动地图,并且覆盖物不会随着地图一起移动。
覆盖物是固定好了,但是怎么获取屏幕中心点的位置呢?当时想到了两点,把屏幕坐标转换为地图经纬度,但是这样比较麻烦,最后失败了,查阅百度API后发现有提供方法给我们。
OnMapStatusChangeListener listener = new OnMapStatusChangeListener() { /** * 手势操作地图,设置地图状态等操作导致地图状态开始改变。 * @param status 地图状态改变开始时的地图状态 */ public void onMapStatusChangeStart(MapStatus status){ } /** 因某种操作导致地图状态开始改变。 * @param status 地图状态改变开始时的地图状态 * @param reason表示地图状态改变的原因,取值有: * 1:用户手势触发导致的地图状态改变,比如双击、拖拽、滑动底图 * 2:SDK导致的地图状态改变, 比如点击缩放控件、指南针图标 * 3:开发者调用,导致的地图状态改变 */ public void onMapStatusChangeStart(MapStatus status, int reason); } /** * 地图状态变化中 * @param status 当前地图状态 */ public void onMapStatusChange(MapStatus status){ } /** * 地图状态改变结束 * @param status 地图状态改变结束后的地图状态 */ public void onMapStatusChangeFinish(MapStatus status){ }};
这是官方的介绍,找到这个方法后就能操作了,在onMapStatusChangFinish这个方法中用mapStatus.target方法可以获取到地图中心点位置,此时的地图中心点就是屏幕中心点的位置,也就是说此时的屏幕中心点的跟地图中心点的位置重合了,拿到地图中心点位置就相当于拿到了此时覆盖物的位置,这样第二问题也就解决了。
第三个问题是关于怎么把算出来的两点间的距离传到textView中显示,直接传入distance程序一直崩溃,慢慢查询调试发现一个问题不能直接把distance传入.setTextz中,原因就是:
主要原因是TextView的setText方法把传入的int类型的percent当做资源Id到项目中查询资源,而资源中却找不到相应的数值,就会报NotFoundException的错误。
在Android中利用id来索引资源的地方很多(如:Toast.makeText()等),所以如果不小心往方法中传入int类型的参数,虽然编译时IDE不会报错,但是运行时,很容易因找不到对应的资源而报错。
这样第三个问题也解决了。
还是得心细啊
package com.mymapdemo;import android.content.Context;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;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.mapapi.SDKInitializer;import com.baidu.mapapi.map.BaiduMap;import com.baidu.mapapi.map.BitmapDescriptor;import com.baidu.mapapi.map.BitmapDescriptorFactory;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.MarkerOptions;import com.baidu.mapapi.map.MyLocationConfiguration;import com.baidu.mapapi.map.MyLocationData;import com.baidu.mapapi.map.OverlayOptions;import com.baidu.mapapi.map.Polyline;import com.baidu.mapapi.map.PolylineOptions;import com.baidu.mapapi.model.LatLng;import com.baidu.mapapi.utils.DistanceUtil;import java.util.ArrayList;import java.util.List;public class MapDemo extends AppCompatActivity { private MapView mMapView; private BaiduMap mBaiduMap; private Context context; private TextView textView; private double distance; private LocationClient mLocationClient; private MyLocationListener mLocationListener; private boolean isFirstIn = true; private Polyline mPolyline; private LatLng latLng; private double meter; private Button dw_bt; private double mLat; private double mLon; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_map_demo); textView = (TextView) findViewById(R.id.textView); dw_bt = (Button) findViewById(R.id.dw_bt); this.context = this; //初始化定位 initView(); initLocation(); addMyOverlay(); dw_bt.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { LatLng latLng = new LatLng(mLat,mLon); MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng); mBaiduMap.animateMapStatus(msu); } }); } /* * 定位到自己当前位置 * * */ private void initLocation() { mLocationClient = new LocationClient(this); mLocationListener = new MyLocationListener(); /* * 修改自带的定位图标 * */ MyLocationConfiguration.LocationMode mCurrentMode = MyLocationConfiguration.LocationMode.NORMAL; BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory .fromResource(R.drawable.icon_marka); mBaiduMap.setMyLocationConfigeration(new MyLocationConfiguration( mCurrentMode, true, mCurrentMarker )); mLocationClient.registerLocationListener(mLocationListener); final LocationClientOption option = new LocationClientOption(); option.setCoorType("bd09ll");//坐标类型 option.setIsNeedAddress(true);//返回当前位置 option.setOpenGps(true); option.setScanSpan(1000);//过多少秒请求一次 mLocationClient.setLocOption(option); mLocationClient.start(); /* * setOnMapStatusChangeListener方法主要是记录当前地图中心点的坐标 * mapStatus.target获取当前地图中心点的坐标 * */ mBaiduMap.setOnMapStatusChangeListener(new BaiduMap.OnMapStatusChangeListener() { @Override public void onMapStatusChangeStart(MapStatus mapStatus) { } @Override public void onMapStatusChangeStart(MapStatus mapStatus, int i) { } @Override public void onMapStatusChange(MapStatus mapStatus) { } @Override public void onMapStatusChangeFinish(MapStatus mapStatus) { latLng = mapStatus.target; mBaiduMap.clear();// addMyOverlay(latLng.longitude,latLng.latitude); LineDrawing(latLng.latitude, latLng.longitude); textView.setText("距离天安门:" + String.valueOf(distance)+"米"); } }); } /* * 地图初始化 * * */ private void initView() { mMapView = (MapView) findViewById(R.id.bmapView); mBaiduMap = mMapView.getMap(); MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f); mBaiduMap.setMapStatus(msu); } @Override protected void onDestroy() { super.onDestroy(); mMapView.onDestroy(); } @Override protected void onResume() { super.onResume(); mMapView.onResume(); } @Override protected void onStart() { super.onStart(); mBaiduMap.setMyLocationEnabled(true); if (!mLocationClient.isStarted()) mLocationClient.start(); } @Override protected void onStop() { super.onStop(); mBaiduMap.setMyLocationEnabled(false); mLocationClient.stop(); } @Override protected void onPause() { super.onPause(); mMapView.onPause(); } private class MyLocationListener implements BDLocationListener{ @Override public void onReceiveLocation(BDLocation location) { MyLocationData data = new MyLocationData.Builder() .accuracy(location.getRadius()) .latitude(location.getLatitude()) .longitude(location.getLongitude()) .build(); mBaiduMap.setMyLocationData(data); mLat = location.getLatitude(); mLon = location.getLongitude(); /* * 判断地图当前的状态 * */ if (isFirstIn) { LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude()); MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(latLng); mBaiduMap.animateMapStatus(msu); isFirstIn = false;// Toast.makeText(context, location.getAddrStr()// , Toast.LENGTH_SHORT).show(); } } } /* * 绘制固定点和自己当前位置的距离 * * */ public void LineDrawing(double latitude,double longitude){ //构建折线点坐标 LatLng p1 = new LatLng(39.9152478931,116.4038206839); LatLng p2 = new LatLng(latLng.latitude,latLng.longitude); Listpoints = new ArrayList (); points.add(p1); points.add(p2); //绘制折线 OverlayOptions ooPolyline = new PolylineOptions().width(10) .color(0xAAFF0000).points(points); mPolyline = (Polyline) mBaiduMap.addOverlay(ooPolyline); distance =(int) (DistanceUtil.getDistance(p1,p2)); } /* * 添加覆盖物 * */ public void addMyOverlay(){ LatLng point = new LatLng(39.9152478931,116.4038206839); //构建Marker图标 BitmapDescriptor bitmap = BitmapDescriptorFactory .fromResource(R.drawable.icon_markb); //构建MarkerOption,用于在地图上添加Marker OverlayOptions option = new MarkerOptions() .position(point) .icon(bitmap); //在地图上添加Marker,并显示 mBaiduMap.addOverlay(option); }}
效果图就不贴了。
免费demo看头像
后面会传到资源库中
附DEMO
阅读全文
0 0
- 百度地图API 安卓项目 实时获取地图中心点经纬度
- 安卓开发——百度地图修改地图中心点为所需经纬度以及地图空白的问题
- 百度地图API地点搜索-获取经纬度
- 百度地图API地点搜索-获取经纬度
- 基于百度地图api获取经纬度
- android 基于百度地图api获取经纬度
- 百度地图API根据具体地址获取经纬度
- 调用百度地图API获取经纬度
- 使用百度地图API获取经纬度
- 百度地图api--根据经纬度获取地点
- 百度地图api--点击获取经纬度
- 百度地图api获取经纬度和地址
- 通过百度地图API获取地址经纬度
- 获取百度地图经纬度
- 百度地图api开发二:获取当前地图中心经纬度
- android 获取地图中心点的经纬度坐标
- iOS 获取地图视图中心点经纬度
- Android高德地图设置中心点图标,通过逆地理编码实时获取中心点的经纬度和详细位置
- kafka Steams详解
- 关于Android如何禁止屏幕旋转刷新界面
- [FAQ17441][Recovery][Common]Android M 版本如何升级lk 、preloader ?
- mongodb 在windows下面进行副本建创建
- JN项目-时间查询,结束时间比开始时间小给提示
- 百度地图API 安卓项目 实时获取地图中心点经纬度
- iOS 用HTTP post上传图片到OSS
- linux 终端启动图形化程序界面时报错:No protocol specified
- 跨行转软件测试随笔
- 彩票网站需安全运营以稳定行业的发展
- 项目日志输入出不同的文件,按级别输出
- xshell使用
- 谈C#中的Delegate
- luogu1472 奶牛家谱 Cow Pedigrees