关于天地图新手使用

打印 上一主题 下一主题

主题 807|帖子 807|积分 2421

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

  1. <template>
  2.   <div id="mapDiv" class="map"></div>
  3. </template>
  4. <script setup>
  5. import { ref, watch, onMounted, nextTick } from "vue"
  6. import axios from 'axios';
  7. const props = defineProps({
  8.   data: {
  9.     type: Object,
  10.     default: () => {
  11.       return {
  12.         longitude: "113.762375",
  13.         latitude: "39.761003"
  14.       }
  15.     }
  16.   },
  17.   title: {
  18.     type: String,
  19.     default: "北京天安门"
  20.   }
  21. })
  22. const map = ref(null)
  23. const zoom = ref(16)
  24. let longitude = ref("")
  25. let latitude = ref("")
  26. const marker = ref(null);
  27. const label = ref(null);
  28. watch(
  29.   () => props.data,
  30.   (newValue, oldValue) => {
  31.     initLoad()
  32.   }
  33. )
  34. const initLoad = () => {
  35.   // 获取经纬度及名称
  36.   longitude.value = props.data.longitude
  37.   latitude.value = props.data.latitude
  38.   if (!map.value) {
  39.     const T = window.T
  40.     map.value = new T.Map("mapDiv", {
  41.       // projection: "EPSG:4326",
  42.       zoom: zoom.value, //设置默认放大缩小
  43.       center: new T.LngLat(longitude.value, latitude.value) //设置当前地图中心点
  44.     })
  45.     // 添加点击事件监听器 点击跳转过去
  46.     map.value.on('click', (e) => {
  47.       // 更新地图中心
  48.       longitude.value = e.lnglat.lng;
  49.       latitude.value = e.lnglat.lat;
  50.       map.value.panTo(e.lnglat);
  51.       // 清除所有覆盖物
  52.       let newMarker = map.value.getOverlays();
  53.       newMarker.forEach((i)=>{
  54.         console.log('i',i);
  55.         if (i.id == 'oneId') {
  56.           map.value.removeOverLay(i)
  57.         } else{
  58.           console.log('谁也不删');
  59.         }
  60.       })
  61.       console.log('newMarker--地图上的所有点',newMarker);
  62.       // 重新添加新的标记点
  63.       addMarkers();
  64.     });
  65.     addMarkers();
  66.   } else {
  67.     map.value.panTo(new T.LngLat(longitude.value, latitude.value))
  68.   }
  69.   addMarkers()
  70. }
  71. // 添加标记点
  72. const addMarkers = () => {
  73.   // 更新图标实例
  74.   const icon = new T.Icon({
  75.     iconUrl: "src/assets/images/projectKanban/btn-bg-border.svg",
  76.     iconSize: new T.Point(27, 27),
  77.     iconAnchor: new T.Point(10, 25)
  78.   });
  79.   const point = new T.LngLat(longitude.value, latitude.value);
  80.   marker.value = new T.Marker(point, icon); // 创建标注
  81.   map.value.addOverLay(marker.value); // 使用 addOverLay
  82.   marker.value.id = 'oneId'//添加id 确定要删除那个标点 用来区分
  83.   handleSearch()//地址解析当前位置名称
  84.   // 添加文字标签
  85.   // label.value = new T.Label({
  86.   //   text: props.title,
  87.   //   position: new T.LngLat(longitude.value, latitude.value),
  88.   //   offset: new T.Point(-60, 20)
  89.   // });
  90.   // map.value.addOverLay(label.value);
  91. }
  92. const handleSearch = async () => {
  93.   try {
  94.     const apiKey = '123456'; // 天地图 API 密钥
  95.     let params = {
  96.       lon: longitude.value,
  97.       lat: latitude.value,
  98.       ver: 1
  99.     }
  100.     const postStr = JSON.stringify(params);
  101.     const url = `http://api.tianditu.gov.cn/geocoder?postStr=${encodeURIComponent(postStr)}&type=geocode&tk=${apiKey}`;
  102.     const response = await axios.get(url);
  103.     if (response.status === 200) {
  104.       console.log('Geocoding result:', response.data.result);
  105.       let res = response.data.result
  106.       // 添加文字标签
  107.       label.value = new T.Label({
  108.         text: res.addressComponent.poi,
  109.         position: new T.LngLat(longitude.value, latitude.value),
  110.         offset:new T.Point(0, -20) // 居中于标记点上方
  111.       });
  112.       map.value.addOverLay(label.value);
  113.       label.value.id = 'oneId'//添加id 确定要删除那个标点 用来区分
  114.       // 处理响应数据
  115.     } else {
  116.       console.error('Request failed with status:', response.status);
  117.     }
  118.   } catch (error) {
  119.     console.error('Error fetching geocoding data:', error.message);
  120.   }
  121. };
  122. onMounted(async () => {
  123.   await nextTick()
  124.   initLoad()
  125. })
  126. </script>
  127. <style>
  128. .map {
  129.   width: 100%;
  130.   height: 380px;
  131. }   
  132. </style>
复制代码
vue2写法

  1. <template>
  2.   <div id='mapDiv' class="map"></div>
  3. </template>
  4.   
  5. <script>
  6. export default {
  7.   name: "AmendProject",
  8.   data() {
  9.     return {
  10.         tdtMap:{},//创建的地图map
  11.       
  12.     }
  13.   },
  14.   created(){
  15.       this.getAddress()//获取当前位置 设置地图中心店
  16.   },
  17.   mounted(){
  18.     //这里的initMap可以在拿到经纬度之后调用  也可以过去当前用户位置信息去调用
  19.     // setTimeout(() => {
  20.     //     this.initMap();
  21.     // }, 500); // 延迟 0.5 秒以确保 API 加载完成
  22.   },
  23.   methods: {
  24.     getAddress(){
  25.       //利用浏览器Api进行获取位置信息
  26.        navigator.geolocation.getCurrentPosition(
  27.         position => {
  28.           if (position.coords) {
  29.             this.centerMap = {
  30.               lng: position.coords.longitude,
  31.               lat: position.coords.latitude,
  32.             };
  33.             //延时不要删除
  34.             setTimeout(()=>{
  35.               this.initMap()
  36.             },500)
  37.           }
  38.         },
  39.         error => {
  40.           this.centerMap = {
  41.             lng: 116.39128, // 默认经度
  42.             lat: 39.90675   // 默认纬度
  43.           };
  44.           //延时不要删除
  45.           setTimeout(()=>{
  46.             this.initMap()
  47.           },500)
  48.           console.error('获取位置失败:', error);
  49.         },
  50.         { enableHighAccuracy: true, timeout: 5000, maximumAge: 0 }
  51.       );
  52.     },
  53.      // 创建天地图
  54.     initMap() {
  55.       try {
  56.         let T = window.T;
  57.         // 检查 T 对象是否存在
  58.         if (typeof T === 'undefined' || !T.Map) {
  59.           console.error('T object is not defined.');
  60.           return;
  61.         }
  62.         // 确保 T 对象存在
  63.         this.tdtMap = new T.Map("tdtMapDivID") // 使用正确的 ID
  64.         // 设置显示地图的中心点和级别
  65.         this.tdtMap.centerAndZoom(new T.LngLat(this.centerMap.lng, this.centerMap.lat), 15)
  66.         //创建对象  逆地址解析用到 如果不需要可以不用
  67.                     this.geocoder = new T.Geocoder();
  68.         // 添加点击事件监听器
  69.         this.tdtMap.on('click', (e) => {
  70.           // 更新地图中心
  71.           this.centerMap = e.lnglat;//修改经纬度
  72.           this.tdtMap.panTo(e.lnglat);//设置中心点
  73.           // 清除所有覆盖物
  74.           let newMarker = this.tdtMap.getOverlays(); //获取当前地图的所有点
  75.           newMarker.forEach((i)=>{
  76.             // 这里通过id进行删除 这个id是根据你创建marker的时候设置的唯一标识
  77.             if (i.id == 'oneId') {
  78.               this.tdtMap.removeOverLay(i)
  79.             } else{
  80.               console.log('谁也不删');
  81.             }
  82.           })
  83.           // 删除完成后  再次重新添加新的标记点
  84.           this.addMarkers();
  85.         })
  86.         this.addMarkers()
  87.       } catch (error) {
  88.         console.log('error',error);
  89.       }
  90.     },
  91.     // 设置标点
  92.     addMarkers(){
  93.       this.tdtMap.panTo(this.centerMap);//设置中心点
  94.       //设置图标
  95.       const icon = new T.Icon({
  96.         iconUrl: "src/assets/images/projectKanban/btn-bg-border.svg",
  97.         iconSize: new T.Point(27, 27),
  98.         iconAnchor: new T.Point(10, 25)
  99.       });
  100.       const point = new T.LngLat(this.centerMap.lng, this.centerMap.lat);
  101.       this.marker = new T.Marker(point, icon); // 创建标注
  102.       this.tdtMap.addOverLay(this.marker); // 使用 addOverLay
  103.       this.marker.id = 'oneId'//添加id 确定要删除那个标点 用来区分
  104.       // this.marker.enableDragging()//可拖拽点
  105.     },
  106.     //城市下拉选变化
  107.     cascaderElChange(e){
  108.        this.mapCenterText = '河南省郑州市金水区星星充电站'
  109.        this.searchAddress()
  110.     },
  111.     searchAddress(){
  112.       this.tdtMap.clearOverLays();//清除所有标记
  113.                   this.geocoder.getPoint(this.mapCenterText, this.searchResult);//逆地址
  114.     },
  115.     searchResult(result){
  116.       if(result.getStatus() == 0){
  117.         this.tdtMap.panTo(result.getLocationPoint(), 16);
  118.         //创建标注对象
  119.         let marker = new T.Marker(result.getLocationPoint());
  120.         marker.id = 'oneId'//添加id 方便删除区分
  121.         //向地图上添加标注
  122.         this.tdtMap.addOverLay(marker);
  123.       }else{
  124.         alert(result.getMsg());
  125.       }
  126.     },
  127.   }
  128. </script>
  129.    
  130. <style>
  131. .map {
  132.   width: 100%;
  133.   height: 380px;
  134. }   
  135. </style>
复制代码
方法都可以联合使用    vue3和vue2差别不大

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

尚未崩坏

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表