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

目录

前言

一、天地图的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.mfbz.cn/a/843632.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【BUG】已解决:AttributeError: ‘WindowsPath‘ object has no attribute ‘rstrip‘

AttributeError: ‘WindowsPath‘ object has no attribute ‘rstrip‘ 目录 AttributeError: ‘WindowsPath‘ object has no attribute ‘rstrip‘ 【常见模块错误】 【错误原因】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&…

C语言 打印菱形的程序(Program to print the Diamond Shape)

给定一个数字n &#xff0c;编写一个程序来打印一个有2n行的菱形。 例子 &#xff1a; // C program to print // diamond shape with // 2n rows #include<stdio.h> // Prints diamond // pattern with 2n rows void printDiamond(int n) { int space n - 1; …

用Python实现Cmpp协议的教程

引言&协议概述 &#xff08;CMPP&#xff09;是中国移动为实现短信业务而制定的一种通信协议&#xff0c;用于在客户端&#xff08;SP&#xff0c;Service Provider&#xff09;和中国移动短信网关之间传输短消息&#xff0c;有时也叫做移动梦网短信业务。CMPP3.0是该协议…

在线 PDF 制作者泄露用户上传的文档

两家在线 PDF 制作者泄露了数万份用户文档&#xff0c;包括护照、驾驶执照、证书以及用户上传的其他个人信息。 我们都经历过这样的情况&#xff1a;非常匆忙&#xff0c;努力快速制作 PDF 并提交表单。许多人向在线 PDF 制作者寻求帮助&#xff0c;许多人的祈祷得到了回应。 …

【单目3D检测】smoke(1):模型方案详解

纵目发表的这篇单目3D目标检测论文不同于以往用2D预选框建立3D信息&#xff0c;而是采取直接回归3D信息&#xff0c;这种思路简单又高效&#xff0c;并不需要复杂的前后处理&#xff0c;而且是一种one stage方法&#xff0c;对于实际业务部署也很友好。 题目&#xff1a;SMOKE&…

StringBuilder, Stringbuffer,StringJoiner

StringBuilder StringBuilder 代表可变字符串对象&#xff0c;相当于是一个容器&#xff0c;里面装的字符串是可以改变的&#xff0c;就是用来操作字符串的。 StringBuilder 比String更适合做字符串的修改操作&#xff0c;效率更高&#xff0c;代码更加的简洁。 public clas…

Hadoop3:MR程序处理小文件的优化办法(uber模式)

一、解决方案 1、在数据采集的时候&#xff0c;就将小文件或小批数据合成大文件再上传HDFS&#xff08;数据源头&#xff09; 2、Hadoop Archive&#xff08;存储方向&#xff09; 是一个高效的将小文件放入HDFS块中的文件存档工具&#xff0c;能够将多个小文件打包成一个HAR…

Java--反射

反射是什么 反射允许对成员变量&#xff0c;成员方法和构造方法的信息进行编程访问 获取class对象的三种方式 代码 package a2;public class Student {private String name;private int age;public Student(){}public Student(String name,int age){this.name name;this.age …

处理uniapp刷新后,点击返回按钮跳转到登录页的问题

在使用uniapp的原生返回的按钮时&#xff0c;如果没有刷新会正常返回到对应的页面&#xff0c;如果刷新后会在当前页反复横跳&#xff0c;或者跳转到登录页。那个时候我第一个想法时&#xff1a;使用浏览器的history.back()方法。因为浏览器刷新后还是可以通过右上角的返回按钮…

package.json中对peerDependencies的理解

peerDependencies只要是用来限制依赖的&#xff0c;最近在开发的时候有遇到这样的问题&#xff0c;所以研究了一下 "peerDependencies": {"vue/composition-api": "^1.0.5","vue/runtime-core": "^3.0.0","echarts&q…

数据库-练习

题目要求&#xff1a;按照要求建立数据库与表&#xff0c;并完成相应的查询操作 解题步骤如下代码所示&#xff1a; //建立相关的数据库mydb8_worker mysql> show databases; -------------------- | Database | -------------------- | information_schema | | …

MySQL通过bin-log恢复数据

MySQL通过bin-log恢复数据 1.bin-log说明2.数据恢复流程2.1 查看是否开启bin-log2.3 查看bin-log2.4 执行数据恢复操作2.5 检查数据是否恢复 1.bin-log说明 mysqldump和bin-log都可以作为MySQL数据库备份的方式&#xff1a; mysqldump 用于将整个或部分数据库导出为可执行的S…

spring-boot 整合 redisson 实现延时队列(文末有彩蛋)

应用场景 通常在一些需要经历一段时间或者到达某个指定时间节点才会执行的功能&#xff0c;比如以下这些场景&#xff1a; 订单超时提醒收货自动确认会议提醒代办事项提醒 为什么使用延时队列 对于数据量小且实时性要求不高的需求来说&#xff0c;最简单的方法就是定时扫描数据…

Odoo17架构概述

多层架构 Odoo遵循多层架构&#xff0c;这意味着演示&#xff0c;业务逻辑和数据存储是分开的。更具体地说&#xff0c;它使用三层架构。 UI展示层 UI表示层是 HTML5、JavaScript 和 CSS 的组合。 应用程序的最顶层是用户界面。界面的主要功能是将任务和结果转换为用户可以理…

MacBook电脑远程连接Linux系统的服务器方法

一、问题简介 Windows 操作系统的电脑可使用Xshell等功能强大的远程连接软件。通过连接软件&#xff0c;用户可以在一台电脑上访问并控制另一台远程计算机。这对于远程技术支持、远程办公等场景非常有用。但是MacBook电脑的macOS无法使用Xshell。 在Mac上远程连接到Windows服…

解决npm install(‘proxy‘ config is set properly. See: ‘npm help config‘)失败问题

摘要 重装电脑系统后&#xff0c;使用npm install初始化项目依赖失败了&#xff0c;错误提示&#xff1a;‘proxy’ config is set properly…&#xff0c;具体的错误提示如下图所示&#xff1a; 解决方案 经过报错信息查询解决办法&#xff0c;最终找到了两个比较好的方案&a…

最新可用度盘不限速后台系统源码_去授权开心版

某宝同款度盘不限速后台系统源码&#xff0c;验证已被我去除&#xff0c;两个后端系统&#xff0c;账号和卡密系统 第一步安装宝塔&#xff0c;部署卡密系统&#xff0c;需要环境php7.4 把源码丢进去&#xff0c;设置php7.4&#xff0c;和伪静态为thinkphp直接访问安装就行 …

MLIR的TOY教程学习笔记

MLIR TOY Language 文章目录 MLIR TOY Language如何编译该项目ch1: MLIR 前端IR解析ch2: 定义方言和算子 (ODS)1. 定义方言2. 定义OP3. OP相关操作4. 定义OP ODS (Operation Definition Specification)1. 基本定义2. 添加文档3. 验证OP4. 新增构造函数5. 定义打印OP的格式 ch3:…

简单工厂、工厂方法与抽象工厂之间的区别

简单工厂、工厂方法与抽象工厂之间的区别 1、简单工厂&#xff08;Simple Factory&#xff09;1.1 定义1.2 特点1.3 示例场景 2、工厂方法&#xff08;Factory Method&#xff09;2.1 定义2.2 特点2.3 示例场景 3、抽象工厂&#xff08;Abstract Factory&#xff09;3.1 定义3.…

视频共享融合赋能平台LntonCVS视频监控管理平台视频云解决方案

LntonCVS是基于国家标准GB28181协议开发的视频监控与云服务平台&#xff0c;支持多设备同时接入。该平台能够处理和分发多种视频流格式&#xff0c;包括RTSP、RTMP、FLV、HLS和WebRTC。主要功能包括视频直播监控、云端录像与存储、检索回放、智能告警、语音对讲和平台级联&…