草庐IT

vue项目天地图使用

迷路的琉星 2023-04-15 原文

最近的项目中遇到了新的需求,需要在项目中使用天地图,因为第一次接触,官方的网站引用之类的也没有进行详细的介绍,自己去找的时候发现这部分的文章也比较少,有的问题也没有讲清楚,所以发布这篇文章分享总结一下vue项目天地图的使用。

官方天地图引入

http://lbs.tianditu.gov.cn/api/js4.0/guide.html 这是天地图的官方地址,我使用的是最新的版本,4.0的api具体的可以进入官网去看看,像下面这样选择就可以


引入只需要在index.html页面引入

// 这里的tk为你在天地图的官网申请的tk
<script src="https://api.tianditu.gov.cn/api?v=4.0&tk=你申请的tk" type="text/javascript"></script>

如果要用到热力图的效果的话还需要引入

<script src="http://lbs.tianditu.gov.cn/api/js4.0/opensource/openlibrary/HeatmapOverlay.js" type="text/javascript"></script>

这里是官网的热力图js,顺序一定要是天地图的js引入在热力图之前,因为热力图的js会使用到天地图里面定义的东西。

这里还会有个小问题,如果你的项目地址是https的访问http的时候会不安全,访问不到,所以可以直接将这两个文件下载下来放在本地去引入

<script src="./tdt.js" type="text/javascript"></script>
<script type="text/javascript" src="./HeatmapOverlay.js"></script>

这里的tdt.jsHeatmapOverlay.js就是下载到本地的文件。这样引入也会更快,减少网络请求的时间。可以尽量使用这种引入。
到这里引入就算全部完成了。

天地图初始化

首先创建承载标签

<div id="mapContainerTD" ></div>

注意!!!!这里会存在一个问题,我当初卡了一天没有解决,这里的标签如果用v-show或者v-if时,地图初始化会加载不出来,一定要标签显示的时候才会进行加载。如果一定要用到这两个的话,这里可以提供一个解决方案,可以先将值设置为true,然后执行地图的初始化,执行完成之后在将值设置为false即可。

data中定义对象mapTD:null

var T = window.T; // 这个一定需要定义,可以直接在mounted里面定义
this.mapTD = null
let mapTD = new T.Map('mapContainerTD'); // div的id
// 传参中心点经纬度,以及放大程度
mapTD.centerAndZoom(new T.LngLat(122.225718, 30.264533), 15);
mapTD.setMinZoom(10);// 设置最小变动层级
mapTD.setMaxZoom(18);// 设置最大变动层级
mapTD.enableDrag();// 启用拖拽
mapTD.enableScrollWheelZoom();// 启用滚轮放大缩小
this.mapTD = mapTD;

这样可以直接使用了,这里也有一点需要注意的地方,官方的天地图使用的是wgs84坐标系,如果点位是其他坐标系的话需要自己转之后在使用,后面的打点图层都一样

天地图图层添加(这里以卫星图为例)

  • 初始化图层
let imageURL = "http://t0.tianditu.gov.cn/img_w/wmts?" +
       "SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles" +
       "&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=您的密钥";
//创建自定义图层对象
let lay = new T.TileLayer(imageURL, {minZoom: 10, maxZoom: 18});

天地图图层 可以在这个里面选择自己需要的图层

  • 添加图层
 this.mapTD.addLayer(lay);
  • 移除图层
let layer = this.mapTD.getLayers() // 获取当前地图覆盖物
this.mapTD.removeLayer(layer[1])  //删除想要的

this.mapTD.clearLayers() // 清除所有的覆盖物

天地图聚合打点

设置聚合点基础图标

let icon = new T.Icon({
   iconUrl: require(`自己的点位图标`),
   id: 'test',   // 类型id
   iconSize: new T.Point(27, 36), // 图标大小
   iconAnchor: new T.Point(0, 0)  // 位移量
})
let marker = new T.Marker(
	new T.LngLat(xy[0], xy[1]),
	{ icon:icon })
this.markerObject = []  // 初始化聚合点集合数组
marker.clusterData = clusterData // 这里可以像这样给点位添加自定义属性

clusterData 可以为任意形式

// 添加点击事件
marker.addEventListener("click", (e) => {
  console.log(e, e.target.clusterData); // 可以从这里取出自定义的属性
  this.mapTD.panTo(new T.LngLat(e.lnglat.lng,e.lnglat.lat), zoom) // 移动中心点方法
});
this.markerObject.push(marker)
this.clustererObject = new T.MarkerClusterer(this.mapTD, { markers: that.markerObject }) 
// 将聚合点集合用变量存起来,删除的时候会用得到

因为聚合点和基础的点位不太一样,所以删除的时候地图的删除覆盖物方法不生效,必须使用聚合点自己的删除方法。

// 设置聚合图标的最大层级,也就是说当到达18级时,所有聚合的点会全部
this.clustererObject.setMaxZoom(18)
this.clustererObject.setStyles([     //这个可以自定义不同数量的点位聚合时显示的样式
  {
    url: require("../../../assets/daishan/zhongdian3.png"), // 聚合的图标
    size: [36, 36], //聚合的图标大小
    offset: new T.Point(-16, -16), //显示图片的偏移量
    // textColor: '#fff', //显示数字的颜色
    // textSize: 10,//显示文字的大小
    range: [0, 10],
  },
  {
    url: require("../../../assets/daishan/zhongdian2.png"), // 聚合的图标
    size: [36, 36], //聚合的图标大小
    offset: new T.Point(-16, -16), //显示图片的偏移量
    range: [11, 400],
  },
  {
    url: require("../../../assets/daishan/zhongdian1.png"), // 聚合的图标
    size: [48, 48], //聚合的图标大小
    offset: new T.Point(-18, -18), //显示图片的偏移量
    range: [400, 80000],
  },
])

删除聚合点

if(this.clustererObject){
	  this.clustererObject.clearMarkers(this.markerObject);
	  this.clustererObject = null
}
// 这里删除聚合点只能用clearMarkers()方法才能够删除

添加自定义弹窗

<div ref="populationInfoWindowRef" ></div> 
<!--  这里的弹窗样式可以自己自定义,定义ref  -->
let sContent = this.$refs.populationInfoWindowRef.$el  //这里使用ref取到盒子对象原型
let infoWin = new T.InfoWindow(sContent,{offset: new T.Point(-100, 480)});
this.mapTD.openInfoWindow(infoWin,new T.LngLat(e.lnglat.lng, e.lnglat.lat))
//e.lnglat.lng, e.lnglat.lat就是点击后传来的参数

这样就可以打开点击弹窗了

天地图添加网格

天地图的添加网格就是添加图层,但是设置和图层有一点区别,

let points = [] // 网格数据集合,之能有一层,

// 循环点位 例如这样
points.push(new T.LngLat(116.315000,39.964750));
points.push(new T.LngLat(116.303330,39.960810));
points.push(new T.LngLat(116.306760,39.866270));
points.push(new T.LngLat(116.328740,39.847560));

this.Polygons = new T.Polygon(points,{
	  fillColor: "#fff", // 多边形填充颜色
	  weight: 1, // 线条宽度,默认为 1
	  color: "#8B1A1A", // 线条颜色
	  fillOpacity: 0.2, //多边形透明度
});
// 如果是带洞的多边形,则如下
let points = [] // 网格数据集合,之能有一层,
let points1 = [] // 网格数据集合,之能有一层,
this.mapTD.addOverLay(this.Polygons);


this.Polygons = new T.Polygon(points,{
	  fillColor: "#fff", // 多边形填充颜色
	  weight: 1, // 线条宽度,默认为 1
	  color: "#8B1A1A", // 线条颜色
	  fillOpacity: 0.2, //多边形透明度
});
// 如果是带洞的多边形,则如下
let points = [] // 网格数据集合,之能有一层,

// 循环点位 例如这样
points.push(new T.LngLat(116.315000,39.964750));
points.push(new T.LngLat(116.303330,39.960810));
points.push(new T.LngLat(116.306760,39.866270));
points.push(new T.LngLat(116.328740,39.847560));
points.push(new T.LngLat(116.366500,39.855730));
points.push(new T.LngLat(116.442380,39.856520));
points.push(new T.LngLat(116.455080,39.865480));
points.push(new T.LngLat(116.456110,39.950020));
points.push(new T.LngLat(116.428990,39.967390));
let points1 = [] 

points1.push(new T.LngLat(116.349330,39.941590));
points1.push(new T.LngLat(116.350620,39.900650));
points1.push(new T.LngLat(116.353110,39.898670));
points1.push(new T.LngLat(116.413880,39.899990));
points1.push(new T.LngLat(116.418340,39.903150));
points1.push(new T.LngLat(116.429330,39.903940));
points1.push(new T.LngLat(116.427270,39.947910));
points1.push(new T.LngLat(116.365810,39.946600));


this.Polygons = new T.Polygon([points,points1],{
	  fillColor: "#fff", // 多边形填充颜色
	  weight: 1, // 线条宽度,默认为 1
	  color: "#8B1A1A", // 线条颜色
	  fillOpacity: 0.2, //多边形透明度
});
this.mapTD.addOverLay(this.Polygons);

这样网格就添加完成,清除网格和清除图层一样

this.mapTD.clearOverLays(this.Polygons)

结语

这就是我项目中使用到天地图的使用分享和总结,还有很多的方法及参数我都没有写出来,如果有需要用到的可以自己去官网找找对应的方法及属性。官方的网站还有示例代码,可以借鉴参考。感兴趣的小伙伴可以评论分享,有不清楚的可以直接评论区发言或者私信我,如果看到会及时回复,如果有内容写的不对可以直接指出来,共同进步。

有关vue项目天地图使用的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

    我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

  3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  4. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  5. ruby - 在 Ruby 中使用匿名模块 - 2

    假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

  6. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

    我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

  7. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  8. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  9. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  10. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

随机推荐