在react的函数组件中使用高德API在不显示地图的前提下实现定位,附近医院搜索展示

话不多说,直接进入正题

        1.申请高德key和安全密钥:

申请key的部分依据高德api提示处傻瓜式注册即可获得,申请完成后,打开右上角头像,在应用管理->我的应用中即可查看到自己的密钥和key

        2.返回到api界面搜索react,即可出现''JS API 结合React使用''项,选择进入

这里我们只需执行第一步下载依赖包

        3.脚手架配置密钥

在react脚手架中public->index.html中添加script标签:

    <script type="text/javascript">

      window._AMapSecurityConfig = {

        securityJsCode: "你的密钥",        //放置要更换的密钥

      };

    </script>

4.在相应组件中添加如下代码

直接在自己的.js文件中复制以下代码即可

import { useEffect, useMemo, useState, useCallback } from "react";

import AMapLoader from "@amap/amap-jsapi-loader";



export default function MapContainer() {

let [AMap,setAMap] = useState(null)

let map = null;

let [city,setCity] = useState('')

let [curlat,setcurlat] = useState(0)

let [curlng,setcurlng] = useState(0)

let [hospitalList,sethospitalList] = useState([])



//函数区

let getCity = ()=>{

  var options = {

    city:city,

  };

  if(AMap !== null){

    var auto1 = new AMap.AutoComplete(options);  //实例化AutoComplete模块

    auto1.search('医院', function(status, result) {

      sethospitalList(result.tips)

    })

  }

}

let dataList = useMemo(()=>{

  let list = []

  hospitalList.forEach(elem=>{

    if(elem.id!==''){

      let obj = {}

      obj.id = elem.id

      obj.name = elem.name

      obj.district = elem.district

      // console.log((elem.location));

      var p1 = [curlng, curlat];

      var p2 = [elem.location.lng, elem.location.lat];

      // 返回 p1 到 p2 间的地面距离,单位:米

      var dis = AMap.GeometryUtil.distance(p1, p2);

      obj.distance = (dis/1000).toFixed(1)

      obj.type = ['三甲','综合医院']

      obj.department = ['皮肤科,骨科,妇科,儿童科,眼科,牙科']

      // console.log(obj);

      list.push(obj)

    }

  })

  // console.log(list);

  return list

},[hospitalList])

function onComplete(data) {

  // console.log(data);   //显示定位成功时候的位置信息

  setcurlat(data.position.lat)

  setcurlng(data.position.lng)

}

function onError(data) {

    console.log(data);

}

useEffect(() => {

    AMapLoader.load({

    key: "你的key", // 申请好的Web端开发者Key,首次调用 load 时必填

    version: "2.0", // 指定要加载的 JSAPI 的版本,缺省时默认为 1.4.15

    plugins: ["AMap.AutoComplete",'AMap.PlaceSearch','AMap.Geolocation','AMap.CitySearch'], // 添加输入提示插件

    })

.then((AMap) => {

    setAMap(AMap)   //实现外部调用AMap

    var geolocation = new AMap.Geolocation({    //实例化定位Geolocation模块

      enableHighAccuracy: true,//是否使用高精度定位,默认:true

      // timeout: 10000,          //超过10秒后停止定位,默认:5s

      position:'RB',    //定位按钮的停靠位置

      offset: [10, 20], //定位按钮与设置的停靠位置的偏移量,默认:[10, 20]

      zoomToAccuracy: true,   //定位成功后是否自动调整地图视野到定位点

      convert: true,

    });

    geolocation.getCurrentPosition(function(status,result){     //定位插件执行定位函数

      if(status==='complete'){

          onComplete(result)

      }else{

          onError(result)

      }

    });

    var citysearch = new AMap.CitySearch(); //实例化获取当前所在城市信息的插件

    citysearch.getLocalCity((status, result)=> {    //执行相应获取城市信息的函数

      if (status === 'complete' && result.info === 'OK') {

          if (result && result.city && result.bounds) {

              var cityinfo = result.city;

              var citybounds = result.bounds;



              console.log(cityinfo,citybounds);

              setCity(cityinfo)

          }

      } else {

          console.log(result.info);

      }

  });

    var autoOptions = {

    input: "input_id",

    city:city

  };

    var auto = new AMap.AutoComplete(autoOptions);  //实例化AutoComplete模块

    auto.search('医院', function(status, result) {

      // 搜索成功时,result即是对应的匹配数据

      // console.log(result.tips);  //初次搜索到的信息

      sethospitalList(result.tips)

    })

})



.catch((e) => {

  console.log(e);

});

return () => {

map?.destroy();

};



}, []);



useEffect(()=>{

  getCity()

},[city])



return (

<div>

<div>

    <p>{city}</p>

    <p>{curlat}</p>

    <p>{curlng}</p>

</div>

<div>

  {

    dataList.map((elem,index)=>{

      // console.log(elem);

      return <div key={elem.id}>

                <img src={`/hospital_img/h${index}.jpg`} alt="" style={{width:'50px',height:'50px'}}/>

            <div>

                  <p>{elem.name}</p>

                  <p>{'距离您:'+elem.distance+'千米'}</p>

                  <p>

                    主要部门:{elem.department.map((item,index)=>{

                    return <span key={index}>{item}</span>

                  })}

                  </p>

                  <p>

                    主要部门:{elem.type.map((items,index)=>{

                    return <span key={index}>{items}</span>

                  })}

                  </p>

            </div>

      </div>

    })

  }

</div>

</div>

);

}

 

实际的定位与自己当前所在位置有偏差,属于正常现象,图片是我自己导入的本地文件,后续的优化就靠各位码农们自己啦

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值