5分钟学会Leaflet加载天地图和arcgis服务

5 篇文章 0 订阅
4 篇文章 0 订阅

Leaflet是一个适用于移动端交互地图的开源JavaScript库。

对移动设备很友好,gzip压缩JS代码大约38 KB,它提供了大多数开发人员所需要的所有地图功能。

扩展性强、插件资源丰富,文档清晰的API,源代码简单、易读。

本文用简单的示例,引导新手快速使用leaflet快速开始、加载天地图、加载arcgis服务、自定义4490坐标系,将天地图扩展到19级。

一、快速开始

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Quick Start - Leaflet</title>
  <link rel="stylesheet" href="./css/leaflet.css">
  <style>
    *{
      margin: 0;
      padding: 0;
    }
    #map {
      height: 100vh;
      width: 100vw;
    }
  </style>
</head>
<body>
  <div id="map"></div>
  <script src="./js/leaflet-src.js"></script>
  <script>
    var map = L.map('map').setView([39.736861245030326, 116.13991336098002], 13);
    L.tileLayer('http://{s}.tile.osm.org/{z}/{x}/{y}.png').addTo(map);
    L.marker([39.736861245030326, 116.13991336098002]).addTo(map)
      .bindPopup('marker')
      .openPopup();
  </script>
</body>
</html>

 示例效果

 以上代码实现了Leaflet的引入,地图的加载及marker的简单用法,接下来开始加载天地图。

二、加载天地图

1.去天地图官网获取天地图服务许可(Key

2.引入leaflet.ChineseTmsProviders

3.将leaflet.ChineseTmsProviders中的key换成自己申请的key

4.初始化地图实例并加载天地图

<script>
    const tileOptions = {
      minZoom: 1,
      maxZoom: 19
    }
    // 定义矢量地图
    var normalm = L.tileLayer.chinaProvider('TianDiTu.Normal.Map', tileOptions)
    // 定义矢量注记
    var normala = L.tileLayer.chinaProvider('TianDiTu.Normal.Annotion', tileOptions)
    // 组合地图和注记
    var normal = L.layerGroup([normalm, normala])
    var map = L.map('map', {
      center: [39.736861245030326, 116.13991336098002],
      zoom: 16,
      layers: [normal]
    })
    let marker = L.marker([39.736861245030326, 116.13991336098002]).addTo(map)
</script>

  示例效果

三、加载Arcgis服务

1.引入esri-leaflet.jsesri-leaflet-renderers.js

<script src="./js/esri-leaflet.js"></script>
<script src="./js/esri-leaflet-renderers.js"></script>

2.加载arcgis服务

<script>
    const tileOptions = {
      minZoom: 1,
      maxZoom: 19
    }
    // 定义矢量地图
    var normalm = L.tileLayer.chinaProvider('TianDiTu.Normal.Map', tileOptions)
    // 定义矢量注记
    var normala = L.tileLayer.chinaProvider('TianDiTu.Normal.Annotion', tileOptions)
    // 组合地图和注记
    var normal = L.layerGroup([normalm, normala])
    var map = L.map('map', {
      center: [39.736861245030326, 116.13991336098002],
      zoom: 16,
      layers: [normal]
    })
    let marker = L.marker([39.736861245030326, 116.13991336098002]).addTo(map)

    const mapServerUrl = 'http://你项目的arcgis服务地址/MapServer/0'
    let mapLayer = L.esri.featureLayer({
      url: mapServerUrl
    }).addTo(map)
</script>

  示例效果

四、自定义4490坐标(Leaflet默认为EPSG3857)

1.引入proj4-src.jsproj4leaflet.js

<script src="./js/proj4-src.js"></script>
<script src="./js/proj4leaflet.js"></script>

2.定义缩放比例和原点(参数可以在https://epsg.io/4490参看,定义其他坐标系同理)

const CRS_4490 = new L.Proj.CRS(
      'EPSG:4490',
      '+proj=longlat +ellps=GRS80 +no_defs', {
        resolutions: [
          1.40625,
          0.703125,
          0.3515625,
          0.17578125,
          0.087890625,
          0.0439453125,
          0.02197265625,
          0.010986328125,
          0.0054931640625,
          0.00274658203125,
          0.001373291015625,
          6.866455078125e-4,
          3.4332275390625e-4,
          1.71661376953125e-4,
          8.58306884765625e-5,
          4.291534423828125e-5,
          2.1457672119140625e-5,
          1.0728836059570312e-5,
          5.364418029785156e-6,
          2.682209064925356e-6,
          1.3411045324626732e-6,
          6.705522662313365e-7,
        ],
        origin: [-180, 90],
      }
    )

3.在地图实例中赋值自定义的坐标系

var map = L.map('map', {
    center: [39.736861245030326, 116.13991336098002],
    zoom: 16,
    layers: [normal],
    crs: CRS_4490
})

4.修改leaflet.ChineseTmsProviderst.js文件,将天地图墨卡托投影改成经纬度(因为4490是地理坐标系),也就是将上文加载天地图模块的第三点,改成下面这段代码,w代表墨卡托,c代表经纬度

TianDiTu: {
		Normal: {
			Map:
				'https://t{s}.tianditu.gov.cn/vec_c/wmts?layer=vec&style=default&tilematrixset=c&Service=WMTS&Request=GetTile&Version=1.0.0&Format=tiles&tileMatrix={z}&TileCol={x}&TileRow={y}&tk={key}',
			Annotion:
				'https://t{s}.tianditu.gov.cn/cva_c/wmts?layer=cva&style=default&tilematrixset=c&Service=WMTS&Request=GetTile&Version=1.0.0&Format=tiles&tileMatrix={z}&TileCol={x}&TileRow={y}&tk={key}',
		},
		Satellite: {
			Map:
				'https://t{s}.tianditu.gov.cn/img_c/wmts?layer=img&style=default&tilematrixset=c&Service=WMTS&Request=GetTile&Version=1.0.0&Format=tiles&tileMatrix={z}&TileCol={x}&TileRow={y}&tk={key}',
			Annotion:
				'https://t{s}.tianditu.gov.cn/cia_c/wmts?layer=cia&style=default&tilematrixset=c&Service=WMTS&Request=GetTile&Version=1.0.0&Format=tiles&tileMatrix={z}&TileCol={x}&TileRow={y}&tk={key}',
		},
		Terrain: {
			Map:
				'https://t{s}.tianditu.gov.cn/ter_c/wmts?layer=ter&style=default&tilematrixset=c&Service=WMTS&Request=GetTile&Version=1.0.0&Format=tiles&tileMatrix={z}&TileCol={x}&TileRow={y}&tk={key}',
			Annotion:
				'https://t{s}.tianditu.gov.cn/cta_c/wmts?layer=cta&style=default&tilematrixset=c&Service=WMTS&Request=GetTile&Version=1.0.0&Format=tiles&tileMatrix={z}&TileCol={x}&TileRow={y}&tk={key}',
		},
  	Subdomains: ['0', '1', '2', '3', '4', '5', '6', '7'],
    key: "自己在天地图官网申请的key"
  },

五、拓展天地图到19级

1.修改leaflet-src.js源码

createTile方法中的tile.src = this.getTileUrl(coords)修改如下:

if(coords.z == 19) {
	let coords_18 = new Point(Math.floor(coords.x / 2), Math.floor(coords.y / 2), 19)
	let tileUrl = this.getTileUrl(coords_18)
	tileUrl = tileUrl.replace('tileMatrix=19', 'tileMatrix=18')
	// 加载18级图片回来,进行切割,四等份
	let img = new Image()
	img.src = tileUrl +'&v='+ Math.random()
	img.crossOrigin = 'anonymous'
	img.onload = function() {
	let c = document.createElement('canvas');
    let ctx = c.getContext('2d');
    c.width = 256;
    c.height = 256;
	ctx.drawImage(img, coords.x % 2 *128, coords.y % 2 * 128, 128, 128, 0, 0, 256, 256);
		tile.src = c.toDataURL() // 默认为 PNG 格式。图片的分辨率为96dpi。
	}
} else {
	tile.src = this.getTileUrl(coords);
}

原理:将18级瓦片进行2次方切割,用canvas重画,同理拓展到20级的时候进行2的2次方切割,21级时进行2的3次方切割,以此类推,这样处理可以打破天地图18级的限制,但由于是将18级的瓦片切割放大的,带来的弊端是级别越大,地图越模糊。

2.修改maxZoom,本文将天地图拓展到19级,因此设最大缩放级别为19。各位可根据项目需求进行相应修改。

const tileOptions = {
    minZoom: 1,
    maxZoom: 19
}

 

  • 10
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Leaflet是一个轻量级的开源JavaScript库,用于创建移动友好的交互式地图。而ArcGIS则是一个强大的地理信息系统(GIS)平台,提供各种类型的地图和数据。要将ArcGIS的瓦片地图加载Leaflet中,你可以按照以下步骤进行操作: 1. 安装依赖:在项目中安装LeafletArcGISJavaScript库。你可以使用npm或yarn等包管理器来安装所需的依赖项。 2. 创建地图容器:使用Leaflet创建一个地图容器,并设置其id或其他自定义属性以便于后续引用。 3. 加载瓦片图层:使用Leaflet的TileLayer类加载ArcGIS的瓦片图层。你需要提供ArcGIS服务器的主机名、瓦片图层的名称和瓦片图层的URL。 ```javascript var tileLayer = L.tileLayer('http://<ArcGIS服务器主机名>/arcgis/rest/services/<瓦片图层名称>/MapServer/tile/{z}/{y}/{x}', { attribution: '© <ArcGIS版权信息>' }); ``` 确保将`<ArcGIS服务器主机名>`替换为实际的ArcGIS服务器主机名,并将`<瓦片图层名称>`替换为实际的瓦片图层名称。 4. 将图层添加到地图:将加载的瓦片图层添加到地图容器中。 ```javascript map.addLayer(TileLayer); ``` 5. 配置地图选项:根据需要配置地图选项,如缩放级别、坐标系等。 6. 显示地图:将配置好的地图显示在页面上。 这样,你就可以在Leaflet加载和使用ArcGIS的瓦片地图了。请确保你已正确配置ArcGIS服务器和相关权限,以便能够访问所需的瓦片图层。此外,你可能还需要根据需要调整代码以适应特定的项目要求和样式。 请注意,此过程假设你已经了解了基本的LeafletJavaScript知识,并且已经正确安装和配置了所需的依赖项。如果你不熟悉这些技术,建议参考相关的文档和教程以获得更深入的了解。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值