尚未崩坏 发表于 2024-10-21 21:54:02

关于天地图新手使用

1分钟带你了解学习天地图 适用新手 
天地图API (tianditu.gov.cn) 文档api  先去注册key
把脚本放到index.html文件内里
<!-- 天地图的官网申请的tk -->
<script src="http://api.tianditu.gov.cn/api?v=4.0&tk=申请的key" type="text/javascript"></script> 废话不多说 直接来代码
vue3写法

<template>
<div id="mapDiv" class="map"></div>
</template>

<script setup>
import { ref, watch, onMounted, nextTick } from "vue"
import axios from 'axios';
const props = defineProps({
data: {
    type: Object,
    default: () => {
      return {
      longitude: "113.762375",
      latitude: "39.761003"
      }
    }
},
title: {
    type: String,
    default: "北京天安门"
}
})

const map = ref(null)
const zoom = ref(16)
let longitude = ref("")
let latitude = ref("")

const marker = ref(null);
const label = ref(null);

watch(
() => props.data,
(newValue, oldValue) => {
    initLoad()
}
)
const initLoad = () => {
// 获取经纬度及名称
longitude.value = props.data.longitude
latitude.value = props.data.latitude

if (!map.value) {
    const T = window.T
    map.value = new T.Map("mapDiv", {
      // projection: "EPSG:4326",
      zoom: zoom.value, //设置默认放大缩小
      center: new T.LngLat(longitude.value, latitude.value) //设置当前地图中心点
    })

    // 添加点击事件监听器 点击跳转过去
    map.value.on('click', (e) => {
      // 更新地图中心
      longitude.value = e.lnglat.lng;
      latitude.value = e.lnglat.lat;
      map.value.panTo(e.lnglat);

      // 清除所有覆盖物
      let newMarker = map.value.getOverlays();
      newMarker.forEach((i)=>{
      console.log('i',i);
      if (i.id == 'oneId') {
          map.value.removeOverLay(i)
      } else{
          console.log('谁也不删');
      }
      })
      console.log('newMarker--地图上的所有点',newMarker);

      // 重新添加新的标记点
      addMarkers();
    });
    addMarkers();
} else {
    map.value.panTo(new T.LngLat(longitude.value, latitude.value))
}

addMarkers()
}


// 添加标记点
const addMarkers = () => {
// 更新图标实例
const icon = new T.Icon({
    iconUrl: "src/assets/images/projectKanban/btn-bg-border.svg",
    iconSize: new T.Point(27, 27),
    iconAnchor: new T.Point(10, 25)
});

const point = new T.LngLat(longitude.value, latitude.value);
marker.value = new T.Marker(point, icon); // 创建标注

map.value.addOverLay(marker.value); // 使用 addOverLay
marker.value.id = 'oneId'//添加id 确定要删除那个标点 用来区分

handleSearch()//地址解析当前位置名称

// 添加文字标签
// label.value = new T.Label({
//   text: props.title,
//   position: new T.LngLat(longitude.value, latitude.value),
//   offset: new T.Point(-60, 20)
// });
// map.value.addOverLay(label.value);
}

const handleSearch = async () => {
try {
    const apiKey = '123456'; // 天地图 API 密钥
    let params = {
      lon: longitude.value,
      lat: latitude.value,
      ver: 1
    }
    const postStr = JSON.stringify(params);
    const url = `http://api.tianditu.gov.cn/geocoder?postStr=${encodeURIComponent(postStr)}&type=geocode&tk=${apiKey}`;

    const response = await axios.get(url);

    if (response.status === 200) {
      console.log('Geocoding result:', response.data.result);
      let res = response.data.result

      // 添加文字标签
      label.value = new T.Label({
      text: res.addressComponent.poi,
      position: new T.LngLat(longitude.value, latitude.value),
      offset:new T.Point(0, -20) // 居中于标记点上方
      });
      map.value.addOverLay(label.value);
      label.value.id = 'oneId'//添加id 确定要删除那个标点 用来区分


      // 处理响应数据
    } else {
      console.error('Request failed with status:', response.status);
    }
} catch (error) {
    console.error('Error fetching geocoding data:', error.message);
}
};

onMounted(async () => {
await nextTick()
initLoad()
})
</script>

<style>
.map {
width: 100%;
height: 380px;
}   
</style> vue2写法

<template>
<div id='mapDiv' class="map"></div>
</template>

<script>
export default {
name: "AmendProject",
data() {
    return {
      tdtMap:{},//创建的地图map
      
    }
},
created(){
      this.getAddress()//获取当前位置 设置地图中心店
},
mounted(){
    //这里的initMap可以在拿到经纬度之后调用也可以过去当前用户位置信息去调用
    // setTimeout(() => {
    //   this.initMap();
    // }, 500); // 延迟 0.5 秒以确保 API 加载完成
},
methods: {
    getAddress(){
      //利用浏览器Api进行获取位置信息
       navigator.geolocation.getCurrentPosition(
      position => {
          if (position.coords) {
            this.centerMap = {
            lng: position.coords.longitude,
            lat: position.coords.latitude,
            };
            //延时不要删除
            setTimeout(()=>{
            this.initMap()
            },500)
          }
      },
      error => {
          this.centerMap = {
            lng: 116.39128, // 默认经度
            lat: 39.90675   // 默认纬度
          };
          //延时不要删除
          setTimeout(()=>{
            this.initMap()
          },500)
          console.error('获取位置失败:', error);
      },
      { enableHighAccuracy: true, timeout: 5000, maximumAge: 0 }
      );
    },
   // 创建天地图
    initMap() {
      try {
      let T = window.T;

      // 检查 T 对象是否存在
      if (typeof T === 'undefined' || !T.Map) {
          console.error('T object is not defined.');
          return;
      }

      // 确保 T 对象存在
      this.tdtMap = new T.Map("tdtMapDivID") // 使用正确的 ID
      // 设置显示地图的中心点和级别
      this.tdtMap.centerAndZoom(new T.LngLat(this.centerMap.lng, this.centerMap.lat), 15)

      //创建对象逆地址解析用到 如果不需要可以不用
                  this.geocoder = new T.Geocoder();

      // 添加点击事件监听器
      this.tdtMap.on('click', (e) => {
          // 更新地图中心
          this.centerMap = e.lnglat;//修改经纬度

          this.tdtMap.panTo(e.lnglat);//设置中心点
          // 清除所有覆盖物
          let newMarker = this.tdtMap.getOverlays(); //获取当前地图的所有点
          newMarker.forEach((i)=>{
            // 这里通过id进行删除 这个id是根据你创建marker的时候设置的唯一标识
            if (i.id == 'oneId') {
            this.tdtMap.removeOverLay(i)
            } else{
            console.log('谁也不删');
            }
          })

          // 删除完成后再次重新添加新的标记点
          this.addMarkers();
      })
      this.addMarkers()
      } catch (error) {
      console.log('error',error);
      }
    },
    // 设置标点
    addMarkers(){
      this.tdtMap.panTo(this.centerMap);//设置中心点
      //设置图标
      const icon = new T.Icon({
      iconUrl: "src/assets/images/projectKanban/btn-bg-border.svg",
      iconSize: new T.Point(27, 27),
      iconAnchor: new T.Point(10, 25)
      });
      const point = new T.LngLat(this.centerMap.lng, this.centerMap.lat);
      this.marker = new T.Marker(point, icon); // 创建标注

      this.tdtMap.addOverLay(this.marker); // 使用 addOverLay
      this.marker.id = 'oneId'//添加id 确定要删除那个标点 用来区分
      // this.marker.enableDragging()//可拖拽点
    },

    //城市下拉选变化
    cascaderElChange(e){
       this.mapCenterText = '河南省郑州市金水区星星充电站'
       this.searchAddress()
    },
    searchAddress(){
      this.tdtMap.clearOverLays();//清除所有标记
                  this.geocoder.getPoint(this.mapCenterText, this.searchResult);//逆地址
    },
    searchResult(result){
      if(result.getStatus() == 0){
      this.tdtMap.panTo(result.getLocationPoint(), 16);
      //创建标注对象
      let marker = new T.Marker(result.getLocationPoint());
      marker.id = 'oneId'//添加id 方便删除区分
      //向地图上添加标注
      this.tdtMap.addOverLay(marker);
      }else{
      alert(result.getMsg());
      }
    },
}
</script>
   
<style>
.map {
width: 100%;
height: 380px;
}   
</style> 方法都可以联合使用    vue3和vue2差别不大

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 关于天地图新手使用