• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      基于百度地圖API的反向遮罩功能的實(shí)現(xiàn)*

      2017-09-03 09:17:08
      關(guān)鍵詞:行政區(qū)域邊界點(diǎn)太原市

      牛 倩

      (山西大學(xué) 軟件學(xué)院,山西 太原 030013)

      基于百度地圖API的反向遮罩功能的實(shí)現(xiàn)*

      牛 倩

      (山西大學(xué) 軟件學(xué)院,山西 太原 030013)

      百度地圖作為目前市場(chǎng)占有率最高的開(kāi)放地圖平臺(tái),基本可以滿足大部分產(chǎn)品的使用需求,但是對(duì)于個(gè)性化的需求卻實(shí)現(xiàn)困難,例如實(shí)現(xiàn)地圖的反向遮罩功能。文章實(shí)現(xiàn)了一種通過(guò)簡(jiǎn)單的二次開(kāi)發(fā)即可實(shí)現(xiàn)基于百度地圖應(yīng)用程序接口的反向遮罩功能。

      百度地圖;開(kāi)放接口;反向遮罩

      0 引言

      由于單獨(dú)開(kāi)發(fā)一個(gè)地圖類(lèi)服務(wù)的產(chǎn)品成本非常昂貴[1],所以大部分產(chǎn)品都選擇使用第三方的電子地圖服務(wù)。在中國(guó),提供電子地圖服務(wù)的公司中,市場(chǎng)占有率較高的有百度地圖[2]、高德地圖、搜狗地圖等,其中目前市場(chǎng)占有率最高的是百度地圖[3]。百度地圖擁有豐富的功能,基本可以滿足大多數(shù)地圖類(lèi)服務(wù)產(chǎn)品的使用需求。通過(guò)調(diào)用百度地圖應(yīng)用程序接口(Application Programming Interface, API),開(kāi)發(fā)者不需要自備大量地圖數(shù)據(jù),可以便捷地進(jìn)行地圖類(lèi)應(yīng)用的開(kāi)發(fā),極大地降低了開(kāi)發(fā)成本。但是使用現(xiàn)有的百度地圖開(kāi)放接口卻不能實(shí)現(xiàn)反向遮罩功能。本文以百度地圖Android軟件開(kāi)發(fā)工具包(Software Development Kit, SDK)為例,通過(guò)簡(jiǎn)單的二次開(kāi)發(fā),實(shí)現(xiàn)了反向遮罩功能。

      1 需求分析

      在給地方政府各級(jí)部門(mén)研發(fā)產(chǎn)品(例如:可再生能源分布情況,或者空氣質(zhì)量指數(shù)分布情況)時(shí),用戶希望可以對(duì)其所屬行政區(qū)域以外的區(qū)域進(jìn)行遮罩,以便用戶可以快速找到行政區(qū)域的邊界,快速了解自己負(fù)責(zé)的區(qū)域的可再生能源分布情況,或者空氣質(zhì)量指數(shù)分布情況。

      2 相關(guān)技術(shù)分析

      與上述需求相關(guān)的百度地圖API有以下兩個(gè)接口:

      (1) boolean search District(District Search Option var1)[4],這個(gè)接口提供行政區(qū)邊界數(shù)據(jù)檢索功能。根據(jù)省、市、縣(區(qū))級(jí)行政區(qū)劃名稱,查詢行政區(qū)劃的詳細(xì)邊界信息。示例代碼如下:

      mDistrictSearch = DistrictSearch.newInstance();

      mDistrictSearch.searchDistrict(new DistrictSearchOption().cityName(city).districtName(district));

      (2) Overlay addOverlay(OverlayOptions var1)[5],通過(guò)這個(gè)接口可以實(shí)現(xiàn)點(diǎn)(Dot)、折線(Polyline)、弧線(Arc)、圓(Circle)、多邊形(Polygon)多種圖形的遮罩功能。上述需求可以通過(guò)接口1獲得的行政區(qū)域便捷信息來(lái)繪制多邊形遮罩。示例代碼如下:

      OverlayOptions polygonOption = new PolygonOptions().points(pts).stroke(new Stroke(5, 0xAA00FF00)).fillColor(0xAAFFFF00);

      但是通過(guò)接口2并不能完全滿足用戶需求。接口2可以給指定的行政區(qū)域添加半透明遮罩,這樣,會(huì)讓用戶關(guān)注的行政區(qū)域顏色加深而高亮了用戶不關(guān)注的區(qū)域(如圖1左圖所示),這與用戶需求是完全相反的(如圖1右圖所示)。圖1中是以太原市迎澤區(qū)空氣質(zhì)量顯示為例,通過(guò)接口1獲得太原市迎澤區(qū)的邊界信息,直接使用接口2繪制多邊形即得到圖1中左圖效果,與用戶要求的右圖效果相反。而現(xiàn)有的百度地圖API并不提供直接可使用的接口。為了解決這一問(wèn)題,本文設(shè)計(jì)并實(shí)現(xiàn)了基于百度地圖API的反向遮罩功能。

      圖1 百度地圖API效果與用戶需求效果對(duì)比

      3 實(shí)現(xiàn)

      實(shí)現(xiàn)反向遮罩功能需要以下4步,并在每一步后附上基于百度地圖Android SDK實(shí)現(xiàn)的代碼。

      (1) 找到該坐標(biāo)列表中的最右邊的坐標(biāo)點(diǎn)I(如圖2中點(diǎn)I),點(diǎn)I表示為(Iw,Ij),其中Iw表示點(diǎn)I的緯度,Ij表示點(diǎn)I的經(jīng)度。

      // 區(qū)域點(diǎn)集合

      List boundLatLngs = new ArrayList<>();

      // 找右側(cè)極值

      int longMaxIndx = 0;

      LatLng longMax = latLngList.get(0).get(0);

      for (List latLngs : latLngList) {

      if (latLngs == null || latLngs.size() == 0) {

      continue;

      }

      for (LatLng latLng : latLngs) {

      boundLatLngs.add(latLng);

      if (latLng.longitude > longMax.longitude) {

      longMax = latLng;

      longMaxIndx = boundLatLngs.size() - 1;

      }

      }

      }

      圖2 反向遮罩示意圖

      (2) 調(diào)整坐標(biāo)列表順序,調(diào)整為從最右邊的邊界點(diǎn)(點(diǎn)I)開(kāi)始逆時(shí)針順序的坐標(biāo)列表。

      List latLngsTemp = new ArrayList<>();

      latLngsTemp.addAll(boundLatLngs.subList(longMaxIndx, boundLatLngs.size()));

      latLngsTemp.addAll(boundLatLngs.subList(0, longMaxIndx));

      (3) 添加7個(gè)點(diǎn)(A到G)到坐標(biāo)列表末尾。其中點(diǎn)C、D、E、F為地圖的4個(gè)邊界點(diǎn),F(xiàn)j表示F點(diǎn)的經(jīng)度。點(diǎn)A的坐標(biāo)為(Iw-0.00000001,Ij),點(diǎn)B的坐標(biāo)為(Iw-0.00000001,Fj),點(diǎn)G的坐標(biāo)為(Iw,Ij)。

      在圖2中,為了方便理解,地圖邊界點(diǎn)縮小到可視范圍,并在圖中標(biāo)出,實(shí)際使用的邊界點(diǎn)為C(10, 150)、D(10, 60)、E(60, 60)、F(60, 150)。區(qū)域CDEF遠(yuǎn)超中國(guó)邊界,所以在用戶實(shí)際使用時(shí),陰影的邊界是感知不到的。

      在圖2中,線AB和線IG的未遮罩區(qū)域?yàn)榱朔奖憷斫夥糯罅? 000 000倍,實(shí)際使用時(shí),這個(gè)未遮罩區(qū)域在地圖放大到最大級(jí)別時(shí)只有一個(gè)像素大小,不影響用戶使用。

      latLngsTemp.add(new LatLng(latLngsTemp.get(0).latitude-0.00000001, latLngsTemp.get(0).longitude));

      latLngsTemp.add(new LatLng(latLngsTemp.get(0).latitude-0.00000001, 150));

      latLngsTemp.add(new LatLng(10, 150));

      latLngsTemp.add(new LatLng(10, 60));

      latLngsTemp.add(new LatLng(60, 60));

      latLngsTemp.add(new LatLng(60, 150));

      latLngsTemp.add(new LatLng(latLngsTemp.get(0).latitude, 150));

      (4)根據(jù)現(xiàn)有坐標(biāo)列表繪制遮罩層。如圖2所示,陰影部分即為反向遮罩層。

      OverlayOptions ooPolygon = new PolygonOptions().points(latLngsTemp).stroke(new Stroke(1,context.getResources().getColor(R.color.map_overlay))).fillColor(context.getResources().getColor(R.color.map_overlay));

      baiduMap.addOverlay(ooPolygon);

      4 測(cè)試

      最終的效果如圖3所示。圖3左為使用反向遮罩的效果,圖3右是最終提供給用戶的使用了反向遮罩功能展示太原市迎澤區(qū)內(nèi)空氣質(zhì)量分布的效果。滿足了用戶的實(shí)際需求。具體的實(shí)現(xiàn)代碼和清晰的運(yùn)行截圖已經(jīng)上傳至網(wǎng)絡(luò),可以通過(guò)網(wǎng)絡(luò)查看[6]。

      圖3 反向遮罩示意圖

      5 結(jié)論

      本文基于百度地圖API的addOverlay和searchDistrict兩個(gè)開(kāi)放接口在Android平臺(tái)實(shí)現(xiàn)了對(duì)行政區(qū)域的反向遮罩功能,這個(gè)實(shí)現(xiàn)方法同樣適用于其他地圖服務(wù),以及其他封閉圖形的反向遮罩功能。但目前這一版本的反向遮罩功能還是不能完全滿足用戶需求。用戶有時(shí)并不是關(guān)注行政區(qū)域全部的地區(qū),而是它的一部分。例如,太原整個(gè)行政區(qū)域很大,但在空氣質(zhì)量監(jiān)控時(shí),用戶更關(guān)注的是太原市城區(qū)(太原市六城區(qū))的空氣質(zhì)量分布?;谶@個(gè)需求,在下一版本的開(kāi)發(fā)中,希望添加區(qū)域合并功能,即給定多個(gè)區(qū)域(太原市六個(gè)城區(qū)分別的坐標(biāo)),對(duì)這幾個(gè)區(qū)域進(jìn)行合并,并對(duì)這幾個(gè)區(qū)域以外的部分進(jìn)行遮罩。

      [1] 成功,楊亞. 主流地圖應(yīng)用程序接口在地圖質(zhì)量和實(shí)用功能上的對(duì)比分析[J]. 地理信息世界,2016,23(5):41-45.

      [2] Baidu. 百度地圖開(kāi)放平臺(tái)[EB/OL]. (2017-02-23) [2017-03-01].http://lbsyun.baidu.com/.

      [3] 羅超. 百度地圖這十年如何一步步干掉了強(qiáng)悍的對(duì)手[EB/OL]. (2016-12-26) [2017-02-01].http://luochao.baijia.baidu.com/article/277207.

      [4] Baidu. 基礎(chǔ)地圖Android SDK[EB/OL]. (2017-02-23) [2017-03-01].http://lbsyun.baidu.com/index.php?title=androidsdk/guide/basicmap.

      [5] Baidu. 檢索功能Android SDK[EB/OL]. (2017-02-23) [2017-03-01].http://lbsyun.baidu.com/index.php?title=androidsdk/guide/retrieval.

      [6] 牛倩. AddReverseOverlay[EB/OL]. (2017-03-04) [2017-03-04].http://git.oschina.net/qian.n/AddReverseOverlay.

      Implementation of adding reverse overlay function based on Baidu map API

      Niu Qian

      (College of Software, Shanxi University, Taiyuan 030013, China)

      Baidu maps as the highest market share of the open map platform, has rich function, basically can meet the needs of most of the software, but for the personalized requirement is difficult to implement. For example to implement the adding reverse overlay function. This paper implemented it by a small amount of secondary development based on Baidu map open API(Application Programming Interface).

      Baidu map; open API; reverse overlay

      山西省科技基礎(chǔ)條件平臺(tái)計(jì)劃項(xiàng)目(2013091002-0108)

      TP311.1

      A

      10.19358/j.issn.1674- 7720.2017.15.029

      牛倩.基于百度地圖API的反向遮罩功能的實(shí)現(xiàn)[J].微型機(jī)與應(yīng)用,2017,36(15):100-102.

      2017-03-12)

      牛倩(1987-),女,碩士研究生,助教,主要研究方向:軟件工程。

      猜你喜歡
      行政區(qū)域邊界點(diǎn)太原市
      道路空間特征與測(cè)量距離相結(jié)合的LiDAR道路邊界點(diǎn)提取算法
      太原市61個(gè)村要建污水處理設(shè)施嚴(yán)禁直排入河
      行政區(qū)域突發(fā)環(huán)境事件風(fēng)險(xiǎn)評(píng)估研究
      層次化點(diǎn)云邊界快速精確提取方法研究
      太原市園林綠化植物選擇及分析
      太原市六家藥茶企業(yè)獲省級(jí)授權(quán)
      跨行政區(qū)域稅務(wù)法院:完善稅收司法的制度路徑
      《中華人民共和國(guó)測(cè)繪法》釋義(之十三)
      太原市第四實(shí)驗(yàn)小學(xué)
      山西電教(2017年3期)2017-10-19 03:39:16
      關(guān)于進(jìn)一步加強(qiáng)行政區(qū)域界線管理維護(hù)邊界地區(qū)社會(huì)穩(wěn)定的意見(jiàn)
      九台市| 犍为县| 三亚市| 高密市| 白城市| 伽师县| 江阴市| 江城| 芦溪县| 汽车| 广水市| 肥东县| 文山县| 庆安县| 思南县| 化德县| 沅陵县| 乌拉特后旗| 资兴市| 福州市| 贞丰县| 正镶白旗| 长治市| 万安县| 陇川县| 治多县| 饶阳县| 固阳县| 洪泽县| 武城县| 西畴县| 浏阳市| 星座| 城口县| 新邵县| 滦平县| 济源市| 始兴县| 中宁县| 申扎县| 淮阳县|