php 开发高德地图地理围栏,高德地图-地理围栏功能实现

最近需要实现一个地理围栏相关的功能。

项目是和骑行相关的,主要是当游客或者骑友定位地址进入到对应的景点的地理围栏里面,则播报景点相关的报道语音。

接到需求之后,我开始查看高德的相关API,由于围栏是多边形的,则需要后台提供对应的围栏的经纬度数据,

1.创建地理围栏客户端

fenceClient = new GeoFenceClient(mContext);

IntentFilter filter = new IntentFilter(

ConnectivityManager.CONNECTIVITY_ACTION);

filter.addAction(GEOFENCE_BROADCAST_ACTION);

//注册地理围栏广播

registerReceiver(mGeoFenceReceiver, filter);

fenceClient.createPendingIntent(GEOFENCE_BROADCAST_ACTION);

fenceClient.setActivateAction(GeoFenceClient.GEOFENCE_IN);

复制代码

地理围栏广播可以接收到客户定位是否在围栏内部,主要是用来处理围栏相关的操作

2.根据围栏客户端创建地理围栏

list = new ArrayList<>();

String lnglatGaode = encloseEntity.getLnglatGaode();

ArrayList gaodeList = new GsonImpl()

.toList(lnglatGaode, LnglatGaodeEntity.class);

for (LnglatGaodeEntity entity : gaodeList) {

latLng = new DPoint(StringUtils.parseDouble(entity.getLat()),

StringUtils.parseDouble(entity.getLng()));

list.add(latLng);

}

DPoint firstLng = new DPoint(StringUtils.parseDouble(gaodeList.get(0).getLat()),

StringUtils.parseDouble(gaodeList.get(0).getLng()));

list.add(firstLng);

//后台提供的围栏list数据,围栏对应的id

fenceClient.addGeoFence(list, encloseEntity.getSrcurl());

复制代码

围栏数据由于是不规则的,则需要根据一系列的经纬度集合直接画出来,这样一切相关的程序就准备好

3.围栏广播相关处理

private BroadcastReceiver mGeoFenceReceiver = new BroadcastReceiver() {

@Override

public void onReceive(Context context, Intent intent) {

LogUtils.w("mGeoFenceReceiver---------------------");

// 接收广播

if (intent.getAction().equals(GEOFENCE_BROADCAST_ACTION)) {

Bundle bundle = intent.getExtras();

//获取对应的围栏的语音url地址

String customId = bundle

.getString(GeoFence.BUNDLE_KEY_CUSTOMID);

String fenceId = bundle.getString(GeoFence.BUNDLE_KEY_FENCEID);

GeoFence fence = bundle.getParcelable(GeoFence.BUNDLE_KEY_FENCE);

//status标识的是当前的围栏状态,不是围栏行为

int status = bundle.getInt(GeoFence.BUNDLE_KEY_FENCESTATUS);

StringBuffer sb = new StringBuffer();

switch (status) {

case GeoFence.STATUS_LOCFAIL:

sb.append("定位失败");

break;

case GeoFence.STATUS_IN:

sb.append("进入围栏 ");

openMediaPlay(customId);

break;

case GeoFence.STATUS_OUT:

sb.append("离开围栏 ");

mediaPlayer.pause();

break;

case GeoFence.STATUS_STAYED:

sb.append("停留在围栏内 ");

break;

default:

break;

}

if (status != GeoFence.STATUS_LOCFAIL) {

if (!TextUtils.isEmpty(customId)) {

sb.append(" customId: " + customId);

}

sb.append(" fenceId: " + fenceId);

}

String str = sb.toString();

Message msg = Message.obtain();

msg.obj = str;

msg.what = 2;

mHandler.sendMessage(msg);

}

}

};

复制代码

这里使用message主要是为了让对应的状态status按照队列发送,不至于乱,获取对应的语音url就可以播放了

4.查看对应的handlerMessage

@Override

public void handleMessage(Message msg) {

super.handleMessage(msg);

switch (msg.what) {

case 0:

//绘制多边形

drawFence2Map();

break;

case 1:

//围栏添加失败

int errorCode = msg.arg1;

break;

case 2:

//其他status数据类型

String statusStr = (String) msg.obj;

break;

default:

break;

}

}

//依次绘制多边形

private void drawFence2Map() {

new Thread() {

@Override

public void run() {

try {

synchronized (lock) {

if (null == fenceList || fenceList.isEmpty()) {

return;

}

for (GeoFence fence : fenceList) {

LogUtils.w("fence--id" + fence.getFenceId() + "---Custom--" + fence.getCustomId());

if (fenceMap.containsKey(fence.getFenceId())) {

continue;

}

drawPolygon(fence);

fenceMap.put(fence.getFenceId(), fence);

}

}

} catch (Throwable e) {

}

}

}.start();

}

private void drawPolygon(GeoFence fence) {

final List> pointList = fence.getPointList();

if (null == pointList || pointList.isEmpty()) {

return;

}

for (List subList : pointList) {

List lst = new ArrayList();

PolygonOptions polygonOption = new PolygonOptions();

for (DPoint point : subList) {

lst.add(new LatLng(point.getLatitude(), point.getLongitude()));

boundsBuilder.include(

new LatLng(point.getLatitude(), point.getLongitude()));

}

polygonOption.addAll(lst);

polygonOption.zIndex(2);

polygonOption.strokeColor(Color.argb(255, 255, 20, 147))

.fillColor(Color.argb(50, 255, 20, 147)).strokeWidth(2);

aMap.addPolygon(polygonOption);

}

}

复制代码

这里加上绘制多边形的围栏方便测试围栏效果

5.播放和暂停对应的音乐

private void openMediaPlay(String mp3) {

try {

if (!srcMp3.equals(mp3)) {

mediaPlayer.setDataSource(Net.HOST + Net.PREFIX + mp3);

}

srcMp3 = mp3;

mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);

// 通过异步的方式装载媒体资源

mediaPlayer.prepareAsync();

mediaPlayer.setOnPreparedListener(new OnPreparedListener() {

@Override

public void onPrepared(MediaPlayer mp) {

// 装载完毕回调

mediaPlayer.start();

}

});

} catch (IOException e) {

e.printStackTrace();

}

}

复制代码

使用的是系统自带的播放器

其实难点就在于围栏的绘制那块

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/382972.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java abstractrequest,Java AbstractJackson2HttpMessageConverter類代碼示例

import org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter; //導入依賴的package包/類Testpublic void testDefaultConfig() throws Exception {loadBeanDefinitions("mvc-config.xml", 14);RequestMappingHandlerMapping mapping app…

golang调用matlab,Golang中Proto编写和生成

test.proto文件syntax "proto3";//指定proto文件版本package go; //指定文件缩放的package名//定义对象message Test {enum PhoneType //枚举消息类型{MOBILE 0; //proto3版本中&#xff0c;首成员必须为0&#xff0c;成员不应有相同的值HOME 1;WORK 2;}int32 fl…

php折半查找面试题,php 面试题(一)

最近转载一些面试题&#xff0c;希望能给找工作的朋友们带来一点帮助。1.写出5个以上你所知道的常用的Linux命令和它的功能cat&#xff0c;显示文件内容。cd&#xff0c;改变目录路径。cp&#xff0c;复制文件。find&#xff0c;查找文件。grep&#xff0c;搜索、过滤信息。ls&…

次梯度法matlab代码,实例:连续化次梯度法解 LASSO 问题

实例&#xff1a;连续化次梯度法解 LASSO 问题我们将在此页面中构造一个 LASSO 问题并且展示连续化次梯度方法在其中的应用。目录构造LASSO优化问题设定随机种子。clear;seed 97006855;ss RandStream(mt19937ar,Seed,seed);RandStream.setGlobalStream(ss);构造 LASSO 优化问…

php变量使用,php变量的使用

来源:www.cncfan.com | 2006-1-11 | (有1856人读过)就像大部份的结构化程序&#xff0c;有所谓的全局变量与局部变量&#xff0c;PHP 在这方面也是有相似之处。在 PHP 的程序执行时&#xff0c;系统会在内存中保留一块全局变量的区域。实际运用时&#xff0c;可以透过 $GLOBALS…

php syncml 协议,基于改进的SyncML协议的图像安全同步技术研究

Image secure synchronization technology research based on improved SyncML protocolJIA Zhaolong1贾兆拢(1991-)&#xff0c;女&#xff0c;北京邮电大学硕士生&#xff0c;主要研究方向&#xff1a;网络安全技术与应用MA Zhaofeng2马兆丰(1974-)&#xff0c;男&#xff0c…

php 文字水印如何居中,php文字水印和php图片水印实现代码(二种加水印方法)

$dst_path dst.jpg;$src_path src.jpg;//创建图片的实例$dst imagecreatefromstring(file_get_contents($dst_path));$src imagecreatefromstring(file_get_contents($src_path));//获取水印图片的宽高list($src_w, $src_h) getimagesize($src_path);//将水印图片复制到目…

qq ip探测仪 php,巧用Win7资源监视器,查看QQ好友IP

用QQ时间比较长、喜欢DIY的朋友都知道&#xff0c;有一些第三方版本的QQ或者插件可以显示好友IP地址&#xff0c;但其实在Windows7中根本用不着第三方软件&#xff0c;在系统自带的资源监视器中&#xff0c;就能很方便的看到QQ好友的IP地址。首先&#xff0c;打开“任务管理器”…

oracle安装显示注册表,windows下oracle 11g r2 安装过程与卸载详细图解

Oracle 11g安装1.解压下载的包&#xff0c;然后进入包内&#xff0c;点击setup.exe开始安装 。2.出现如下&#xff1a;一般把那个小对勾取消&#xff0c;点击下一步进行&#xff0c;弹出下图这个后点‘是3.下图后&#xff0c;选择创建和配置数据库&#xff0c;点击下一步。4.下…

oracle+连接格式,oracle外连接符号(+)的用法

我们都知道&#xff0c;PL/SQL中实现外连接&#xff0c;除了可以用关键词OUTER JOIN外&#xff0c;还可以用Oracle的外连接符号()。对于这个外连接符号()&#xff0c;虽然看到书上说&#xff1a;使用()进行外连接时&#xff0c;where条件中&#xff0c;对于附表的字段都应带上(…

php一行多个商品,【后端开发】php一行展示多个商品怎么实现

php一行展示多个商品怎么实现php可以用来连接数据库查询商品&#xff0c;并输出展示给用户&#xff0c;但想要实现一行展示多个商品需要用到css技术&#xff0c;具体实现如下&#xff1a;1、首先php代码$sql "select * from user";$result $conn->query($sql);i…

linux设置时间快1小时,LINUX CentOS系统时间与现在时间相差8小时解决方法

GPS 系统中有两种时间区分&#xff0c;一为UTC&#xff0c;另一为LT(地方时)两者的区别为时区不同&#xff0c;UTC就是0时区的时间&#xff0c;地方时为本地时间&#xff0c;如北京为早上八点(东八区)&#xff0c;UTC时间就为零点&#xff0c;时间比北京时晚八小时&#xff0c;…

linux双网卡端口聚合,Linux双网卡聚合改造

Linux双网卡聚合改造一、环境和需求Linux主机只有一块网卡接到交换机上&#xff0c;为了消除交换机的单点&#xff0c;新增一台交换机&#xff0c;Linux主机端新接一块网卡到新交换机上&#xff0c;对这两块网卡做聚合达到目的。二、物理连线使用网线连接新增交换机和新网卡三、…

linux服务器无法识别xml文件,linux上重启服务器提示找不到smartbi-config.xml文件

(本文档仅供参考)问题服务器上重启服务时&#xff0c;报了如下错误信息&#xff1a;(备注&#xff1a;因安全考虑&#xff0c;新版本的config登录界面已经不展示config文件的加载路径了。)解决方案原因一&#xff1a;这是一个关于在哪个路径下启动smartbi服务的问题。首先&…

linux uname命令详解,linux中uname命令参数及用法详解

uname 命令可用于大多数 UNIX 和类 UNIX 系统以及 Linux。功能说明&#xff1a;uname用来获取电脑和操作系统的相关信息。语  法&#xff1a;uname [-amnrsvpio][--help][--version]补充说明&#xff1a;uname可显示linux主机所用的操作系统的版本、硬件的名称等基本信息。参…

android linux网络连接,Android和Linux服务器之间的TCP连接

我正在编写一个代码&#xff0c;需要每秒从Android移动设备向台式计算机(linux服务器)发送数据。由于数据经常发送&#xff0c;通过Http命中无法实现(因为会消耗时间)&#xff0c;所以Tcp通信似乎是更好的选择&#xff0c;因为android手机的数据可以通过此套接字编程快速发送。…

linux堆上的内存可执行吗,pwn的艺术浅谈(二):linux堆相关

这是linux pwn系列的第二篇文章&#xff0c;前面一篇文章我们已经介绍了栈的基本结构和栈溢出的利用方式&#xff0c;堆漏洞的成因和利用方法与栈比起来更加复杂&#xff0c;为此&#xff0c;我们这篇文章以shellphish的how2heap为例&#xff0c;主要介绍linux堆的相关数据结构…

arm嵌入式linux应用实例开发pdf,零点起步——ARM嵌入式Linux应用开发入门一书的源代码...

代码片段和文件信息属性 大小 日期 时间 名称----------- --------- ---------- ----- ----文件 24064 2016-03-20 09:49 零点起步——ARM嵌入式Linux应用开发入门\习题答案 (1).doc文件 24064 2016-03-20 09:50 零点起步——ARM嵌入式Lin…

linux上p图工具,linux图片处理工具GraphicsMagick安装使用

安装依赖包&#xff1a;yum install libpng libjpeg freetype libpng-devel libjpeg-devel libtool-ltdl-devel libtool-ltdl官网下载GraphicsMagick包官网地址&#xff1a;http://www.graphicsmagick.org/解压编译安装&#xff1a;tar xf GraphicsMagick-1.3.25.tar.gz./confi…

manjaro linux下载软件,manjaro linux

manjaro linux下载。manjaro linux是基于Arch Linux开发的Linux操作系统&#xff01;对于裸服务器、虚拟机、IaaS 和 PaaS 方面都得到了加强&#xff0c;而且内置了强大的数据中心满足商业的各种要求&#xff0c;是强大的混合云平台和物理系统&#xff01;manjaro linux介绍man…