基于天地图使用Leaflet.js进行WebGIS开发实战

news2024/9/23 14:47:35

目录

前言

一、天地图的key

1、创建应用

2、调用限制策略

        注:

(1)日服务调用超量会暂时拒绝访问,次日自动开启;

(2)如果服务调用过程中存在数据爬取或者下载行为,服务调用会被自动拒绝。

二、使用Leaflet调用天地图的底图服务

1、天地图提供的地图服务

2、实际加载底图

 三、Leaflet调用天地图的地理编码接口

1、地理编码接口介绍

2、实现自定义的地理编码查询

四、总结


前言

        在之前的博客中,我们曾介绍了天地图这个官方的网站,除了介绍它在线提供的功能,同时也介绍了它的API服务能力,在博客的最后还使用QGIS进行了在线底图的调用展示。其实在平常的开发或者学习工作中,我们接触到的都是WebGIS,而之前介绍得都是桌面GIS的使用和学习方式,有了天地图之后,其实大家都可以做出比较好用的WebGIS应用,依赖天地图,我们可以实现不同的底图的在线切换,还能实现根据中文地名查找其对应的经纬度信息并且在地图上进行展示。

        本文重点介绍如何基于天地图使用Leaflet来开发WebGIS的应用,首先讲解如何在天地图上申请个人的key,然后讲解在天地图中不同的账户的调用限制策略,最后使用Leaflet开发一个加载天地图影像底图和影像文字标注,在地图的基础之上实现一个全国范围内的地名地址检索。在自己没有对应的地图服务器和地理查询服务器的时候,使用天地图来实现业务的快速支撑。感兴趣的你不妨来这里看看。

一、天地图的key

        天地图的key是我们的第三方应用访问天地图的凭证,现在天地图的key分为浏览器端的key和服务端的key,以前是可以两者混用的,现在必须要分开,否则在请求时就会报错,无法返回对应的数据。因此在这里重点讲一下如何在天地图中申请key。

1、创建应用

        首先使用注册的邮箱登录到天地图的官方网站,然后切换到开发资源目录,如下图所示:

        其实在官网上也大致的说了如何申请key,在成为注册用户之后,还要申请陈伟开发则会,然后获取服务许可也就是key,最后通过key来访问api或者服务(比如在线的地图)。 我们可以点击任意一个api的地址,然后在他的官方说明文档都会有创建key的说明,如下图所示:

        点击申请key的超链接之后,系统将自动跳转到应用管理页面,在应用中来创建不同的key。管理页面如下所示。 

        在上面的页面中其实就管理了我们申请的两个应用。这是我之前申请过的,默认是空白的。点击创建应用发起新建操作。 

        在创建应用的过程当中,根据页面的提示来进行创建即可,唯一需要注意的就是,应用的类型这里。主要包含三种浏览器端、服务端、Android平台。这其实分别代表了使用浏览器访问、后台接口模式(如使用java进行接口调用),以及移动端的调用。 在以前的天地图中,key是可以混用的,现在应用类型分开之后就需要分开,务必按照实际的应用来填写。填写完毕之后,系统会自动创建应用出来,里面包含了服务的类型,还有第三方的应用,如下图所示:

        默认会包含上面这些接口,比如搜索引擎、地理编码、逆地理编码、公交引擎等。可以看到下面有一些第三方服务,暂时我们用不到,使用默认的即可。在线上服务器,我们其实可以限制访问的应用ip,不输入的话默认是不限制的。

        因新系统升级,自公告之日起,应用类型tk严格区分,浏览器端JavaScript开发请选择“浏览器端”类型tk,“服务端tk”不再支持“浏览器端”应用,请注意检查您的应用类型。

        上面的公众确实要仔细查看,历史的应用需要进行调整,否则可能访问不了。经过以上的步骤我们大概就已经创建好了应用,同时可以在应用列表中看到产生的key。在访问天地图的服务时就可以带上这些key即可(按场景和应用类型分开)。

2、调用限制策略

        天地图网站其实根据不同的账号类型有不同的访问限制策略,这里摘录其官网的配置说明。

类别服务名称个人开发者工商企业政府机构
日配额日配额日配额
地图API影像底图1000030000005000000
矢量底图1000030000005000000
矢量注记1000030000005000000
影像注记1000030000005000000
地形晕渲1000030000005000000
地形注记1000030000005000000
矢量英文注记1000030000005000000
影像英文注记1000030000005000000
全球境界1000030000005000000
三维地名1000030000005000000
三维地形1000030000005000000
Web服务API静态地图300060000008000000
行政区划服务300060000008000000
逆地理编码700060000008000000
地理编码700060000008000000
公交规划300060000008000000
驾车规划300060000008000000
地图搜索300060000008000000

        对于个人开发来说,调用次数远远是不够的,对于对外提供服务的,还是需要升级到企业账号,调用次数才能上一个档次。同时这里需要说明的是:

        注:
(1)日服务调用超量会暂时拒绝访问,次日自动开启;
(2)如果服务调用过程中存在数据爬取或者下载行为,服务调用会被自动拒绝。

        我们可以在应用中对我们的请求次数进行监控,看是否会有超的情况,在访问统计中可以看到如下的界面:

        上图中就很明显的展示了服务的调用次数。

二、使用Leaflet调用天地图的底图服务

        在掌握了如何申请天地图的key以后,我们就可以拿着申请的key进行相关的服务调用。首先我们来看一下如何在leaflet中调用天地图的地图服务。

1、天地图提供的地图服务

        在加载天地图的地图服务之前,首先我们要知道它提供了哪些在线底图。在他的地图API页面有明确的展示。

        通过上面的API列表可以看到,天地图提供了不同类型的地图资源,比如矢量图层还有影像图层。还有地形晕渲的效果,在提供底图的在线图源同时,还有有注记信息。通过辅助的注记信息,让我们在地图的展示时更加的友好和明确,能抓住地图的重点。

        为了简单的演示在leaflet中如何加载具体的图层,我们这里展示如何加载球面墨卡托投影的影像底图和对应的注记图层。在官网提供了如何进行瓦片进行数据请求的说明:

        (2)地图瓦片获取

        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=您的密钥

        可以看到,这里不同的除了key之外,还有一个图层的不一样,其它的都是一样的。因此我们只要替换上述的红色部分的内容即可。

2、实际加载底图

        关于如何在地图上使用Leaflet来进行地图加载,相信大家已经非常熟悉了,如果还不太了解的可以先去学习一下基础知识,也可以看一些我之前的一些博客,均有非常详细的说明。这里仅以具体加载瓦片的javascript代码为主进行讲解。首先定义地图实例对象和天地图的key,这里的可以我们选取浏览器端的key,因为我们要实现的webgis的功能。

var map = L.map('mapid',{/*crs:L.CRS.CustomEPSG4326*/}).setView([34.669359, 113.642578], 10);
	
var tdt_client_key = "xxx";//天地图客户端的key

        加载影像底图和影像注记,关键代码如下所示:

L.tileLayer('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=' +tdt_client_key, {
		maxZoom: 18,
		attribution: 'Map data &copy; <a href="http://www.tianditu.gov.cn/">TianDiTu</a>, <a href="http://www.esri.com/">Esri</a> contributors, <a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>'
	}).addTo(map);
	
//标签 
L.tileLayer('http://t1.tianditu.gov.cn/cva_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=cva&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk='+ tdt_client_key, {maxZoom: 18
}).addTo(map);

        经过上述的步骤,我们打开可以看到以下的结果,如果能看到以下结果就表明成功集成了天地图的在线底图的功能。

 三、Leaflet调用天地图的地理编码接口

        在前面的小节中,我们掌握了如何调用天地图的在线底图功能,下面来深入一个更有意思的功能模块,比如我们知道一个地点,但是如何快速知道它的经纬度坐标呢?我们可以购买相应的POI数据,也可以从某度或者某德等厂商进行获取,当你有了天地图之后,其实是可以直接利用天地图的在线查询功能,直接调用它的地理编码接口,实现我们的业务目标。

        本节的目标就是学会在前端调用天地图的地理编码接口,以这个接口为例,详细的讲解如何进行web api 的交互和调用。这里很重要,利用好官方的信息获取渠道,做一些有意思的应用。

1、地理编码接口介绍

        在调用地理编码接口前,首先先来了解什么事地理编码接口。在天地图的官网上有相应的解释。我们来详细的看一下。天地图地理编码API是一类简单的HTTP/HTTPS接口,是指由结构化地址数据(如:北京市海淀区莲花池西路28号)转换为对应坐标点(经纬度)功能,地址解析仅限于国内。这里请注意,地理编码接口仅限于国内,国外的数据暂时没有。

参数值参数说明参数类型是否必备备注(值域)
keyWord请求关键字string

        地理编码响应示例:

        请求: http://api.tianditu.gov.cn/geocoder?ds={"keyWord":"北京市延庆区延庆镇莲花池村前街50夕阳红养老院"}&tk=您的密钥

{
    "location": {
        "lon": "116.001688",
        "level": "地名地址",
        "lat": "40.453228"
    },
    "status": "0",
    "msg": "ok",
    "searchVersion": "4.8.0"
}

        响应参数:

参数值参数说明参数类型备注(值域)
status返回状态string0:正常返回,101:结果为空,404:出错。
msg返回信息stringOK:正常,其他异常。
location地址信息json地址信息

        location参数信息:

参数值参数说明参数类型备注(值域)
lon坐标点显示经度Double必须返回。
lat坐标点显示纬度Double必须返回。
level类别名称string非必须返回。
typeRound附近相似点Array开启周边查询必需返回。

        在了解上述的API接口之后,结合上面的地图展示页面,我们来实现一个地名地址的检索功能。

2、实现自定义的地理编码查询

        为了在界面上实现地理编码查询,首先我们需要在地图界面上定义一个输入框,在输入框中输入我们需要查询的地名信息。然后通过ajax来获取从天地图服务器端返回的地理信息。然后在界面上展示,同时展示其它的辅助信息。

        首先定义一个信息输入框,用于输入待查询的地址信息。如下所示:

<div style="position:absolute;z-index:403;top:50px;left:60px;">
	<input type="text" style="width:300px;height:20px;" name="address" id="address"></input>
	<input type="button" value="查询" onclick="execQuery('');"></input><br/>
</div>

        然后在按钮中定义相应的响应事件,向天地图的服务器发送地理编码查询请求,关键的代码如下:

function execQuery(){
		var keyWord = $("#address").val();
		console.log(keyWord);
		$.ajax({
			type: "get",
			url: "http://api.tianditu.gov.cn/geocoder?ds={'keyWord':'" + keyWord + "'}&tk=" + tdt_client_key,
			data: {},
			success: function(rsData) {
				console.log(rsData);
				var rsObj = jQuery.parseJSON(rsData); 
				var loc_info = rsObj.location;
				L.marker([loc_info.lat, loc_info.lon]).addTo(map).bindPopup("level:"+loc_info.level + ",score:"+ loc_info.score).openPopup();
				map.setView([loc_info.lat, loc_info.lon]);
			}
		});
	}

        经过上面的代码之后,我们来看一下现在的界面展示如下所示:

        可以看到在界面中就出现了搜索栏,在搜索栏中输入我们需要查询的地名或者地址,点击查询按钮就会进入查询,比如我们查询橘子洲景区。点击查询可以跳转以下定位。

        我们发现,使用天地图的地理编码功能还是非常好用的,可以直接返回相应的信息。

         我们也可以通过观察网络服务请求来看一下向天地图的后台发送请求的过程以及响应情况。

        通过网络的监控,可以看到前端页面已经向后端发送请求,同时后端也及时返回了响应。到此,我们就已经实现了如何适用Leaflet进行天地图的在线底图的调用和地理编码接口的调用。相信大家都掌握了相关的知识。 

四、总结

        以上就是本文的主要内容,本文重点介绍如何基于天地图使用Leaflet来开发WebGIS的应用,首先讲解如何在天地图上申请个人的key,然后讲解在天地图中不同的账户的调用限制策略,最后使用Leaflet开发一个加载天地图影像底图和影像文字标注,在地图的基础之上实现一个全国范围内的地名地址检索。在自己没有对应的地图服务器和地理查询服务器的时候,使用天地图来实现业务的快速支撑。感兴趣的你不妨来这里看看,通过本文您不仅可以掌握如何调用天地图的地图资源,同时还掌握如何进行地理编码的查询,对于提高系统的可用性有很大的帮助。行文仓促,难免有不足之处,如有不当之处,还请各位专家朋友在评论区留言指出,不甚感激。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1933953.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UE4-系统默认天空球的使用

当我们在调整平行光的时候&#xff0c;会发现场景中的光照改变了&#xff0c;但是太阳的位置并没有改变&#xff0c;此时就需要用到系统默认的天空球中的&#xff1a; 但是只有在选中是由平行光的改变而改变的情况下才会发生改变&#xff0c;如果没有选择或者选择其他的光源&am…

爬虫(一)——爬取快手无水印视频

前言 最近对爬虫比较感兴趣&#xff0c;于是浅浅学习了一些关于爬虫的知识。爬虫可以实现很多功能&#xff0c;非常有意思&#xff0c;在这里也分享给大家。由于爬虫能实现的功能太多&#xff0c;而且具体的实现方式也有所不同&#xff0c;所以这里开辟了一个新的系列——爬虫…

MySQL(6)内置函数,复合查询.

目录 1.内置函数; 2.复合查询; 1.内置函数: 1.1 日期函数: 时分秒: 时间戳: 基本日期上加日期: 基本日期减去日期: 日期相差天数: &#x1f330; 创建一张表&#xff0c;记录生日: 创建一个留言表: 显示所有留言信息&#xff0c;发布日期只显示日期&#xff0c;不用显示时间: …

【数据结构】Splay详解

Splay 引入 Splay旋转操作splay操作插入操作查询x排名查询排名为x删除操作查询前驱/后继模板Splay时间复杂度分析 进阶操作截取区间区间加&#xff0c;区间赋值&#xff0c;区间查询&#xff0c;区间最值区间翻转原序列整体插入指定位置插入整体插入末尾区间最大子段和 一些好题…

自动驾驶系列—智能巡航辅助功能中的横向避让功能介绍

文章目录 1. 背景介绍2. 功能定义3. 功能原理4. 传感器架构5. 实际应用案例5.1 典型场景1&#xff1a;前方车辆压线5.2 典型场景2&#xff1a;相邻车道有大型车辆5.3 典型场景3&#xff1a;它车近距离cut in 6. 总结与展望 1. 背景介绍 随着汽车技术的发展&#xff0c;智能巡航…

一些常见的网络故障

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 ☁️运维工程师的职责&#xff1a;监…

关于我在vue3中使用swiper的使用碰到swiper-slide的width特别大的这件事儿

一. 环境 "vue": "^3.3.8","swiper": "^10.0.4",二. 问题描述 原代码: <template><swiperclass"wq-swiper":space-betwee"spaceBetween":pagination"{ clickable: true }":modules"mod…

Unity发微信小游戏记录

Unity2Wechat 流程1.小程序AppID2.Unity 插件3.微信开发者工具4.CDN资源服 参考文档 流程 1.小程序AppID 已有账号 登陆公众平台获取小程序AppID https://mp.weixin.qq.com/ 无账号 注册小程序 https://developers.weixin.qq.com/minigame/dev/guide/ 经营类目需要是游戏大类…

msvcr120.dll丢失的原因分析,msvcr120.dll丢失的解决方法分享

在日常使用电脑的过程中&#xff0c;我们可能会遇到一些错误提示或程序无法正常运行的问题。其中&#xff0c;msvcr120.dll丢失是一种常见的错误&#xff0c;它会导致某些应用程序无法启动或运行。本文将分析msvcr120.dll丢失的原因&#xff0c;并介绍5种解决方法以及修复过程中…

postman双击打不开的解决方案

postman双击打不开的解决方案 深入再深入 于 2022-05-09 15:45:56 发布 阅读量3.1k 收藏 2 点赞数 4 文章标签&#xff1a; postman 版权 右键属性 安装路径 更新版本 回滚 问题排查 关键词由CSDN通过智能技术生成 解决方案&#xff1a; 右键-属性&#xff0c;复制安装路…

App Inventor 2 天气预报App开发 - 第三方API接入的通用方法(2)

本文来自AppInventor2中文网&#xff08;www.fun123.cn&#xff09;参考文档&#xff0c;调用第三方天气接口获取天气JSON数据&#xff0c;解析并展示在App上。 App效果图&#xff0c;展示未来7日的天气预报&#xff0c;包括日期、天气图示和温度&#xff1a; App原理介绍 通…

RT-DETR+Flask实现目标检测推理案例

今天&#xff0c;带大家利用RT-DETR&#xff08;我们可以换成任意一个模型&#xff09;Flask来实现一个目标检测平台小案例&#xff0c;其实现效果如下&#xff1a; 目标检测案例 这个案例很简单&#xff0c;就是让我们上传一张图像&#xff0c;随后选择一下置信度&#xff0c;…

【博士每天一篇文献-算法】连续学习算法之HNet:Continual learning with hypernetworks

阅读时间&#xff1a;2023-12-26 1 介绍 年份&#xff1a;2019 作者&#xff1a;Johannes von Oswald&#xff0c;Google Research&#xff1b;Christian Henning&#xff0c;EthonAI AG&#xff1b;Benjamin F. Grewe&#xff0c;苏黎世联邦理工学院神经信息学研究所 期刊&a…

解决虚拟机与主机ping不通,解决主机没有vmware网络

由于注册表文件缺失导致&#xff0c;使用这个工具 下载cclean 白嫖就行 https://www.ccleaner.com/ 是 点击修复就可以了

《TF2.x》强化学习手册-P47-P59-TD时序差分-Monte_carlo蒙特卡洛预测与控制算法

文章目录 实现时序差分学习前期准备实现步骤工作原理 构建强化学习中的蒙特卡洛预测和控制算法前期准备实现步骤工作原理 实现时序差分学习 时序差分&#xff08;Temporal Difference &#xff0c;TD&#xff09;算法。TD算法是一种预测值或目标值校正的方法&#xff0c;用于强…

JRT实体视图查询

JRT的设计目标就是多数据库支持&#xff0c;对于爬行周边数据提供DolerGet解决爬取多维数据问题。但是对于通过父表字段筛选子表数据就不能通过DolerGet取数据了&#xff0c;因为查询到的父表数据没有子表数据的ID。 比如下面表&#xff1a; 我需要按登记号查询这个登记号的报…

tree组件实现折叠与展开功能(方式2 - visible计算属性)

本示例节选自vue3最新开源组件实战教程大纲&#xff08;持续更新中&#xff09;的tree组件开发部分。考察Vue3 Composition API形式的计算属性的用法&#xff0c;computed可以单独用在ts文件中&#xff0c;实现ts的计算属性类型的定义。 父节点属性 在IFlatTreeNode中定义父节…

Blackbox AI:你的智能编程伙伴

目录 Blackbox AI 产品介绍 Blackbox AI 产品使用教程 Blackbox AI体验 AI问答 代码验证 实时搜索 探索&代理 拓展集成 总结 Blackbox AI 产品介绍 Blackbox是专门为程序员量身定制的语言大模型&#xff0c;它针对20多种编程语言进行了特别训练和深度优化&#xff0c;在AI代…

MySQL JDBC

JDBC&#xff1a;Java的数据库编程 JDBC&#xff0c;即Java Database Connectivity&#xff0c;java数据库连接。是一种用于执行SQL语句的Java API&#xff0c;它是 Java中的数据库连接规范。这个API由 java.sql.*,javax.sql.* 包中的一些类和接口组成&#xff0c;它为Java 开…

MySQL:基础操作(增删查改)

目录 一、库的操作 创建数据库 查看数据库 显示创建语句 修改数据库 删除数据库 备份和恢复 二、表的操作 创建表 查看表结构 修改表 删除表 三、表的增删查改 新增数据 插入否则更新 插入查询的结果 查找数据 为查询结果指定别名 结果去重 where 条件 结…