前面两篇博客讲解了百度地图的使用、模式的切换以及定位,我们这篇博客来讲解一下百度地图覆盖物的添加。
地图 SDK 提供的点标记功能包含两大部分,一部分是点(俗称 Marker)、另一部分是浮于点上方的信息窗体(俗称 InfoWindow)。同时,SDK 对 Marker 和 InfoWindow 封装了大量的触发事件,例如点击事件、长按事件、拖拽事件。
效果图
要给地图添加覆盖物,首先需要覆盖物的经纬度,如果还要实现点击事件,显示详细的信息,还需要覆盖物的描述信息(如图片,位置名称等),所以先新建一个实体类,来存放这些信息。
实体类信息
public class Info implements Serializable {
private double latitude;
private double longtitude;
private int imgId;
private String name;
private String distance;
private int zan;
public static List<Info> infos=new ArrayList<>();
static
{
//添加几条markerinfo数据,用来显示marker
infos.add(new Info(34.242652, 108.971171, R.drawable.a01, "英伦贵族小旅馆",
"距离209米", 1456));
infos.add(new Info(34.242952, 108.972171, R.drawable.a02, "沙井国际洗浴会所",
"距离897米", 456));
infos.add(new Info(34.242852, 108.973171, R.drawable.a03, "五环服装城",
"距离249米", 1456));
infos.add(new Info(34.242152, 108.971971, R.drawable.a04, "老米家泡馍小炒",
"距离679米", 1456));
}
public Info(double latitude, double longtitude, int imgId, String name, String distance, int zan) {
this.latitude = latitude;
this.longtitude = longtitude;
this.imgId = imgId;
this.name = name;
this.distance = distance;
this.zan = zan;
}
public double getLatitude() {
return latitude;
}
public void setLatitude(double latitude) {
this.latitude = latitude;
}
public double getLongtitude() {
return longtitude;
}
public void setLongtitude(double longtitude) {
this.longtitude = longtitude;
}
public int getImgId() {
return imgId;
}
public void setImgId(int imgId) {
this.imgId = imgId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDistance() {
return distance;
}
public void setDistance(String distance) {
this.distance = distance;
}
public int getZan() {
return zan;
}
public void setZan(int zan) {
this.zan = zan;
}
}
添加Marker
具体实现代码如下:
//定义Maker坐标点
LatLng point = new LatLng(50.253647, 130.456321);
//构建Marker图标
BitmapDescriptor bitmap = BitmapDescriptorFactory
.fromResource(R.drawable.maker);
//构建MarkerOption,用于在地图上添加Marker
OverlayOptions option = new MarkerOptions()
.position(point)
.icon(bitmap);
//在地图上添加Marker,并显示
mBaiduMap.addOverlay(option);
添加文字和信息窗
文字(Text)和弹窗覆盖物(InfoWindow),在地图中也是一种覆盖物,可以使用showInfoWindow方法展示出来
具体代码实现方式如下:
TextView tv = new TextView(mContext);
tv.setBackgroundResource(R.drawable.location_tips);
tv.setPadding(30, 20, 30, 50);
tv.setText(info.getName());
tv.setTextColor(Color.parseColor("#ffffff"));
//定义用于显示该InfoWindow的坐标点
final LatLng latLng = marker.getPosition();
Point p = mBaiduMap.getProjection().toScreenLocation(latLng);
p.y -= 47;
LatLng ll = mBaiduMap.getProjection().fromScreenLocation(p);
infoWindow = new InfoWindow(tv, ll, -47);
mBaiduMap.showInfoWindow(infoWindow);
点击覆盖物显示详细信息
我们可以通过setOnMarkerClickListener点击事件获取到覆盖物的详细信息,具体实现代码如下:
mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
Bundle extraInfo = marker.getExtraInfo();
Info info = (Info) extraInfo.getSerializable("info");
ImageView mIvPhoto= (ImageView) mMarkerLy.findViewById(R.id.iv_photo);
TextView mTvName= (TextView) mMarkerLy.findViewById(R.id.tv_name);
TextView mTvDistance= (TextView) mMarkerLy.findViewById(R.id.tv_distance);
TextView mTvZan= (TextView) mMarkerLy. findViewById(R.id.tv_zan);
mIvPhoto.setImageResource(info.getImgId());
mTvName.setText(info.getName());
mTvDistance.setText(info.getDistance());
mTvZan.setText(info.getZan()+"");
InfoWindow infoWindow;
TextView tv = new TextView(mContext);
tv.setBackgroundResource(R.drawable.location_tips);
tv.setPadding(30, 20, 30, 50);
tv.setText(info.getName());
tv.setTextColor(Color.parseColor("#ffffff"));
//定义用于显示该InfoWindow的坐标点
final LatLng latLng = marker.getPosition();
Point p = mBaiduMap.getProjection().toScreenLocation(latLng);
p.y -= 47;
LatLng ll = mBaiduMap.getProjection().fromScreenLocation(p);
infoWindow = new InfoWindow(tv, ll, -47);
mBaiduMap.showInfoWindow(infoWindow);
mMarkerLy.setVisibility(View.VISIBLE);
return true;
}
});
主界面代码
下面总结一下MainActivity代码,包含地图模式控制,地图定位,带方向的定位,显示覆盖物,显示覆盖物点击事件等,希望大家多多指正。
public class MainActivity extends AppCompatActivity {
private MapView mMapView;
private BaiduMap mBaiduMap;
private MyLocationConfiguration.LocationMode mCurrentMode;
public LocationClient mLocationClient = null;
private MyLocationListener myListener ;
public static final int Location_Permission = 0x01;
boolean isFirstIn=true;
private double mLatitude;
private double mLongitude;
private BitmapDescriptor mIcon;
private Context mContext;
private MyOrientationListener mMMyOrientationListener;
private float mCurrentX;
//覆盖物相关
private BitmapDescriptor mMarkerBitmap;
private RelativeLayout mMarkerLy;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
this.mContext=this;
//声明LocationClient类
mLocationClient = new LocationClient(getApplicationContext());
myListener = new MyLocationListener();
//注册监听函数
mLocationClient.registerLocationListener(myListener);
mMMyOrientationListener=new MyOrientationListener(mContext);
initView();
if (Build.VERSION.SDK_INT >= 23){
requestLocalPermission();
}else{
initLocal();
}
initMarker();
mBaiduMap.setOnMarkerClickListener(new BaiduMap.OnMarkerClickListener() {
@Override
public boolean onMarkerClick(Marker marker) {
Bundle extraInfo = marker.getExtraInfo();
Info info = (Info) extraInfo.getSerializable("info");
ImageView mIvPhoto= (ImageView) mMarkerLy.findViewById(R.id.iv_photo);
TextView mTvName= (TextView) mMarkerLy.findViewById(R.id.tv_name);
TextView mTvDistance= (TextView) mMarkerLy.findViewById(R.id.tv_distance);
TextView mTvZan= (TextView) mMarkerLy. findViewById(R.id.tv_zan);
mIvPhoto.setImageResource(info.getImgId());
mTvName.setText(info.getName());
mTvDistance.setText(info.getDistance());
mTvZan.setText(info.getZan()+"");
InfoWindow infoWindow;
TextView tv = new TextView(mContext);
tv.setBackgroundResource(R.drawable.location_tips);
tv.setPadding(30, 20, 30, 50);
tv.setText(info.getName());
tv.setTextColor(Color.parseColor("#ffffff"));
//定义用于显示该InfoWindow的坐标点
final LatLng latLng = marker.getPosition();
Point p = mBaiduMap.getProjection().toScreenLocation(latLng);
p.y -= 47;
LatLng ll = mBaiduMap.getProjection().fromScreenLocation(p);
infoWindow = new InfoWindow(tv, ll, -47);
mBaiduMap.showInfoWindow(infoWindow);
mMarkerLy.setVisibility(View.VISIBLE);
return true;
}
});
mBaiduMap.setOnMapClickListener(new BaiduMap.OnMapClickListener()
{
@Override
public boolean onMapPoiClick(MapPoi arg0)
{
return false;
}
@Override
public void onMapClick(LatLng arg0)
{
mMarkerLy.setVisibility(View.GONE);
mBaiduMap.hideInfoWindow();
}
});
}
/**
* 初始化覆盖物
*/
private void initMarker() {
mMarkerBitmap=BitmapDescriptorFactory.fromResource(R.drawable.maker);
mMarkerLy = (RelativeLayout) findViewById(R.id.rl_marker);
}
/**
* 定位到我的位置
*/
private void aboutLocal(){
MapStatusUpdate mapLatlng = MapStatusUpdateFactory.
newLatLng(new LatLng(mLatitude,mLongitude));
mBaiduMap.animateMapStatus(mapLatlng);
}
/**
* 初始化定位
*/
private void initLocal() {
LocationClientOption option = new LocationClientOption();
//可选,设置定位模式,默认高精度
//LocationMode.Hight_Accuracy:高精度;
//LocationMode. Battery_Saving:低功耗;
//LocationMode. Device_Sensors:仅使用设备;
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
//可选,设置返回经纬度坐标类型,默认gcj02
//gcj02:国测局坐标;
//bd09ll:百度经纬度坐标;
//bd09:百度墨卡托坐标;
//海外地区定位,无需设置坐标类型,统一返回wgs84类型坐标
option.setCoorType("bd09ll");
//可选,设置发起定位请求的间隔,int类型,单位ms
//如果设置为0,则代表单次定位,即仅定位一次,默认为0
//如果设置非0,需设置1000ms以上才有效
option.setScanSpan(1000);
//可选,设置是否使用gps,默认false
//使用高精度和仅用设备两种定位模式的,参数必须设置为true
option.setOpenGps(true);
//可选,设置是否当GPS有效时按照1S/1次频率输出GPS结果,默认false
option.setLocationNotify(true);
//可选,定位SDK内部是一个service,并放到了独立进程。
//设置是否在stop的时候杀死这个进程,默认(建议)不杀死,即setIgnoreKillProcess(true)
option.setIgnoreKillProcess(false);
//可选,设置是否收集Crash信息,默认收集,即参数为false
option.SetIgnoreCacheException(false);
//可选,7.2版本新增能力
//如果设置了该接口,首次启动定位时,会先判断当前WiFi是否超出有效期,若超出有效期,会先重新扫描WiFi,然后定位
option.setWifiCacheTimeOut(5*60*1000);
//可选,设置是否需要过滤GPS仿真结果,默认需要,即参数为false
option.setEnableSimulateGps(false);
//mLocationClient为第二步初始化过的LocationClient对象
//需将配置好的LocationClientOption对象,通过setLocOption方法传递给LocationClient对象使用
//更多LocationClientOption的配置,请参照类参考中LocationClientOption类的详细说明
option.setIsNeedAddress(true);
//自定义图标
mIcon=BitmapDescriptorFactory.fromResource(R.drawable.navi_map_gps_locked);
mLocationClient.setLocOption(option);
mMMyOrientationListener.setOnOrientationListener(new MyOrientationListener.OnOrientationListener() {
@Override
public void onOrientationChanged(float x) {
mCurrentX=x;
}
});
// mBaiduMap.setMyLocationEnabled(true);
// if (!mLocationClient.isStarted()){
// mLocationClient.start();
// }
// //开始方向传感器
// mMMyOrientationListener.start();
}
private void initView() {
mMapView = (MapView) findViewById(R.id.mv_map);
mBaiduMap = mMapView.getMap();
//放大地图的倍数
MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f);
mBaiduMap.setMapStatus(msu);
}
@Override
public boolean onCreateOptionsMenu(Menu menu)
{
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.id_map_common: //普通地图
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
break;
case R.id.id_map_site: //卫星地图
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
break;
case R.id.id_map_none: //空白地图
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NONE);
break;
case R.id.id_map_traffic: //实时交通(off)
if (mBaiduMap.isTrafficEnabled())
{
mBaiduMap.setTrafficEnabled(false);
item.setTitle("实时交通(off)");
} else
{
mBaiduMap.setTrafficEnabled(true);
item.setTitle("实时交通(on)");
}
break;
case R.id.id_map_location: //我的位置
aboutLocal();
break;
case R.id.id_map_mode_common: //普通模式
mCurrentMode = MyLocationConfiguration.LocationMode.NORMAL; //默认为 LocationMode.NORMAL 普通态
break;
case R.id.id_map_mode_following: //跟随模式
mCurrentMode = MyLocationConfiguration.LocationMode.FOLLOWING;//定位跟随态
break;
case R.id.id_map_mode_compass: //罗盘模式
mCurrentMode = MyLocationConfiguration.LocationMode.COMPASS; //定位罗盘态
break;
case R.id.id_add_overlay: //添加覆盖物
addOverlays(Info.infos);
break;
}
return super.onOptionsItemSelected(item);
}
/**
* 添加覆盖物
* @param infos
*/
private void addOverlays(List<Info> infos) {
mBaiduMap.clear();
LatLng latLng=null;
Marker marker=null;
OverlayOptions options;
for (Info info:infos){
//经纬度
latLng=new LatLng(info.getLatitude(),info.getLongtitude());
//图标
options=new MarkerOptions().position(latLng).icon(mMarkerBitmap).zIndex(5);
marker= (Marker) mBaiduMap.addOverlay(options);
Bundle bundle=new Bundle();
bundle.putSerializable("info",info);
marker.setExtraInfo(bundle);
}
MapStatusUpdate msu=MapStatusUpdateFactory.newLatLng(latLng);
mBaiduMap.animateMapStatus(msu);
}
@Override
protected void onDestroy() {
super.onDestroy();
mMapView.onDestroy();
}
@Override
protected void onResume() {
super.onResume();
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mMapView.onPause();
}
@Override
protected void onStart() {
super.onStart();
mBaiduMap.setMyLocationEnabled(true);
if (!mLocationClient.isStarted()){
mLocationClient.start();
}
//开始方向传感器
mMMyOrientationListener.start();
}
@Override
protected void onStop() {
super.onStop();
mBaiduMap.setMyLocationEnabled(false);
mLocationClient.stop();
//停止方向传感器
mMMyOrientationListener.stop();
}
class MyLocationListener extends BDAbstractLocationListener {
@Override
public void onReceiveLocation(BDLocation bdLocation) {
//此处的BDLocation为定位结果信息类,通过它的各种get方法可获取定位相关的全部结果
//以下只列举部分获取经纬度相关(常用)的结果信息
//更多结果信息获取说明,请参照类参考中BDLocation类中的说明
double latitude = bdLocation.getLatitude(); //获取纬度信息
double longitude = bdLocation.getLongitude(); //获取经度信息
float radius = bdLocation.getRadius(); //获取定位精度,默认值为0.0f
// String coorType = bdLocation.getCoorType();
// MapStatusUpdate mapUpdate = MapStatusUpdateFactory.zoomTo(radius);
// mBaiduMap.setMapStatus(mapUpdate);
MyLocationData data = new MyLocationData.Builder()//
.direction(mCurrentX)//
.accuracy(radius)//
.latitude(latitude)//
.longitude(longitude)//
.build();
mBaiduMap.setMyLocationData(data);
//设置自定义图标
mBaiduMap.setMyLocationConfiguration(new MyLocationConfiguration(
mCurrentMode, true, mIcon));
//更新经纬度
mLatitude= bdLocation.getLatitude();
mLongitude=bdLocation.getLongitude();
LatLng point= new LatLng(latitude,longitude);
if (isFirstIn){
//开始移动
MapStatusUpdate mapLatlng = MapStatusUpdateFactory.
newLatLng(point);
mBaiduMap.animateMapStatus(mapLatlng);
Toast.makeText(mContext,bdLocation.getAddrStr(), Toast.LENGTH_SHORT).show();
isFirstIn=false;
}
// //绘制图层
// //定义Maker坐标点
// LatLng point = new LatLng(latitude,longitude);
// //构建Marker图标
// BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_gcoding);
// //构建MarkerOption,用于在地图上添加Marker
// OverlayOptions option = new MarkerOptions().position(point).icon(bitmap);
// //在地图上添加Marker,并显示
// mBaiduMap.addOverlay(option);
}
}
private void requestLocalPermission() {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
!= PackageManager.PERMISSION_GRANTED) {
//若权限没有开启,则请求权限
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, Location_Permission);
}else{
initLocal();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode==Location_Permission){
if (grantResults[0]==PackageManager.PERMISSION_GRANTED){
initLocal();
}else{
Toast.makeText(this, "权限被拒绝", Toast.LENGTH_SHORT).show();
}
return;
}
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
}
到这里覆盖物的添加就已经讲解就基本完了,代码是根据鸿洋大神的视频修改的,有需要的话可以去我的资源里面进行下载。关于百度地图的基本使用到此就结束了,有说的不好的地方请大家多多指正。
Demo
文章浏览阅读1.1k次。在xxl-job中,RPC即用于调度中心请求执行器执行job、kill job,也用于执行器请求调度中心主动注册、执行结果上报。xxl-job实现的RPC类似Feign框架,是基于http..._xxljob 用的什么协议
文章浏览阅读555次,点赞17次,收藏22次。JSERIALIZE_DEF_OBJECTLIST(Person,Object,objectList) //接受json中的objectList对象数组,对象数组使用此宏定义。JSERIALIZE_DEF_OBJECTTYPE(Person,Son,son) //接受json中的son对象,对象成员使用此宏定义。//输出反序列化结果。
文章浏览阅读7.8k次,点赞2次,收藏6次。DosBox本身带有5.0版的DOS系统,启动后虚拟一个Z盘存放有Dosbox特有的外部指令,如config.com、imgmount.com等,经测试,可以顺利安装各版本的windows 3.1系统,但是不能安装win95,需要用原版的dos镜像启动才能安装。1. 获取启动盘镜像文件 下载Win95启动软盘镜像文件,名为boot.img,放到DosBox 0.74的目录下。2. 制作硬盘镜像文件_dosbox imgmount
文章浏览阅读53次。总结来说,呼叫转移是一种方便的电话通信功能,在编程中可以通过使用电话服务提供商的API来实现。然而,实际的实现可能因具体的服务提供商而有所不同,你需要参考相应的文档或与服务提供商联系以获取准确的实现细节。在函数内部,我们构建了一个API请求的有效载荷(payload),其中包含了原始电话号码和目标电话号码。在编程中,呼叫转移的实现涉及使用电话通信协议和相应的编程语言。需要注意的是,实际的呼叫转移功能的实现可能因电话服务提供商的不同而有所差异。首先,我们需要确保已经安装了Python的开发环境和相应的库。_电话自动转移程序开发
文章浏览阅读5.4k次,点赞4次,收藏15次。[@ TOC]一、MiniBatch的演进思路1、MiniBatch版本Flink 1.9.0 SQL(Blink Planner) 性能优化中一项重要的改进就是升级了微批模型,即 MiniBatch(也称作MicroBatch或MiniBatch2.0),在支持高吞吐场景发挥了重要作用。MiniBatch与早期的MiniBatch1.0在微批的触发机制略有不同。原理同样是缓存一定的数据后..._flink mini-batch
文章浏览阅读808次,点赞6次,收藏6次。导入依赖<dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.1.6</version></dependency>Controllerimport java.text.ParseException;import org.springframework._easyexcel 对接multipartfile
文章浏览阅读2.3k次,点赞10次,收藏36次。基于USPS和UCI数据集的近邻法分类一、问题描述 使用近邻算法进行分类问题的研究,并在USPS手写体数据集和UCI数据集上的iris和sonar数据上验证算法的有效性,并分别对近邻法中k近邻算法、最近邻算法和Fisher线性判别进行对比分析。二、数据集说明2.1 USPS手写体 USPS,美国邮政署,是美国联邦政府的独立机构,其中的手_usps数据集是在哪里提出的
文章浏览阅读1.9k次。 平时工作中用到Excel表格的几率特别大,也积累了一些小技巧,今天就给大家分享一下计算年龄的方法。 在Excel表格中利用“系统时间”和“出生年月”来计算“周岁年龄”、“虚岁年龄”和“实际年龄”是非常方便的,特别是人事管理和工资的统计中遇到的可能性比较大,一起来看一下计算年龄的方法吧。 方法一 第一步,如下图所示,先把需要计算年龄的出生日期输入到表格中。 第二步,然后在B2单元格中输..._access计算年龄
文章浏览阅读641次,点赞23次,收藏18次。虽然我个人也经常自嘲,十年之后要去成为外卖专员,但实际上依靠自身的努力,是能够减少三十五岁之后的焦虑的,毕竟好的架构师并不多。架构师,是我们大部分技术人的职业目标,一名好的架构师来源于机遇(公司)、个人努力(吃得苦、肯钻研)、天分(真的热爱)的三者协作的结果,实践+机遇+努力才能助你成为优秀的架构师。如果你也想成为一名好的架构师,那或许这份Java成长笔记你需要阅读阅读,希望能够对你的职业发展有所帮助。《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
文章浏览阅读286次。分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击http://www.captainbed.net先说一件值得思考的事情:高考的时候大家都是一样的教科书,同一个教室,同样的老师辅导,时间精力基本差不多,可是最后别人考的是清华北大或者一本,而你的实力只能考个三本,为什么?当然这里主要是智商的影响,那么其他因素呢?智商解决的问题能不能后天用其他方式来补位一下?大家平时都看过很多方法论的文章,看的时候很爽觉得非常有用,但是一两周后基本还是老样子了。其中有很大_网络智能知识体系的构建方法
文章浏览阅读2.7w次,点赞33次,收藏349次。前言数组去重,可以说是一个比较常见的面试题,今天来盘点一下都有哪些方法可以实现数组去重。方法1、双重for循环这是一个最笨的方法,双重循环。var arr = [1, 2, 3,4 ,5,6, 4, 3, 8, 1] // 数组去重: // 方法1: 双重for 循环 function newArrFn (arr) { // 创建一个新的空数组 let newArr = [] for(let i = 0;i<arr.length;i+_数组去重方法
文章浏览阅读1.2k次,点赞3次,收藏5次。目录1 个人对考研日语的评价1 日语VS英语2 考研日语适合哪些人,什么时候开始3 找到可以选日语的院校专业的方法4 高考日语自学经历(供参考)4.1 学习过程4.2 必用资料5 考研日语自学+作文课经历(供参考)5.1 资料相关5.2 完型(20分)5.3 阅读(40分)5.4 翻译(15分)5.5 作文(25分)end实在受不了英语应试的折磨,高考和考研都用了203日语替换了英语(高考127分,考研估分65-70分)1 个人对考研日语的评价我是有了高考127分的基础(大概N3水平,N2擦线水平),