基于Leaflet調用天地圖在線API的多層級地名檢索實戰

目錄

前言

一、天地圖在線檢索

1、在線檢索功能

2、再談后后接口

二、Leaflet多層級實現實例

1、層級調用實現原理

2、Leaflet中多層級調用

3、成果展示

三、總結


前言

????????“地圖是世界的索引,而地名則是索引中的索引。”當互聯網地圖進入 Web 2.0 時代,開發者不再滿足于“看得見”的瓦片,更希望“問得準”——輸入一個模糊的地名,就能在毫秒之間鎖定它在全球、全國、省市、區縣乃至鄉鎮的多級位置。天地圖作為國家地理信息公共服務平臺的官方出口,提供了完全符合國標的行政區劃與興趣點(POI)檢索能力;而輕量級的 Leaflet 則在前端以極簡的 API 哲學,讓地圖可視化回歸“純粹的快樂”。當兩者相遇,我們便有了“用 200 行代碼完成一個國家級別地名搜索引擎”的可能。本文所記錄的,正是這樣一次“小而美”的實戰:如何以 Leaflet 為殼、天地圖為芯,逐級剖開中國行政體系的“套娃式”結構,把“模糊輸入–多級聯想–精準定位”做成一套可復用的前端組件。在WebGIS的可視化效果中,在省級節點中展示統計數量,隨著地圖的深入逐級進行細化,將地名逐漸呈現在大家的面前。

????????在之前的博客中曾經對如何調用天地圖的檢索API進行了詳細的介紹。但是如何進行詳細層級展示沒有進行詳細的說明,因此有朋友留言表示希望可以對層級展示進行一個具體的說明。本文即在此背景下產生。

????????閱讀全文并運行示例后,你將掌握:

  1. 如何正確調用天地圖全部檢索接口;

  2. 如何為 Leaflet 編寫一個“可復用”的入口,支持調用天地圖的地名檢索接口;

  3. 如何在Javascript中處理層級展示問題;

  4. 如何實現下鉆的行政區檢索。

一、天地圖在線檢索

????????本節將詳細的介紹天地圖的在線檢索功能,分別介紹天地圖的搜索功能和后端接口。通過參考學習天地圖的地圖展現形式,為我們后面的技術和頁面實現提供參考。

1、在線檢索功能

????????為了展示天地圖的多層級展示功能,首先我們來看一下其官方網站的實例。大家可以訪問天地圖后,點擊“在線”地圖的tab標簽頁,從而跳轉到在線地圖,如下圖所示:

?????????在其頁面的左上角就有一個輸入框,在這個輸入框中輸入相應的信息就可以完成信息的檢索。比如在輸入框中輸入“自然”,點擊檢索,在界面上就可以看到以下的展示:

????????可以看到包含了自然的地名最多的省級行政區劃是浙江省,共有599616條記錄。第二名是廣東省,約有3307條記錄,第三名是江蘇省,大約有2842條記錄。

2、再談后后接口

????????為了照顧第一次看博文的朋友,這里將天地圖的檢索接口API給大家詳細的介紹一下,讓大家了解后臺的數據接口和服務,在下一節的多層級調用展示過程實現提供技術基礎。

????????輸入參數說明

參數值參數說明參數類型是否必備備注(值域)
keyWord搜索的關鍵字String必填
specify指定行政區的國標碼(行政區劃編碼表)嚴格按照行政區劃編碼表中的(名稱,gb碼)String必填下載行政區劃編碼表。9位國標碼,如:北京:156110000或北京。
queryType服務查詢類型參數String必填12:行政區劃區域搜索服務。
start返回結果起始位(用于分頁和緩存)默認0String必填0-300,表示返回結果的起始位置。
count返回的結果數量(用于分頁和緩存)String必填1-300,返回結果的條數。
dataTypes數據分類(分類編碼表)String可選下載分類編碼表,參數可以分類名稱或分類編碼。多個分類用","隔開(英文逗號)。
show返回poi結果信息類別String可選取值為1,則返回基本poi信息; 取值為2,則返回詳細poi信息

????????返回參數說明

參數值參數說明參數類型返回條件備注(值域)
resultType返回結果類型Int必返回取值1-5,對應不同的響應類型: 1(普通POI),2(統計),3(行政區),4(建議詞搜索),5(線路結果)
count返回總條數Int必返回
keyword搜索關鍵詞String必返回搜索的關鍵字。
pois針對點(類型1)集合返回Pois Json數組resultType=1
namePoi點名稱String必返回
phone電話String
address地址String
lonlat坐標String必返回坐標 x,y
poiTypepoi類型Int必返回101:POI數據 102:公交站點
eaddress英文地址String
enamepoi點英文名稱String
hotPointIDpoi熱點IDString必返回熱點id
province所屬省名稱String
provinceCode省行政區編碼String
city所屬城市名稱String
cityCode市行政區編碼String
county所屬區縣名稱String
countyCode區縣行政區編碼String
source數據信息來源String必返回
typeCode分類編碼String
typeName分類名稱String
stationData車站信息結構體 數據Json 數組poiType=102
lineName線路名稱String必返回
uuid線路的idString必返回
stationUuid公交站uuidString必返回
statistics針對統計(類型2)集合返回Json 數組resultType=2
count本次統計POI總數量Int必返回
adminCount行政區數量Int必返回
priorityCitys推薦行政區名稱Json數組必返回
name行政區名稱String必返回
count城市數量Int必返回
lonlat行政區經緯度String必返回坐標 x,y
ename英文行政名稱String必返回
adminCode城市國標碼Int必返回9位國標碼。
allAdmins各省包含信息集合Json數組必返回
name行政名稱String必返回
count包含數量Int必返回
lonlat行政區經緯度String必返回坐標x,y
adminCode省國標碼String必返回
ename英文行政名稱String必返回
isleaf有無下一級行政區boolean必返回有則false,無則true

????????在官網的調用示例中,使用瀏覽器的調試工具來看一下數據返回的結果:

?????????請特別注意以上的接口返回值,這里取其中的一個值對象信息如下:

{"adminName": "浙江省","ename": "Zhejiang Province","count": 599616,"adminCode": 156330000,"isleaf": false,"lonlat": "120.06772699999999,29.174674999999997"
}

????????這里返回的adminCode參數非常重要,在后面的層級調用中其實就是依賴這個adminCode來進行多層級實現的。

二、Leaflet多層級實現實例

????????本節將具體詳述如何使用Leaflet來調用天地圖的檢索API和實現多層級調用,可以在Leafelt中實現我們自己的邏輯,可以展示省-市-POI詳情等信息,最后給大家展示一些實際的效果。

1、層級調用實現原理

????????關于如何實現層級調用,在前面一節中也進行了簡單說明。其實就是一個遞歸的調用,在進行API調用時,首先需要判斷返回的數據類型是什么?如果從接口中返回的類型是1表示是poi數據,直接展示即可,如果是2表示是展示統計數據,再從統計數據中獲取所有的信息,循環統計信息中的行政區劃信息,然后再遞歸調用其行政區劃的編碼實現向下檢索。實現的核心代碼展示如下:

/**
* 調用天地圖查詢
*/
function callTdtSearch(keyWord,specify){var queryUrl = "http://api.tianditu.gov.cn/v2/search?postStr={'keyWord':'"+ keyWord +"','queryType':12,'start':0,'count':10,'specify':'" + specify + "','show':'2'}&type=query&tk="+tdt_client_key;$.ajax({type: "get",url:queryUrl,data: {},success: function(rsData) {// 移除所有圖層myLayerGroup.clearLayers();var rsObj = rsData; var loc_info = rsObj.location;var resultType = rsObj.resultType;switch(resultType){case 1 :showPoi(rsObj);break;case 2:showStatistics(rsObj);break;default:console.log("不詳");}map.addLayer(myLayerGroup);	}});
}

2、Leaflet中多層級調用

????????根據接口中返回的類型不一樣來進行個性化的展示,以此達到區別展示的效果。這里重點介紹如何來進行統計信息的展示和如何調用下一層級的POI信息,核心方法如下:

//點擊還可以進行查詢
function buildStatHtml(stat,index){var html = "";html += "<div class='marsBlackPanel' style='background:#ff9800;' animation-spaceInDown>";html += "<div class='marsBlackPanel-text' style='' onclick='execQueryByCode("+stat.adminCode+")'>" + (index +1) + "、" +stat.adminName + "(" + stat.count + ")</div>";html += "</div>";return html;
}
function showStatistics(rsObj){var statistics = rsObj.statistics.allAdmins;for(var i = 0;i<statistics.length;i++){var stat = statistics[i];var lonlat = stat.lonlat;var lonlatStr = lonlat.split(",");var marker = L.marker([lonlatStr[1], lonlatStr[0]], {icon: L.divIcon({iconSize: null,className: '',popupAnchor:[5,5],shadowAnchor:[5,5],html: buildStatHtml(stat,i)})}).addTo(myLayerGroup);}map.fitBounds(myLayerGroup.getBounds());
}

????????這里實現的關鍵就是在自定義的標注中,綁定了一個執行查詢的方法,然后再這個執行方法中又可以進行下一個層級的調用。 關鍵的方法如下:

function execQueryByCode(specify){var keyWord = $("#address").val();callTdtSearch(keyWord,specify);
}

????????這樣就實現了層次的調用,當返回的值是具體的POI時,直接展示。反之則會進行省份的標注,同時可以點擊當前省份,從而實現多層級的調用和展示。

3、成果展示

????????下面結合一些實際的例子來展示一下成果,具體是如何來進行相關的實現的。

????????在Web瀏覽器中輸入請求地址,可以看到以上的界面效果。這樣就基本模擬省份這個層級的統計展示。 需要說明的是,通過POI檢索API的數據結果與官網的檢索結果之前還是有一丟丟的區別,比如官網返回的結果是599616,而通過我們的接口調用,返回的結果是:596756;下面將結果整理一個表示,供大家參考,具體出現差異的原因可能需要咨詢客服人員:

序號省份官方返回結果自主調用結果差額
1浙江省5996165967562860
2廣東省33073103204
3江蘇省28422519323
4江西省22711918353
5湖南省22301895335

????????由此可以看出,搜索的結果還是存在一定的區別的。

????????下面來看一個有意思的地方,包含舒服兩個字的最多的省份是湖北省。

????????而在湖北省中,武漢又是最多的,有41個地方包含舒服,

????????來看看具體包含舒服的地名都在武漢的哪些地方,

?????????最后來看看天地圖中包含火鍋的最多的省份是哪里?

????????可以看到,出現火鍋最多的地方居然是江蘇省,在大家的印象里,江浙應該都是甜口居多。而喜好火鍋的云貴川桔田前三都擠不進去,第四名為重慶,第六名四川。前三中,除江蘇外,第二名是山東省,第三名是河南省,有沒有出乎你的意料呢?

????????在江蘇省中,蘇州市的火鍋又是地第一名的,有2028個, 如下:

????????確實基本上都是火鍋了,這個確實沒有想到,大蘇州的火鍋居然這么多。?

三、總結

????????以上就是本文的主要內容,本文所記錄的,正是這樣一次“小而美”的實戰:如何以 Leaflet 為殼、天地圖為芯,逐級剖開中國行政體系的“套娃式”結構,把“模糊輸入–多級聯想–精準定位”做成一套可復用的前端組件。在WebGIS的可視化效果中,在省級節點中展示統計數量,隨著地圖的深入逐級進行細化,將地名逐漸呈現在大家的面前。本文不僅詳細的介紹了如何在Leaflet中進行層級展示的實現,并且基于實際的地名進行了實際的檢索展示,如果大家感興趣,不妨來這里看看。行文倉促,定有不足之處,歡迎各位朋友在評論區批評指正,不勝感激。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/88743.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/88743.shtml
英文地址,請注明出處:http://en.pswp.cn/web/88743.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于Prompt結構的語校解析:3H日本語學校信息建模實錄(4/500)

基于Prompt結構的語校解析&#xff1a;3H日本語學校信息建模實錄&#xff08;4/500&#xff09; 系列延續&#xff1a;500所日本語言學校結構數據工程 關鍵詞&#xff1a;招生結構、JLPTEJU、國籍比例、認定校、Prompt訓練集 一、我們在構建什么樣的語言學校語料&#xff1f; …

Leaflet面試題及答案(61-80)

查看本專欄目錄 文章目錄 ?? 面試問題及答案(61-80)61. 如何在地圖上顯示一個動態更新的圖層?62. 如何實現地圖上的熱力圖(Heatmap)?63. 如何自定義地圖控件的位置?64. 如何處理地圖加載失敗的情況?65. 如何實現地圖的離線功能?66. 如何將地圖導出為圖片?67. 如何實…

MIG_IP核的時鐘系統

MIG_IP核的時鐘系統時鐘的種類和配置時鐘的種類和配置 整體框圖 DDR_PHY_CLK&#xff1a;DDR3的工作頻率&#xff0c;用來得到想要的線速率。假設此時鐘為800M&#xff0c;那么DDR雙沿采樣&#xff0c;線速率為1600Mbit&#xff1b; UI_CLK&#xff1a;DDR_PHY_CLK的四分之一…

若依框架集成阿里云OSS實現文件上傳優化

背景介紹 在若依框架目前的實現中&#xff0c;是把圖片存儲到了服務器本地的目錄&#xff0c;通過服務進行訪問&#xff0c;這樣做存儲的是比較省事&#xff0c;但是缺點也有很多&#xff1a; 硬件與網絡要求&#xff1a;服務器通常需要高性能的硬件和穩定的網絡環境&#xff0…

Mac如何連接惠普M126a打印機(教程篇)

這里寫自定義目錄標題Mac如何連接惠普M126a打印機&#xff08;教程篇&#xff09;教程配置如下&#xff1a;Mac如何連接惠普M126a打印機&#xff08;教程篇&#xff09; 惠普M126a連接Mac&#xff08;教程篇&#xff09; 教程配置如下&#xff1a; 首先&#xff0c;先獲取與HP打…

感恩日記:記錄生活中的美好時刻

感恩日記的landing page登錄注冊填寫感恩事項私信可以體驗一下

一扇門鈴,萬向感應——用 eventfd 實現零延遲通信

&#x1f50d; 本篇概要 eventfd 是 Linux 提供的一種輕量級事件通知機制。你可以把它想象成一個“計數器盒子”。它里面維護的是一個64位的計數器。寫入&#xff1a;往盒子里放一些數字&#xff08;比如 1、5、10&#xff09;&#xff0c;表示有幾件事發生了。讀取&#xff1a…

基于Node.js的線上教學系統的設計與實現(源碼+論文+調試+安裝+售后)

感興趣的可以先收藏起來&#xff0c;還有大家在畢設選題&#xff0c;項目以及論文編寫等相關問題都可以給我留言咨詢&#xff0c;我會一一回復&#xff0c;希望幫助更多的人。系統背景近年來&#xff0c;全球數字化浪潮的推進與教育公平化需求的增長&#xff0c;促使線上教學迎…

互斥鎖詳解(操作系統os)

1. 互斥鎖 (Mutex) - 檔案室的“智能鎖”首先&#xff0c;我們給之前討論的那些“鎖”一個正式的名字&#xff1a;互斥鎖 (Mutex)。概念&#xff1a;你可以把它簡單理解成檔案室門上的一把“智能鎖”。它只有兩種狀態&#xff1a;locked (已上鎖) 或 unlocked (未上鎖)。操作&a…

自動潤滑系統:從 “盲目養護“ 到智能精注的工業運維革命

?在工業運維的漫長歷史中&#xff0c;傳統潤滑模式如同"定時喂飯"——無論設備實際需求&#xff0c;僅憑經驗或固定周期執行潤滑作業。這種模式埋下兩大隱患&#xff1a;過度潤滑&#xff1a;某汽車生產線曾因季度性強制潤滑&#xff0c;每年浪費1.2噸潤滑脂&#x…

【Java八股文總結 — 包學會】(二)計算機網絡

1.一條url輸入到瀏覽器最后顯示頁面的過程 URL解析與處理 瀏覽器解析URL&#xff08;如https://www.example.com/page&#xff09; 分離協議&#xff08;https&#xff09;、域名&#xff08;www.example.com&#xff09;和資源路徑&#xff08;/page&#xff09; 檢查HSTS預加…

力扣61.旋轉鏈表

給你一個鏈表的頭節點 head &#xff0c;旋轉鏈表&#xff0c;將鏈表每個節點向右移動 k 個位置。示例 1&#xff1a;輸入&#xff1a;head [1,2,3,4,5], k 2 輸出&#xff1a;[4,5,1,2,3]示例 2&#xff1a;輸入&#xff1a;head [0,1,2], k 4 輸出&#xff1a;[2,0,1]提示…

深度剖析:std::vector 內存機制與 push_back 擴容策略

深度剖析&#xff1a;std::vector 內存機制與 push_back 擴容策略 1. std::vector 核心內部結構 #mermaid-svg-8HOj3MqsD6UVgEeA {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-8HOj3MqsD6UVgEeA .error-icon{fill:…

GROW領導力模型

GROW領導力模型是由英國教練格雷厄姆亞歷山大&#xff08;Graham Alexander&#xff09;、艾倫Fine和約翰惠特默&#xff08;John Whitmore&#xff09;在20世紀80年代提出的&#xff0c;最初用于體育教練領域&#xff0c;后來被廣泛應用于企業管理、領導力發展和個人成長中。它…

打破并發瓶頸:虛擬線程實現詳解與傳統線程模型的性能對比

目錄 一、定義與特性 二、虛擬線程實現 2.1 使用 Thread.startVirtualThread() 創建 2.2 使用 Thread.ofVirtual() 創建 2.3 使用 ThreadFactory 創建 2.4 使用 Executors.newVirtualThreadPerTaskExecutor()創建 三、虛擬線程和普通線程的區別 3.1 線程管理方式不同 3…

“28項評測23項SOTA——GLM-4.1V-9B-Thinking本地部署教程:10B級視覺語言模型的性能天花板!

一、模型介紹 GLM-4.1V-9B-Thinking是由智譜AI聯合清華大學團隊推出的多模態大模型&#xff0c;以GLM-4-9B-0414基座模型為底&#xff0c;通過引入“思維鏈推理機制”和“課程采樣強化學習策略”&#xff08;Reinforcement Learning with Curriculum Sampling&#xff09;&…

推薦系統-Random算法

Random算法總結引言 在推薦系統研究與應用中&#xff0c;我們常常需要一些簡單的基線算法來衡量更復雜算法的性能提升。Random&#xff08;隨機推薦&#xff09;算法是最基礎的基線方法之一&#xff0c;它通過隨機生成評分來模擬用戶對物品的偏好。雖然這種方法看似簡單&#x…

Django--02模型和管理站點

Django–02模型與站點管理 Part 2: Models and the admin site 本教程承接Django–01的內容。我們將設置數據庫、創建你的第一個模型&#xff0c;并快速了解 Django 自動生成的管理站點。 文章目錄Django--02模型與站點管理前言一、設置數據庫1.1 參考文檔鏈接1.2 默認設置1.3…

CS課程項目設計1:交互友好的井字棋游戲

最近突然想開設一個專欄了&#xff0c;專門為計算機專業的同行分享一些入門級的課程項目設計&#xff0c;旨在讓同學更好地了解CS項目的設計流程&#xff0c;同時給出代碼來介紹coding過程。 今天要分享的是第一個CS課程項目&#xff1a;交互友好的井字棋游戲。 1. 研究目的 井…

首個自動駕駛VLA綜述介紹

當視覺(Vision)、語言(Language)和行動(Action)三大能力在一個模型中融合,自動駕駛的未來將走向何方? 近日,來自麥吉爾大學、清華大學、小米公司和威斯康辛麥迪遜的研究團隊聯合發布了全球首篇針對自動駕駛領域的視覺-語言-行動(Vision-Language-Action, VLA)模型的…