leaflet 加载arcgis server发布的影像切片

leaflet 加载arcgis server发布的影像切片

因为项目的关系,需要使用leaflet加载arcgis server 发布的影像切片,再网上查了资料,结合自己的情况,完成了底图的显示,记录一下。

首先,加载leaflet.js 和leaflet.css

<link href="../leafletmap/css/leaflet.1.3.1.css" type="text/css" rel="stylesheet"/>   
<script src="../leafletmap/1.3.1/leaflet.js"></script>

定义地图容器

<div id="divclass"></div>

除了leaflet 外,我加载的地图坐标系不是leaflet里面默认的,所以还需要引用proj4.jsproj4leaflet.js

引用proj4.jsproj4leaflet.js

<script type="text/javascript"  src="https://cdn.bootcss.com/proj4js/2.5.0/proj4.js"></script>
<script src="../leafletmap/plugins/Proj4Leaflet-master/proj4leaflet.js"></script> 

使用Proj4来进行投影时的定义参数

用到proj4.js与proj4leaflet.js这两个库来进行自定义投影,具体的投影转换已经各种参数的定义,我们可以通过(https://epsg.io/)这个网站来获取。

获取EPSG

  1. 打开 ArcGIS 的 MapServer,例如 http://[arcgisserver]/ArcGIS/rest/services/[你的地图名称]/MapServer ,找到 Spatial Reference,并记下 resolutions和origin

  2. 打开 https://epsg.io/ ,输入2345
    在这里插入图片描述

  3. 找到Proj4js,复制出来
    在这里插入图片描述

proj4.defs("EPSG:2345","+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs");

加载切片地图

  1. 定义地图 resolutions、origin

arcgis server 上的信息

let mapJson={
			resolutions: [
			  			26.458386250105836,
			  			13.229193125052918,
			  			6.614596562526459,
			  			2.6458386250105836,
			  			1.3229193125052918,
			  			0.5291677250021167,
			  			0.26458386250105836,
			  			0.13229193125052918
			          ],
			origin: [-5123200.0, 10002100],
			bounds: L.bounds([144858.7746592164, 296333.3947167889 ], [150914.30552027814, 307821.3614427224])
	}
  1. 定义arcgis server 的地址
let tileMapUrl ="http://localhost:6080/arcgis/rest/services/TJ901/MapServer/_alllayers";

我的地图格式:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 算出地图的中心的(如果中心不在地图上,地图就显示不出来)
    在arcgis server上找到Full Extent:在这里插入图片描述

代码中使用

//输出中心坐标
	let r = proj4("EPSG:2345", "EPSG:4326",[(144858.7746592164 + 150914.30552027814)/2,(296333.3947167889 + 307821.3614427224)/2] );
	console.log(r);// 控制台输出 
	// 设置地图中心 为了保证地图的能显示,所以算出中心点
	var centerPoint = new L.LatLng(r[1], r[0]); 
  1. 地图文件的目录解析,创建leaflet.mapcache.js


/** 
 * 继承自TileLayer 
 * @param {Object} tomcat中映射该切片目录url 
 * @param {Object} options 
 */  

L.TileLayer.TileLoad = L.TileLayer.extend({  
    initialize: function (url, options) {  
        options = L.setOptions(this, options);  
        this.url = url + "/{z}/{x}/{y}.png";  
//        console.log(url);
        L.TileLayer.prototype.initialize.call(this, this.url, options);  
    },
    getTileUrl: function (coords) {
    	console.log(coords);
    	let tilePoint = coords;
    	//默认的方法
//    	let url = L.TileLayer.prototype.getTileUrl.call(this, coords);
//    	console.log(url);
    	
    	let url2 = L.Util.template(this._url, L.extend({  
	        s: this._getSubdomain(tilePoint),  
	        z: function() {  
	            var value = (tilePoint.z).toString(16);  
	            return "L" + pad(value, 2);  
	        },  
	        x: function() {  
	            var value = (tilePoint.y).toString(16);  
	            return "R" + pad(value, 8);  
	        },  
	        y: function() {  
	        	
	            var value = (tilePoint.x).toString(16);  
	            return "C" + pad(value, 8);  
	        }  
	    }));  
//    	console.log(url2);
    	return url2;
    }
});  




/** 
 * 高位补全方法 
 * @param {Object} 数字类型字符串 
 * @param {Object} 总位数,不足则高位补0 
 */  
var pad = function(numStr, n) {  
    var len = numStr.length;  
    while(len < n) {  
        numStr = "0" + numStr;  
        len++;    
    }  
    return numStr;  
};  

  1. 加载地图
	//加载切片图层
	 let CRS_2345 = new L.Proj.CRS("EPSG:2345", "+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs", {
		 	resolutions:mapJson.resolutions,
	    	origin:mapJson.origin,
	        //这里可以有origin、transformation、scales、resulutions、bounds几个参数提供
	        //选择,其中scales与resolutions不能同时配置
	    });
	
	let map = L.map('divclass',{
	    crs:CRS_2345,
	    center: centerPoint,  
	    zoom: 0,   
	    attributionControl: true,
	});
	 	
	var tileLayer = new L.TileLayer.TileLoad(tileMapUrl);
  	map.addLayer(tileLayer); 

完整的HTML代码

<!DOCTYPE html>  
<html lang="en">  
<head>  
    <meta charset="UTF-8"> 
    <title>测试</title> 
    <link href="../leafletmap/css/leaflet.1.3.1.css" type="text/css" rel="stylesheet"/>   
    <link href="../leafletmap/plugins/Leaflet.MousePosition-master/L.Control.MousePosition.css" type="text/css" rel="stylesheet"/>   

    <script src="../leafletmap/1.3.1/leaflet.js"></script>  
    
    <script src="../leafletmap/plugins/Leaflet.MousePosition-master/L.Control.MousePosition.js"></script>  
 	<script src="../leafletmap/plugins/Proj4Leaflet-master/proj4.js"></script>  
    <script src="../leafletmap/plugins/Proj4Leaflet-master/proj4leaflet.js"></script> 
    <script src="../leafletmap/plugins/leaflet.mapcache.js"></script> 

    <style>
        html,body{
            margin:0;
            padding: 0;
        }
        #divclass{
            height:calc(100% - 50px) ;
            width: 100%;
            background: white;
            position: absolute;
        }
    </style>
</head>
<body>  
 	<div style="width: 100%;height: 50px"></div>
	<div id="divclass"></div>
 
</div>  
<script>

//	proj4.defs("EPSG:3395","+proj=merc +lon_0=0 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs");
//	proj4.defs("EPSG:4490","+proj=longlat +ellps=GRS80 +no_defs");
//	proj4.defs("EPSG:4548","+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs");
//	proj4.defs("EPSG:4549","+proj=tmerc +lat_0=0 +lon_0=120 +k=1 +x_0=500000 +y_0=0 +ellps=GRS80 +units=m +no_defs");
	proj4.defs("EPSG:2345","+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs");

	//输出中心坐标
	let r = proj4("EPSG:2345", "EPSG:4326",[(144858.7746592164 + 150914.30552027814)/2,(296333.3947167889 + 307821.3614427224)/2] );
	console.log(r);// 控制台输出 
	// 设置地图中心 为了保证地图的能显示,所以算出中心点
	var centerPoint = new L.LatLng(r[1], r[0]); 
	
//	var pointCoord=ol.proj.transform([100.33,32.280000018770551],"EPSG:4326","EPSG:3395");
//	console.log(pointCoord);// 控制台输出[11168684.511289138,
	                                 
	
	let mapJson={
			resolutions: [
			  			26.458386250105836,
			  			13.229193125052918,
			  			6.614596562526459,
			  			2.6458386250105836,
			  			1.3229193125052918,
			  			0.5291677250021167,
			  			0.26458386250105836,
			  			0.13229193125052918
			          ],
			origin: [-5123200.0, 10002100],
			bounds: L.bounds([144858.7746592164, 296333.3947167889 ], [150914.30552027814, 307821.3614427224])
	}
	
	let tileMapUrl ="http://localhost:6080/arcgis/rest/services/TJ901/MapServer/_alllayers";


	//加载切片图层
	 let CRS_2345 = new L.Proj.CRS("EPSG:2345", "+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs", {
		 	resolutions:mapJson.resolutions,
	    	origin:mapJson.origin,
	        //这里可以有origin、transformation、scales、resulutions、bounds几个参数提供
	        //选择,其中scales与resolutions不能同时配置
	    });
	
	let map = L.map('divclass',{
	    crs:CRS_2345,
	    center: centerPoint,  
	    zoom: 0,   
	    attributionControl: true,
	});
	 	
	var tileLayer = new L.TileLayer.TileLoad(tileMapUrl);
  	map.addLayer(tileLayer); 
  	/* 
  	* 不好用
	let tileMapLayer = L.esri.tiledMapLayer({
	    url:tileMapUrl
	});

	map.addLayer(tileMapLayer);
	*/
	L.control.mousePosition({
	    'position': 'bottomright'
	}).addTo(map);
	    

    
</script>  
</body>  
</html>

到此,地图应该可以正常显示了,但是呢,我在使用的使用,地图并没有出来,原因是跨域的问题
在这里插入图片描述

关于跨域的解决办法在:https://liubf.com/2018/05/26/arcgis10-2-%E8%B7%A8%E5%9F%9F%E9%85%8D%E7%BD%AE/

我使用这个办法并没有解决,我是将影像文件和xml文件复制到服务器上,使用tomcat发布,直接访问服务器的地址。
在这里插入图片描述

到此,我的地图就可以显示了。

链接:https://pan.baidu.com/s/1Lw2geGaCiPrJcASKBm6-cA
提取码:j9df
文中js的下载路径

感谢以下三位:
https://www.cnblogs.com/slobber/p/leaflet_for_xian_80.html
https://www.cnblogs.com/lishanyang/p/13188059.html
https://blog.csdn.net/u014269043/article/details/39023323?utm_source=blogxgwz9

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Leaflet是一个轻量级的开源JavaScript库,用于创建移动友好的交互式地。而ArcGIS则是一个强大的地理信息系统(GIS)平台,提供各种类型的地和数据。要将ArcGIS的瓦片地加载Leaflet中,你可以按照以下步骤进行操作: 1. 安装依赖:在项目中安装LeafletArcGIS的JavaScript库。你可以使用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服务器和相关权限,以便能够访问所需的瓦片层。此外,你可能还需要根据需要调整代码以适应特定的项目要求和样式。 请注意,此过程假设你已经了解了基本的Leaflet和JavaScript知识,并且已经正确安装和配置了所需的依赖项。如果你不熟悉这些技术,建议参考相关的文档和教程以获得更深入的了解。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值