基于 Leaflet做离线地图及基本功能(监听,测距,线,圆)

Leaflet官网:

Leaflet - a JavaScript library for interactive mapshttps://leafletjs.com/此文档当作记录使用,无详细解释,瓦片自己的可去搜索下载.

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>地图</title>
    <link href="js/leafletmap/leaflet.css" rel="stylesheet"/>

    <style>
        .maptop {
            width: 1200px;
            height: 700px;
        }
        #map {
            width: 100%;
            height: 100%;
        }
		.measure-close{
			top: 3px;
			position: absolute;
			right: 10px;
		}
    </style>
</head>

<body>
<!-- 地图 -->
<div class="maptop">
    <div id="map">
    </div>
	
	<div id="mapButton">
	        <br><br><br><br>
	        <button type="button"  id="juliMeasure" onclick="juliMeasure()">测距</button>
			<span style="margin-left: 50px;">经度&nbsp;:&nbsp;</span>
			<input autocomplete="off" id="longitude">
			<span>纬度&nbsp;:&nbsp;</span>
			<input autocomplete="off" id="latitude">
	    </div>
</div>
</body>

<script type="text/javascript" src="js/jquery/1.11.3/jquery.min.js"></script>
<script src="js/leafletmap/leaflet.js"></script>    <!-- 基础地图js -->
<script src="js/leafletmap/leaflet.polylineDecorator.js"></script>    <!-- 线样式js 官网插件可下载 -->
<script src="js/leafletmap/l.ellipse.js"></script>    <!-- 椭圆js,官网插件可下载 -->
<script src="js/leafletmap/turf.min.js"></script>    <!-- 测距的js  官网插件可下载-->

<script>
   var polylineMap=null;
   var rangingSF=false;
	var paths = [
            [38, 0],
            [38, 180],
            [0, 0]
          ]
	
	// 离线地图(瓦片,也可使用瓦片数据库)
	var mapUrl = 'mapImgs/{z}/{y}/{x}.png';
	
	var map = L.map("map", {
	     center: [20.59, 20.29],
	     zoom: 1,
	 });
	 
	 map.doubleClickZoom.disable();  //禁止双击放大地图
	 
	 L.tileLayer(mapUrl, {   // 地图图层
	     maxZoom: 4,
	     minZoom: 1
	 }).addTo(map); 
	
	//地图划线
	polylineMap=new L.polyline(paths,{
		color:'red',
		weight:1,
	}).addTo(map);
	
	
	//监听鼠标移动事件
	map.on('mousemove', onMove);
	var mypop = L.popup();
	
	function onMove(e){
		//if(!rangingSF){
			//这个是显示在鼠标上的经纬度,跟随鼠标移动
			/* var content="经纬度:"+e.latlng.lat+"    "+e.latlng.lng;
			mypop.setLatLng(e.latlng)
			       .setContent(content)
			       .openOn(map); */
			//显示在input框
			$("#longitude").val(e.latlng.lng);
			$("#latitude").val(e.latlng.lat);
		//}else{
			//这个是测距的时候鼠标移动线跟着移动的功能--放开测距点可根据鼠标移动而移动
			/* if (tempPoints.length) {
			  tempPoints[1] = e.latlng;
			  tempLayer.setLatLngs(tempPoints);
			} */
		//}
	}
	
	//绘制椭圆
	/* 
	 latlng - 椭圆中心的位置。
	 半径 - 以米为单位的半长轴和半短轴
	 倾斜 - 椭圆从西旋转的度数
	 options - 传递给 L.Path 的选项字典,具体官方查看使用
	 */
	var ellipse = L.ellipse([51.5, -0.09], [5000000, 1000000], 60,{color:'red',weight:1}).addTo(map);
	
	     /* 测距功能 */
	      var layer = L.polyline([], {
	      }).addTo(map);
	
		  // 绘制mousemove line
	      const tempLayer = L.polyline([], {
	      }).addTo(map);
		  //点集合
	      let tempPoints = [];
	
		  
	
		  // popup 展示距离
	      const popup = L.popup({
	        autoClose: false,
	        closeButton: false
	      });
	
		  // 自定义 展示框
	      const setTipText = content => {
	        const el = document.createElement("div");
	        el.className = "measure-marker";
	
	        const text = document.createElement("span");
	        text.className = "measure-text";
	        text.innerHTML = content;
	
	        const close = document.createElement("span");
	        close.className = "leaflet-popup-close-button measure-close";
			close.innerHTML="X";
	        close.addEventListener("click", () => {
	          remove();
	        });
	
	        el.appendChild(text);
	        el.appendChild(close);
	
	        return el;
	      };
		  //点击显示的
	      const clickHandler = e => {
	        layer.addLatLng(e.latlng);
	        tempPoints[0] = e.latlng;
	        
	        const len = turf.length(layer.toGeoJSON(), { units: "kilometers" });
	        popup
	          .setLatLng(e.latlng)
	          .setContent(setTipText(len.toFixed(2) + " 公里"))
	          .openOn(map);
	      };
		  
		  // 结束绘制
		  const remove = () => {
		    layer.remove();
			//在重新创建layer
			layer = L.polyline([], {}).addTo(map);
		    popup.remove();
			//点集合清空
			tempPoints.length = 0;
		  };

		/* 开始测距 */
		function juliMeasure(){
			if(!rangingSF){
				rangingSF=true;
				map.on("click", clickHandler);
				$("#juliMeasure").css("background","bisque");
				map.doubleClickZoom.disable();
			}else{
				rangingSF=false;
				remove();
				map.off("click", clickHandler);
				$("#juliMeasure").css("background","bottom");
				map.doubleClickZoom.disable();
			}
		}
			
	
</script>
        
</html>

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: leaflet是一种流行的JavaScript库,用于创建交互式地图地图应用程序。它具有轻量级、灵活和易于使用的特点,可以使用离线地图加载进行浏览。 要加载离线地图,首先需要准备地图图块。可以使用开源软件如MapBox Studio或TileMill来制作地图。将地图图块保存在磁盘或服务器上,并使用leaflet中的TileLayer来将其加载到地图上。 例如,在leaflet中添加离线地图的代码如下: ```javascript var offlineMap = L.tileLayer('path/to/tiles/{z}/{x}/{y}.png', { maxZoom: 18, attribution: 'Map data © OpenStreetMap contributors' }); var map = L.map('map').setView([51.505, -0.09], 13); map.addLayer(offlineMap); ``` 这里,tileLayer将离线地图图块的路径传递给tileLayer对象,然后将其添加到地图上。此处设置了最大缩放级别和属性信息。最后,使用L.map创建一个地图对象,并将TileLayer添加到地图上。 使用leaflet加载离线地图涉及了对地图数据的准备和处理,但一旦地图被加载到页面上,它将非常流畅和快速,使离线地图的浏览变得容易。 ### 回答2: Leaflet 是一款轻量级的开源 JavaScript 地图库,它可以用于创建交互式、可定制化的地图,支持多种数据格式和多种地图样式。其中一个重要的功能就是加载离线地图。 加载离线地图需要以下几个步骤: 1. 下载地图切片数据:离线地图需要下载相应的地图切片数据,可以从专门的地图数据提供商处获取,也可以使用自己的切片数据。地图切片数据通常以图块的形式存储,每个图块包含地图上的一小部分。 2. 将切片数据转换为合适的格式:Leaflet 支持的地图数据格式包括 PNG、JPEG、GIF、SVG 和 WebP 等,因此需要将切片数据转换为其中一种格式。 3. 将切片数据加载到 Leaflet:在 Leaflet 中,可以使用 TileLayer 类加载离线地图数据。可以通过指定切片数据存储的路径、分辨率、缩放级别等属性来设置 TileLayer。 4. 在 Leaflet 中显示地图:在 TileLayer 加载离线地图数据之后,需要将其添加到 Leaflet 地图对象中以进行显示。可以使用 map.addLayer() 方法将 TileLayer 添加到地图中。 需要注意的是,离线地图数据通常占用大量的存储空间,因此在下载和处理数据时需要谨慎。此外,离线地图数据也需要及时更新以保证地图的准确性和实时性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值