关于GeoServer发布服务时数据源设置的避坑指南

news2024/11/26 13:52:45

题外话

        时光任然,一年一度的五一劳动节已然来到。作为疫情之后迎来的第一个五一,不知道各位小伙伴们怎么度过这个劳动节呢?是决定去另一个城市,观察体验一下不一样的风景,或者去旅游,给自己放假。昨天被12306的一则关于上海虹桥站4月28日火车票全部售罄的帖子刷爆了。这充分说明了大家在五一出行的热情。

        此时此刻,肯定还有一些因为各种各样的原因要工作值班的小伙伴。在此,向各行各业的辛苦劳动的劳动者致敬。奋斗的人最美, 奋斗的你,就是五一最美的风景,努力耕耘的你,就是五月最灿烂的存在!致敬我们每一位辛勤的劳动者。

一、前言

        在前面的博客中使用LeafLet叠加Geoserver wms图层到已有底图的方法,简单的讲解了Geoserver进行Wms等服务的发布,对于GeoServer的服务发布没有具体介绍。之前项目组的同学在使用GeoServer进行服务发布时,遇到了一些问题。比如创建数据源时失败,还有带中文的WMS服务在预览时没有正确展示,而是提示下载的问题。本文将重点讲解如何使用GeoServer进行WMS服务的发布,以及在创建数据源时会遇到的问题,服务图层遇到中文图层提示下载的问题。如果您在生产过程中也遇到这些问题,希望可以帮你抛砖引玉。

二、GeoServer

1、GeoServer简介

        本文不是重点介绍GeoServer的文章,哦。关于GeoServer的介绍,有很多的文章。这里只做简单的介绍。下面是在GitHub上的官方介绍geoserver github,描述这个项目的主要功能。

         简单来讲就是,GeoServer项目是一个完整的Java(J2EE)系统,现实了OpenGIS联盟的网络功能服务器规范和网络覆盖服务器规范(完整的OGC标准实现),并且集成了Web地图服务器,所有标准的OGC服务,比如WMS,WMTS,WCS,WFS,矢量切片等都是可以直接支持的。

2、GeoServer主界面

        本文采用的GeoServer版本如下图所示,采用war包的形式进行部署,jdk1.8,tomcat采用8.5

         将Tomcat启动后即可访问到GeoServer应用,并进行服务的发布。

 三、GeoServer服务发布

1、登录GeoServer

        GeoServer是需要登录之后才能使用的。默认的账号是:admin/geoserver。

 2、新建工作区

        点击左边的工作区菜单,再右边的列表按钮,点击新增按钮,进行工作区的管理。工作区主要用于管理不同的数据,比如道路的数据、水系的数据、POI的数据,分类进行管理。

         通常来说,工作区的命名空间URI只需要填一个不重名的就可以。最好采用官网的地址加上一个可以表示工作项目类型的字符串即可。一般在这里不容易出错,正常操作即可。

3、新建数据源异常

点击新建数据源按钮,进行数据源的新增管理。数据源包括矢量、栅格和其他数据。如下图所示。

         这里我们以矢量数据源为例,点击Shapefile - ESRI(tm) Shapefiles (*.shp),进入下面页面:

         这里请注意数据源的名称,名称当中包含了一个冒号,请特别注意。这里就是引起问题的数据。点击保存后,系统会报下面这个错。

         同时在Geoserver的运行控制台也发现报错了,详情如下图所示:

         后台无法创建相应的目录,到这里,我们到后台看一下相应的目录。

         我们发现每个数据源都会有一个相应的目录进行数据绑定。打开hnxjxqarea目录下的datastore.xml文件,可以发现如下的定义。

<dataStore>
  <id>DataStoreInfoImpl--3834fa5a:187c815698e:-7ffc</id>
  <name>hnxjxqarea</name>
  <description>湖南湘江新区</description>
  <type>Shapefile</type>
  <enabled>true</enabled>
  <workspace>
    <id>WorkspaceInfoImpl--3834fa5a:187c815698e:-7fff</id>
  </workspace>
  <connectionParameters>
    <entry key="charset">ISO-8859-1</entry>
    <entry key="filetype">shapefile</entry>
    <entry key="create spatial index">true</entry>
    <entry key="memory mapped buffer">false</entry>
    <entry key="timezone">Asia/Shanghai</entry>
    <entry key="enable spatial index">true</entry>
    <entry key="namespace">http://www.yelangking.com/gisdev</entry>
    <entry key="cache and reuse memory maps">true</entry>
    <entry key="skipScan">true</entry>
    <entry key="url">file://F:\vector_data\湘江新区\湘江新区-融合.shp</entry>
    <entry key="fstype">shape</entry>
  </connectionParameters>
  <__default>false</__default>
  <dateCreated>2023-04-28 13:44:33.890 UTC</dateCreated>
</dataStore>

4、异常定位

        在控制台中,可以看到,org.geoserver.platform.resource.FileSystemResourceStore.java这个类的324行出了问题。我们到其源码中看一下324行到底执行了什么业务逻辑。

         由于源代码较多,不全部列出,将上图中涉及的代码复制出来,看一下。这里已经写得非常清楚,上级目录没有正确创建导致了异常的抛出。这里我们验证一下带冒号的文件格式能否创建目录。

public File file() {
		if (!file.exists()) {
			try {
				File parent = file.getParentFile();
				if (!parent.exists()) {
					boolean created = parent.mkdirs();
					if (!created) {
						throw new IllegalStateException("Unable to create " + parent.getAbsolutePath());
					}
				}
				if (parent.isDirectory()) {
					Lock lock = lock();
					boolean created;
					try {
						created = file.createNewFile();
					} finally {
						lock.release();
					}
					if (!created) {
						throw new FileNotFoundException("Unable to create " + file.getAbsolutePath());
					}
				} else {
					throw new FileNotFoundException(
							"Unable to create" + file.getName() + " - not a directory " + parent.getAbsolutePath());
				}
			} catch (IOException e) {
				throw new IllegalStateException("Cannot create " + path, e);
			}
		}
		if (file.isDirectory()) {
			throw new IllegalStateException("Directory (not a file) at " + path);
		} else {
			return file;
		}
	}

        在Windows中,随便新建一个文件夹,然后带上冒号,通常系统会报如下警告:

         由此,彻底找到了问题的根源,而且千万要记住,在GeoServer中,目录的名字一定不能特殊字符。在Java的世界中,很多是约定大于配置,预定俗成的规则很多。找到了问题的根源就好解决问题了,只需要将冒号去掉后,保存即可。

5、wms中文问题

        是不是到了这一步,地图的发布就一切顺利,万事大吉呢。那可不一定,在未正常进行数据展示之前,一切都是有待验证的。

         有的同学是不是遇到问题了。尤其是图层中名字是包含中文,并没有看到数据展示界面,而是有下载提示。这真的是黎明前的黑暗,令人崩溃。如果对Web开发有经验的同学大概已经猜到了问题的所在,就是图层中包含中文的原因。修改的方式也很简单,在tomcat中,设置一下容器的请求编码。在tomcat的安装目录下,在server.xml中找到以下代码:

<Connector port="8083" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />

        在文件的最后加上编码设置,如下所示:

<Connector port="8083" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" URIEncoding="UTF-8"/>

        记得保存后,重启tomcat服务。至此,数的据的服务发布全部完成,在路上遇到的数据源创建问题以及中文图层访问问题,均全部解决。来看一下实际预览效果。

 6、使用Leaflet加载Wms

<!DOCTYPE html>
<html>
<head>
	<title>geoserver全国地铁展示</title>
	<meta charset="utf-8" />
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<link rel="shortcut icon" type="image/x-icon" href="docs/images/favicon.ico" />
	<link rel="stylesheet" href="/2d/leaflet/leaflet.css" />
    <script src="/2d/leaflet/leaflet.js?v=1.0.0"></script>
</head>
<body>
<div id="mapid" style="width: 100%; height: 600px;"></div>
<script>
	var mymap = L.map('mapid').setView([29.052934, 104.0625], 5);

	//加载wms服务的图层
	var dtLineLayer = L.tileLayer.wms(
		'http://localhost:8083/geoserver/testwzh/wms', {
			layers: 'testwzh:2022年全国地铁线数据',
			format: 'image/png',
			transparent: true
		}
	);
    dtLineLayer.addTo(mymap);

</script>

</body>
</html>

 总结

        以上就是本文的主要内容,本文将重点讲解如何使用GeoServer进行WMS服务的发布,以及在创建数据源时会遇到的问题,服务图层遇到中文图层提示下载的问题。如果您在生产过程中也遇到这些问题,希望可以帮你抛砖引玉,行文仓促,不足之处还望海涵,同时也欢迎各位朋友在评论区留言批评指正。

        行文最后,再次祝愿所有的朋友们节日快乐,出门有风景,在家也舒心,致敬劳动者。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/475453.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

three.js进阶之动画系统

我曾在three.js进阶之骨骼绑定文章中提到了AnimationMixer、AnimationAction等内容&#xff0c;其实这些应该属于Three.js的动画系统&#xff0c;本文就系统的介绍一下动画系统&#xff08;Animation System&#xff09;。 前言 一般情况下&#xff0c;我们很少会使用three.j…

【学习视频】阅读开源工业软件和工业智能实战上线B站

图片来源&#xff1a;https://metrology.news/a-i-for-smarter-factories-the-world-of-industrial-artificial-intelligence/ 为了帮助大家做好工业软件以及用人工智能解决工业领域现实问题&#xff0c;我在B站上开了两个视频系列&#xff0c;一个是“一起来读开源工业软件”…

STM32 基础知识入门 (C语言基础巩固)

1、在不改变其他位的值的状况下&#xff0c;对某几个位进行设值 这个场景在单片机开发中经常使用&#xff0c;方法就是先对需要设置的位用&操作符进行清零操作&#xff0c; 然后用|操作符设值。 比如我要改变 GPIOA 的 CRL 寄存器 bit6&#xff08;第 6 位&#xff09;的…

MiNiGPT4安装记录

装conda wget https://repo.anaconda.com/archive/Anaconda3-5.3.0-Linux-x86_64.sh chmod x Anaconda3-5.3.0-Linux-x86_64.sh ./Anaconda3-5.3.0-Linux-x86_64.sh export PATH~/anaconda3/bin:$PATH # 或者写到环境保护变量 # 不会弄看这吧 https://blog.csdn.net/wyf2017/a…

fork()创建进程原理

目录 一、写时复制技术写时复制的优点&#xff1a;vfork()和fork() 二、fork()原理初步再理解下页表与多进程在内存中的图像创建进程和创建线程的区别 三、fork()的具体过程 一、写时复制技术 fork()生成子进程时&#xff0c;只是把虚拟地址拷贝给子进程&#xff0c;也就是父进…

( 字符串) 205. 同构字符串 ——【Leetcode每日一题】

❓205. 同构字符串 难度&#xff1a;简单 给定两个字符串 s 和 t &#xff0c;判断它们是否是同构的。 如果 s 中的字符可以按某种映射关系替换得到 t &#xff0c;那么这两个字符串是同构的。 每个出现的字符都应当映射到另一个字符&#xff0c;同时不改变字符的顺序。不同…

网络基础:socket套接字

文章目录 1. 前导知识1.1 源MAC地址和目的MAC地址1.2 源IP地址和目的IP地址1.3 MAC地址和IP地址的配合1.4 源端口号和目的端口号1.5 Socket1.6 UCP协议和TCP协议1.7 网络字节序高低位高低地址大端和小端网络字节序常用转换函数 2. socket 网络编程2.1 socket 常见接口创建套接字…

ChatGPT最好用的连接-自动写文案-代码算法最佳选择

ChatGPT最好用的连接-自动写文案-代码算法最佳选择 最近测试了很多国内分享的ChatGPT&#xff0c;很多都是限制最多写200文字&#xff0c;超过200个文字就不显示了。或者有的写出的文章逻辑性不对&#xff0c;写的算法不能正常运行。 经过多天的搜索测试&#xff0c;最终确定…

某电商客户数据价值分析项目

目录 一、项目意义 二、项目流程 三、项目内容 1、导入数据 2、数据预处理 3、单变量分析 4、聚类分析—Kmeans算法 一、项目意义 客户价值分析就是一个客户分群问题&#xff0c;以客户为中心&#xff0c;从客户需求出发&#xff0c;搞清楚客户需要什么&#xff0c;他们…

Linux进程通信:进程组 会话

1. 进程组 &#xff08;1&#xff09;概念&#xff1a;一个或多个进程的集合&#xff0c;也称为“作业”。 &#xff08;2&#xff09;父进程创建子进程时&#xff0c;默认属于同一个进程组。进程组ID为组长进程ID。 &#xff08;3&#xff09;进程组中只要有一个进程存在&a…

unity中的Line Renderer

介绍 unity中的Line Renderer 方法 首先&#xff0c;Line Renderer 是 Unity 引擎中的一个组件&#xff0c;它可以生成直线、曲线等形状&#xff0c;并且在场景中呈现。通常情况下&#xff0c;Line Renderer 被用来实现轨迹、路径、线框渲染以及射线可视化等功能。 在使用 …

imx6ull开发板环境配置 - libusb、libudev、eudev交叉编译

目录 零、前言 一、libusb交叉编译 1.0 前言 1.1 交叉编译 二、usbutils交叉编译 2.0 前言 2.1 交叉编译 三、libudev交叉编译 3.0 前言 3.1 交叉编译 3.2 错误处理-没找到usbutils 3.3 错误处理-没找到pci.ids &#xff08;pci.ids not found&#xff09; 3.3.0 前…

【数据库】索引与事务

目录 1、索引 1.1、概念 1.2、索引的作用 1.3、 索引的缺点 1.4、数据库中实现索引的数据结构 1.4.1、B树/B-树 1.4.2、B树 1.4.3、回表 1.5、使用场景 1.6、索引的使用 1.6.1、查看索引 1.6.2、创建索引 1.6.3、 删除索引 1.7、索引的分类 2、事务 2.1、为什…

Arduino ESP8266基于ESPAsyncWebServer 网页GPIO控制

Arduino ESP8266基于ESPAsyncWebServer 网页GPIO控制 📍相关篇《Arduino ESP8266利用AJAX局部动态更新网页内容》 📺控制页面演示: 🌿在手机上可以通过接入ESP8266的WIFI,通过浏览器方位192.168.4.1进行网页页面操控引脚以及查看esp8266信息。 ✨本项目是基于github上…

[oeasy]python0143_主控程序_main

主控程序 回忆上次内容 上次把 apple.py 拆分成了 输入主函数 引用模块中变量的时候 要带上包(module)名 get_fruits.aget_fruits.b 最终 拆分代码 成功&#xff01; 可以将程序 再拆分成 输入输出 然后 再由主函数调用吗&#xff1f;&#x1f914; 建立主控 新建一个 ma…

【Java笔试强训 10】

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点! 欢迎志同道合的朋友一起加油喔&#x1f93a;&#x1f93a;&#x1f93a; 目录 一、选择题 二、编程题 &#x1f525;井字棋 …

大数据技术之大数据概论

第1章 大数据概念 大数据(Big Data): 指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合&#xff0c;是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产 大数据主要解决&#xff0c;海量数据的采集、存…

【吴恩达推荐】《ChatGPT Prompt Engineering for Developers》- 知识点目录

《ChatGPT Prompt Engineering for Developers》 1 Introduction 2 Guidelines Principle 1: Write clear and specific instructions Tactic 1: Use delimiters Tactic 3: “If-statement” Check whether conditions are satisfiedCheck assumptions required to do the …

RDD的Stage划分原理

1. 什么是RDD RDD&#xff08;Resilient Distributed Dataset&#xff09;叫做分布式数据集&#xff0c;是Spark 中最基本的数据抽象&#xff0c;它代表一个不可变、可分区、里面的元素可并行计算的集合。在Spark 中&#xff0c;对数据的所有操作不外乎创建RDD、转化已有RDD 以…

JavaBeaneljstl

1.JavaBean 1.1 什么是JavaBean JavaBean 是一种JAVA语言写成的可重用组件。为写成JavaBean&#xff0c;类必须是具体的和公共的&#xff0c;并且具有无参数的构造器 简单一点&#xff1a;建一个类,给一个无参的构造方法. 它就是JavaBean&#xff0c;对应JavaBean来说&#x…