需求:在web網頁中點擊地圖上面位置返回經緯度信息,基於react實現,然后點擊之后顯示在文本框中?
首先說一下,作者使用了antd組件庫,qqmap插件,騰訊地圖javascript開發,下面是地址
1.應用到的插件qqmap,npm自行下載,
1 import QQMap from 'qqmap';
2.首先准備一個div作為map綁定的標簽:
1 <div> 2 <Input id="keyword" style={{ width: '150px' }} defaultValue={'樂高'} placeholder="地址"/> 3 <Input id="region" style={{ width: '150px' }} defaultValue={'北京'} placeholder="城市"/> 4 <Button onClick={this.searchKeyword}>搜索</Button> 5 </div> 6 <div id="container" style={{height: 400, width: 600}}></div>
3.由於react生命周期的原因只能在comonentDidMount()中初始化騰訊地圖map
1 componentDidMount() { 2 this.initQQMap(); 3 }
4.然后在initQQMap()方法里面實現了地圖的初始化、設置中心點、點擊事件獲取經緯度,然后顯示點擊處的覆蓋物,最后顯示到文本框中
1 //地圖初始化的方法 2 initQQMap = () => { 3 //設置中心坐標 4 let tarLat = 39.90736606309809; 5 let tarLng = 116.39774322509766; 6 //初始化地圖 7 QQMap.init('your_key//換成自己的', ()=>{ 8 // 初始化經緯度,最開始的點 9 let myLatlng = new qq.maps.LatLng(tarLat, tarLng); 10 // 設置地圖屬性 11 let myOptions = { 12 zoom: 16, 13 center: myLatlng, 14 mapTypeId: qq.maps.MapTypeId.ROADMAP, 15 }; 16 // 創建地圖,綁定dom 17 this.map = new qq.maps.Map( 18 document.getElementById('container'), 19 myOptions, 20 ); 21 // 現實已經存在的點 22 let markerlast = new qq.maps.Marker({ 23 position: myLatlng, 24 map: this.map, 25 }); 26 // 調用檢索 27 let latlngBounds = new qq.maps.LatLngBounds(); 28 // 調用Poi檢索類 29 let searchService = [];//調用百度地圖的搜索服務 30 let markers = [];//用戶搜索后顯示的點的集合 31 // 調用搜索服務 32 searchService = new qq.maps.SearchService({ 33 complete: results=> { 34 let pois = results.detail.pois; 35 for (let i = 0, l = pois.length; i < l; i++) { 36 let poi = pois[i]; 37 latlngBounds.extend(poi.latLng); 38 let marker = new qq.maps.Marker({ 39 map: this.map, 40 position: poi.latLng, 41 }); 42 marker.setTitle(i + 1); 43 markers.push(marker); 44 } 45 this.map.fitBounds(latlngBounds); 46 }, 47 }); 48 // 將服務注冊到this中,方便搜索方法調用 49 this.searchService = searchService; 50 this.markers = markers; 51 // 鼠標點擊監聽 52 qq.maps.event.addListener( 53 this.map, 54 'click', 55 event=> { 56 // 清除初始化位置 57 markerlast.position = event.latLng; 58 markerlast.setMap(null); 59 // 獲取經緯度位置 60 let lat = event.latLng.getLat(); 61 let lng = event.latLng.getLng(); 62 // 賦值至文本框內 63 this.props.form.setFieldsValue({ lat: lat, lng: lng }); 64 // 繪制點擊的點 65 let marker = new qq.maps.Marker({ 66 position: event.latLng, 67 map: this.map, 68 }); 69 // 添加監聽事件 獲取鼠標單擊事件 70 qq.maps.event.addListener(this.map, 'click', function(event) { 71 marker.setMap(null); 72 }); 73 // 清空上一次搜索結果 74 Array.from(this.markers).forEach(marker=>{ 75 marker.setMap(null); 76 }); 77 } 78 ); 79 }); 80 }
5.最后就是需要一個位置搜索功能
1 //搜索 2 searchKeyword = () => { 3 //獲取文本框輸入的值 4 let keyword = document.getElementById('keyword').value; 5 let region = document.getElementById('region').value; 6 // 清空上一次搜索結果 7 Array.from(this.markers).forEach(marker=>{ 8 marker.setMap(null); 9 }); 10 //調用騰訊地圖的搜索功能 11 this.searchService.setLocation(region); 12 this.searchService.search(keyword); 13 }
其實沒有多復雜,就是調用一下騰訊地圖javascript開發api,然后將寫法兼容jsx方式寫法,不過里面需要自己改一些方法,從中學習到很多
最后看展示效果圖,點擊地圖上位置顯示周期文本框中