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.pswp.cn/news/382972.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/382972.shtml
英文地址,請注明出處:http://en.pswp.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…