经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » React » 查看文章
React使用高德地图的实现示例(react-amap)
来源:jb51  时间:2021/4/19 8:38:52  对本文有异议

pc版React重构,使用到了高德地图。搜了资料,发现有一个针对React进行封装的地图插件react-amap。官方网址:https://elemefe.github.io/react-amap/components/map,有兴趣的可以看下里面的API。

react-amap 安装

1、使用npm进行安装,目前是1.2.8版本:

  1. cnpm i react-amap

2、直接使用sdn方式引入

  1. <script src="https://unpkg.com/react-amap@0.2.5/dist/react-amap.min.js"></script>

react-amap 使用

  1. import React,{Component} from 'react'
  2. import {Map,Marker} from 'react-amap'
  3. const mapKey = '1234567809843asadasd' //需要自己去高德官网上去申请
  4. class Address extends Component {
  5. constructor (props) {
  6. super (props)
  7. this.state = {
  8. }
  9. }
  10. render(){
  11. return (
  12. <div style={{width: '100%', height: '400px'}}>
  13. <Map amapkey={mapKey}
  14. zoom={15}></Map>
  15. </div>
  16. )
  17. }
  18. }
  19.  
  20. export default Address

这样的话,就会初始化一个简单的地图。

在这里插入图片描述

实际开发过程中,你会有比较复杂的使用场景。比如需要标记点、对地图进行缩放、能够定位到当前位置、位置搜索等等功能。需求大致如下图所示:

在这里插入图片描述

这样的话,那就需要引入插件以及组件的概念了。
ToolBar、Scale插件

  1. <Map plugins={["ToolBar", 'Scale']}></Map>

Marker 地图标记

  1. <Map>
  2. <Marker position={['lng','lat']}></Marker>
  3. </Map>

InfoWindow 窗体组件

  1. <Map>
  2. <InfoWindow
  3. position={this.state.position}
  4. visible={this.state.visible}
  5. isCustom={false}
  6. content={html}
  7. size={this.state.size}
  8. offset={this.state.offset}
  9. events={this.windowEvents}
  10. />
  11. </Map>

通过 created 事件实现更高级的使用需求,在高德原生实例创建成功后调用,参数就是创建的实例;获取到实例之后,就可以根据高德原生的方法对实例进行操作:

  1. const events = {
  2. created: (instance) => { console.log(instance.getZoom())},
  3. click: () => { console.log('You clicked map') }
  4. }
  5. <Map events={events} />

实现一个较为复杂地址搜索,地址标记、逆地理解析代码:

  1. import React , { Component } from 'react'
  2. import { Modal , Input } from 'antd'
  3. import styles from './index.scss'
  4. import classname from 'classnames'
  5. import { Map ,Marker,InfoWindow} from 'react-amap'
  6. import marker from 'SRC/statics/images/signin/marker2.png'
  7.  
  8. const mapKey = '42c177c66c03437400aa9560dad5451e'
  9.  
  10. class Address extends Component {
  11. constructor (props) {
  12. super(props)
  13. this.state = {
  14. signAddrList:{
  15. name:'',
  16. addr:'',
  17. longitude: 0,
  18. latitude: 0
  19. },
  20. geocoder:'',
  21. searchContent:'',
  22. isChose:false
  23. }
  24. }
  25.  
  26. //改变数据通用方法(单层)
  27.  
  28. changeData = (value, key) => {
  29. let { signAddrList } = this.state
  30. signAddrList[key] = value
  31. this.setState({
  32. signAddrList:signAddrList
  33. })
  34. }
  35.  
  36. placeSearch = (e) => {
  37. this.setState({searchContent:e})
  38. }
  39.  
  40. searchPlace = (e) => {
  41. console.log(1234,e)
  42. }
  43.  
  44.  
  45.  
  46.  
  47.  
  48. componentDidMount() {
  49. }
  50.  
  51. render() {
  52. let { changeModal , saveAddressDetail } = this.props
  53. let { signAddrList } = this.state
  54. const selectAddress = {
  55. created:(e) => {
  56. let auto
  57. let geocoder
  58. window.AMap.plugin('AMap.Autocomplete',() => {
  59. auto = new window.AMap.Autocomplete({input:'tipinput'});
  60. })
  61.  
  62. window.AMap.plugin(["AMap.Geocoder"],function(){
  63. geocoder= new AMap.Geocoder({
  64. radius:1000, //以已知坐标为中心点,radius为半径,返回范围内兴趣点和道路信息
  65. extensions: "all"//返回地址描述以及附近兴趣点和道路信息,默认"base"
  66. });
  67. });
  68.  
  69. window.AMap.plugin('AMap.PlaceSearch',() => {
  70. let place = new window.AMap.PlaceSearch({})
  71. let _this = this
  72. window.AMap.event.addListener(auto,"select",(e) => {
  73. place.search(e.poi.name)
  74. geocoder.getAddress(e.poi.location,function (status,result) {
  75. if (status === 'complete'&&result.regeocode) {
  76. let address = result.regeocode.formattedAddress;
  77. let data = result.regeocode.addressComponent
  78. let name = data.township +data.street + data.streetNumber
  79. _this.changeData(address,'addr')
  80. _this.changeData(name,'name')
  81. _this.changeData(e.poi.location.lng,'longitude')
  82. _this.changeData(e.poi.location.lat,'latitude')
  83. _this.setState({isChose:true})
  84. }
  85. })
  86. })
  87. })
  88. },
  89. click:(e) => {
  90. const _this = this
  91. var geocoder
  92. var infoWindow
  93. var lnglatXY=new AMap.LngLat(e.lnglat.lng,e.lnglat.lat);
  94. let content = '<div>定位中....</div>'
  95.  
  96. window.AMap.plugin(["AMap.Geocoder"],function(){
  97. geocoder= new AMap.Geocoder({
  98. radius:1000, //以已知坐标为中心点,radius为半径,返回范围内兴趣点和道路信息
  99. extensions: "all"//返回地址描述以及附近兴趣点和道路信息,默认"base"
  100. });
  101. geocoder.getAddress(e.lnglat,function (status,result) {
  102. if (status === 'complete'&&result.regeocode) {
  103. let address = result.regeocode.formattedAddress;
  104. let data = result.regeocode.addressComponent
  105. let name = data.township +data.street + data.streetNumber
  106. _this.changeData(address,'addr')
  107. _this.changeData(name,'name')
  108. _this.changeData(e.lnglat.lng,'longitude')
  109. _this.changeData(e.lnglat.lat,'latitude')
  110. _this.setState({isChose:true})
  111. }
  112. })
  113. });
  114. }
  115. }
  116. return (
  117. <div>
  118. <Modal visible={true}
  119. title="办公地点"
  120. centered={true}
  121. onCancel={() => changeModal('addressStatus',0)}
  122. onOk={() => saveAddressDetail(signAddrList)}
  123. width={700}>
  124. <div className={styles.serach}>
  125. <input id="tipinput"
  126. className={styles.searchContent}
  127. onChange={(e) => this.placeSearch(e.target.value)}
  128. onKeyDown={(e) => this.searchPlace(e)} />
  129. <i className={classname(styles.serachIcon,"iconfont icon-weibiaoti106")}></i>
  130. </div>
  131. <div className={styles.mapContainer} id="content" >
  132. {
  133. this.state.isChose ? <Map amapkey={mapKey}
  134. plugins={["ToolBar", 'Scale']}
  135. events={selectAddress}
  136. center={ [ signAddrList.longitude,signAddrList.latitude] }
  137. zoom={15}>
  138. <Marker position={[ signAddrList.longitude,signAddrList.latitude]}/>
  139. </Map> : <Map amapkey={mapKey}
  140. plugins={["ToolBar", 'Scale']}
  141. events={selectAddress}
  142. zoom={15}>
  143. <Marker position={[ signAddrList.longitude,signAddrList.latitude]}/>
  144. </Map>
  145. }
  146. </div>
  147. <div className="mar-t-20">详细地址:
  148. <span className="cor-dark mar-l-10">{signAddrList.addr}</span>
  149. </div>
  150. </Modal>
  151. </div>
  152. )
  153. }
  154. }
  155.  
  156. export default Address

到此这篇关于React使用高德地图的实现示例(react-amap)的文章就介绍到这了,更多相关React 高德地图内容请搜索w3xue以前的文章或继续浏览下面的相关文章希望大家以后多多支持w3xue!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号