GeoServer发布多级地图并结合Arcgis进行前端调用

1.登录

用户名:admin 默认密码:geoserver,以此账户登录geoServer

2.新建工作空间

命名规范为英文,URI仅作为标识没有其他意义。

3.新建存储仓库

GeoServer仓库支持shp、geotiff、postgis数据库表等常见格式,此处仅说明geotiff格式的。

先自行在地图下载器上下载地图(地图背景为透明,拼接tif格式)

特别注意:下载的文件不止包含tif文件,还有其他如tfw,prj文件,这些文件很重要包含地址信息,要放在tif同级下,否则geoserver导入数据时可能出现无法解析情况(其他格式也要特别注意这个问题)

连接参数要指定tif文件(存在tfw,prj的需要和tif同级,只有tif文件可能geoServer无法解析)

4.图层发布

此处主要演示3级图层发布

当你在建立好存储仓库后,会自行跳转到图层发布页。没有跳转需要点击图层--添加新的资源--选择图层即可找到图层发布页。

点击发布(再次发布为已经发布过的图层,可以二次发布),填写图层名

填写边框和经纬(可以自行生产,参照下图)

回到上边点击Tile Caching选项。

下滑到GridSet配置处,如下图所示

Published zoom levels在后续切片图层时,会默认选择该处设置,它决定了最终预览时,该图层可以分多少级进行预览(如设置了3-10,在预览时你可以最小缩放到3级,最大缩放到10级)。

Cached zoom levels在进行切片图层预览时,会自动将你预览过得图片分级进行切片并放入指定文件夹下(一般在data_dir--gwc文件夹下,当然版本不同可能略有差异),建议只设置到指定级别下(如图所示,此图层为3级并将作为最终预览入口,所以设置为3/3),否则可能产生数据的冲突,导致图片混乱,这点很重要!

之后点击发布即可,这样3级图层就正式发布为wms服务了。

注:其他级别按照上述级别设置发布即可。

5.图层切片

如图点击操作Seed/Truncate,你会看到下图所示页面

Number of tasks to use为你将设置多少线程来进行图片切割,切割的图片较大时可以设置,提高并行能力。

GridSet为你发布时设置,当设置多个时,这里可以选择多个。

Format选择png即可。

Zoom start/Zoom stop在发布图层时已经设置,它表示图片按照多少级-多少级进行切割。由于我们是多级的,所以此处要一级一级去处理,在发布图层时我们已经设置了Published zoom levels为3/3,这里默认就会显示3/3,我们只需要处理当前级即可。

上述没有问题后,点击submit进行提交,会发现进度,可反复刷新进度,最终不在显示进度而显示为none时,表示已经完成。

最终在data_dir--gwc下生成对应文件,里边存放了切割好的图片。(若发现没有生成,可能为版本问题,将切割的图片存放在了内存中,建议更换磁盘存放路径或更换版本)

其他级别参照上述步骤提交即可,注意切片级别。(4级就设置为4/4...)

6.切片迁移

最终在gwc生成上述文件,并每一级下都存在切割的图片。

现在我们需要把4-16级里切割好的图片,存到3级下,最终如下图所示。

接下来,回到图层,编辑3级的图层,将Published zoom levels由原来的3/3改为3/16,请注意Cached zoom levels保持不变仍然为3/3,否则可能和切割好的图片数据产生冲突。

保存后,回到切片图层查看,找到3级,对应预览SelectOne处选择为EPSG:4326 / png(jpeg和png具体选择哪个要看当时切割时指定的Format格式为准)

7.前端展示

以Arcgis前端组件进行展示,代码如下,仅供参考,本人亲测没有问题,使用时请自行修改参数。

xml 复制代码
<html>
	<head>
		<meta charset="utf-8" />
		<meta name="viewport" content="initial-scale=1,maximum-scale=1,user-scalable=no" />
		<title>WMTSLayer | Sample | ArcGIS API for JavaScript 4.22</title>
		<link rel="stylesheet" href="https://js.arcgis.com/4.22/esri/themes/light/main.css" />
		<style>
			html,
			body,
			#viewDiv {
				padding: 0;
				margin: 0;
				height: 100%;
				width: 100%;
			}

			.esri-layer-list {
				width: 310px;
			}
		</style>
		<script src="https://js.arcgis.com/4.22/"></script>
		<script>
			require([
				"esri/Map",
				"esri/views/MapView",
				"esri/layers/WMTSLayer",
				"esri/widgets/LayerList",
				"esri/layers/WebTileLayer",
				"esri/geometry/SpatialReference"
			], (Map, MapView, WMTSLayer, LayerList, WebTileLayer, SpatialReference) => {
				
				let layer = new WebTileLayer({
					id: 'qx:qx_Level_3',
					urlTemplate: 'http://localhost:8080/geoserver/gwc/service/wmts?layer=qx:qx_Level_3&style=&tilematrixset=EPSG:4326&Service=WMTS&Request=GetTile&Version=1.0.0&Format=image/png&TileMatrix=EPSG:4326:{level}&TileRow={row}&TileCol={col}',
					spatialReference: new SpatialReference({
						wkid: 4326
					}),
					tileInfo: {
						'rows': 256,
						'cols': 256,
						'compressionQuality': 0,
						'origin': {
							'x': -180,
							'y': 90
						},
						'spatialReference': {
							'wkid': 4326
						},
						'lods': [{
								'level': 0,
								'resolution': 0.703125,
								'scale': 279541132.0143589
							},
							{
								'level': 1,
								'resolution': 0.3515625,
								'scale': 139770566.00717944
							},
							{
								'level': 2,
								'resolution': 0.17578125,
								'scale': 69885283.00358972
							},
							{
								'level': 3,
								'resolution': 0.087890625,
								'scale': 34942641.50179486
							},
							{
								'level': 4,
								'resolution': 0.0439453125,
								'scale': 17471320.75089743
							},
							{
								'level': 5,
								'resolution': 0.02197265625,
								'scale': 8735660.375448715
							},
							{
								'level': 6,
								'resolution': 0.010986328125,
								'scale': 4367830.1877243575
							},
							{
								'level': 7,
								'resolution': 0.0054931640625,
								'scale': 2183915.0938621787
							},
							{
								'level': 8,
								'resolution': 0.00274658203125,
								'scale': 1091957.5469310894
							},
							{
								'level': 9,
								'resolution': 0.001373291015625,
								'scale': 545978.7734655447
							},
							{
								'level': 10,
								'resolution': 0.0006866455078125,
								'scale': 272989.38673277234
							},
							{
								'level': 11,
								'resolution': 0.00034332275390625,
								'scale': 136494.69336638617
							},
							{
								'level': 12,
								'resolution': 0.000171661376953125,
								'scale': 68247.34668319309
							},
							{
								'level': 13,
								'resolution': 8.58306884765625e-005,
								'scale': 34123.67334159654
							},
							{
								'level': 14,
								'resolution': 4.291534423828125e-005,
								'scale': 17061.83667079827
							},
							{
								'level': 15,
								'resolution': 2.1457672119140625e-005,
								'scale': 8530.918335399136
							},
							{
								'level': 16,
								'resolution': 1.0728836059570313e-005,
								'scale': 4265.459167699568
							}
						]
					}
				})
				const map = new Map({
					layers: [layer]
				});
				const view = new MapView({
					container: "viewDiv",
					map: map,
					center: [107, 34], //
					zoom: 3,
					spatialReference: new SpatialReference(4326)
				});
			});
		</script>
	</head>
	<body>
		<div id="viewDiv"></div>
	</body>
</html>

结束!

相关推荐
我是陈泽10 小时前
一行 Python 代码能实现什么丧心病狂的功能?圣诞树源代码
开发语言·python·程序员·编程·python教程·python学习·python教学
肖哥弹架构1 天前
Spring 全家桶使用教程
java·后端·程序员
IT杨秀才4 天前
自己动手写了一个协程池
后端·程序员·go
程序员麻辣烫6 天前
像AI一样思考
程序员
一颗苹果OMG8 天前
关于进游戏公司实习的第一周
前端·程序员
万少8 天前
你会了吗 HarmonyOS Next 项目级别的注释规范
前端·程序员·harmonyos
楽码9 天前
彻底理解时间?在编程中使用原子钟
后端·算法·程序员
江南一点雨9 天前
又一家培训机构即将倒闭!打工人讨薪无果,想报名的小伙伴擦亮眼睛~
java·程序员
用户86178277365189 天前
ELK 搭建 & 日志集成
java·后端·程序员
河北小田9 天前
局部变量成员变量、引用类型、this、static
java·后端·程序员