GeoServer+Postgis发布存储在Postgis中的栅格数据

news/2024/10/11 0:11:03/

这两天在研究GeoServer发布Postgis中存储的栅格数据,网上寻找的方法没有很哪个很顺利的成功了的(很多坑都踩了一遍),今天终于成功了,把发布过程记录一下,并分享给有需要的人。

前期准备

版本推荐:geoserver2.19.6,postgres15以上,postgis3.0以上,Image Mosaic JDBC插件

工具:水经微图,gdal_retile.bat

重点难点:Image Mosaic JDBC插件下载

GeoServer较高的版本扩展列表中没有Image Mosaic JDBC插件。

以下为Geoserver2.21.0插件下载界面:

 以下为GeoServer2.18.3插件下载界面:

 怎么办呢,我们可以从maven 仓库直接下载jar包,但是又有个新问题了

可以看到最新的版本为25.6,如何查看GeoServer所需的Image Mosaic JDBC插件版本,因为Image Mosaic JDBC插件属于GeoTools的插件,只需要从$GEOSERVER_HOME/webapps/geoserver/WEB-INF/lib目录下找到gt-xxx开头的插件查看其后缀,如下:

这就是为什么GoeSever版本推荐2.19.6的原因,将下载的插件放到该目录重启GeoServer即可在GeoServer的管理页面添加新的数据存储界面看到该插件对应的项,如下:

数据准备:

数据我选择从水经微图下载影像并导出大图(*.tif格式),如下:

然后将其拷贝到纯英文路径的工作目录下(我的为F:\postgis-geoserver),并将文件重命名为英文名称,如beijing.tif,如下:

至此准备工作基本完毕。

数据切片

利用gdal_retile工具对数据进行切片命令如下:

$your_path$\gdal_retile.bat -co "WORLDFILE=YES"  -r bilinear -ps 256 256 -of PNG -levels 5 -targetDir tiles beijing.tif

两点注意:

1.需要在工作文件夹(F:\postgis-geoserver)下新建tiles文件夹。

2.-levels 后跟的参数如何计算? 公式为num_levels = log2(max(w, h) / 瓦片宽度),瓦片宽度为-ps后两个数字,根据上面的命令则为256,w,h是tif文件的宽和高,可以在tif上右键属性详细信息查看,如图:

生成完成后可以在tiles目录下看到如下内容:

创建postgis数据库及扩展

如图:

我创建的数据库名字为test(后面需要用到),添加了postgis和postgis_raster扩展。

注意:需要先添加postgis扩展再添加postgis_raster扩展。扩展的添加方法使用查询工具或者在扩展item上右键->创建->扩展,然后在弹出窗口中选择。

创建配置文件

1.connect.postgis.xml.inc

<connect><dstype value="DBCP"/><username value="postgres"/><password value="root"/><jdbcUrl value="jdbc:postgresql://localhost:4321/test"/><driverClassName value="org.postgresql.Driver"/><maxActive value="10"/><maxIdle value="0"/>
</connect>

2.mapping.postgis.xml.inc(很重要可能导致后续生成的建表语句(*.sql文件)不正确,很多博主提供的不正确)

<spatialExtension name="postgis"/>
<mapping><masterTable name="dem" ><coverageNameAttribute name="name"/><maxXAttribute name="maxX"/><maxYAttribute name="maxY"/><minXAttribute name="minX"/><minYAttribute name="minY"/><resXAttribute name="resX"/><resYAttribute name="resY"/><tileTableNameAtribute  name="TileTable" /><spatialTableNameAtribute name="SpatialTable" /></masterTable><tileTable><blobAttributeName name="data" /><keyAttributeName name="location" /></tileTable><spatialTable><keyAttributeName name="location" /><geomAttributeName name="geom" /><tileMaxXAttribute name="maxX"/><tileMaxYAttribute name="maxY"/><tileMinXAttribute name="minX"/><tileMinYAttribute name="minY"/></spatialTable>
</mapping>

3. dem.postgis.xml

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE ImageMosaicJDBCConfig [<!ENTITY mapping PUBLIC "mapping"  "mapping.postgis.xml.inc"><!ENTITY connect PUBLIC "connect"  "connect.postgis.xml.inc">]>
<config version="1.0"><coverageName name="dem"/><coordsys name="EPSG:4326"/><!-- interpolation 1 = nearest neighbour, 2 = bilinear, 3 = bicubic --><scaleop  interpolation="1"/><verify cardinality="false"/>&mapping;&connect;
</config>

生产数据库创建文件以及创建数据库表

1.生成数据库创建文件

java -jar G:\geoserver-2.19.6-bin\webapps\geoserver\WEB-INF\lib\gt-imagemosaic-jdbc-25.6.jar ddl -config dem.postgis.xml -spatialTNPrefix tiledem -pyramids 5 -statementDelim ";" -srs 4326 -targetDir sqls

在工作目录执行 ,需要新建文件夹sqls。

生成结果如下:

 2.创建库表

psql -h localhost -p 4321 -U postgres -d test -f sqls/createmeta.sql
psql -h localhost -p 4321 -U postgres -d test -f sqls/add_dem.sql

 数据导入数据库

执行以下命令:

java -jar G:\geoserver-2.19.6-bin\webapps\geoserver\WEB-INF\lib\gt-imagemosaic-jdbc-25.6.jar import -config dem.postgis.xml -spatialTNPrefix tiledem -tileTNPrefix tiledem -dir tiles -ext png

如果提示缺少postgres驱动问题则执行以下命令:

java -Xbootclasspath/a:G:\geoserver-2.19.6-bin\webapps\geoserver\WEB-INF\lib\postgresql-42.3.3.jar -jar G:\geoserver-2.19.6-bin\webapps\geoserver\WEB-INF\lib\gt-imagemosaic-jdbc-25.6.jar import -config dem.postgis.xml -spatialTNPrefix tiledem -tileTNPrefix tiledem -dir tiles -ext png

 postgres*.jar的版本可以在$GEOSERVER_HOME/webapps/geoserver/WEB-INF/lib目录下查看,如下:

 导入成功后数据库数据如下:

数据发布

在GeoServer管理页面新建工作空间

然添加新的数据存储,选择ImageMosaicJDBC

选择工作空间,设置名称,填写URL路径。

 URL为安装GeoServer电脑下dem.postgis.xml文件的绝对路径。

 发布图层

在图层选项里选择添加新的资源,选择刚刚新建的工作空间和数据存储,结果如下:

点击发布,参数都不需要修改点击保存即可,如下:

图层预览,结果如下:

至此数据上传及发布成功。

我看有很多博客留言发布的时候报Could not list layers for this store, an error occurred retrieving them: Failed to create reader fromxxx错误,大概率两个原因第一就是Image Mosaic JDBC插件版本不对,第二就是mapping.postgis.xml.inc内容不对。按照本博客大概率不会出现问题。


http://www.ppmy.cn/news/1506807.html

相关文章

onlyoffice使用Https访问

开发服务器用的是http&#xff0c;一切正常使用&#xff0c;部署到服务器后&#xff0c;由于服务器使用了Https&#xff0c;导致访问onlyoffice时控制台报错。Mixed Content: The page at http://xxxxx// was loaded over HTTPS, but requested an insecure frame http://xxxxx…

Java | Leetcode Java题解之第330题按要求补齐数组

题目&#xff1a; 题解&#xff1a; class Solution {public int minPatches(int[] nums, int n) {int patches 0;long x 1;int length nums.length, index 0;while (x < n) {if (index < length && nums[index] < x) {x nums[index];index;} else {x *…

【json解析】控制台打印json字符串格式正确,但json.loads()解析失败问题解决

问题为控制台打印json字符串格式正确&#xff0c;但json.loads()解析失败。看似简单的问题&#xff0c;却又折腾了好一会&#xff0c;因此记录一下解决方法&#xff01; 出现这个问题的原因&#xff1a;眼见不一定为实&#xff0c;控制台打印的json字符串并不一定是实际的json字…

Jar工具完全指南:从入门到精通

Jar工具完全指南&#xff1a;从入门到精通的详尽教程 前言 欢迎来到Jar工具的完全指南&#xff01;无论你是Java编程的初学者&#xff0c;还是经验丰富的开发者&#xff0c;掌握Jar工具都是必不可少的。Jar&#xff08;Java Archive&#xff09;是Java生态系统中的一个核心组…

Cocos通过Electron打包web应用后,在触屏一体机设备触摸滑动无效问题解决

Cocos通过Electron打包web应用后&#xff0c;在触屏一体机设备触摸滑动无效问题解决 已经很晚了&#xff0c;刚刚解决这个问题&#xff0c;还是想记录一下&#xff0c;因为刚刚接触 cocos 没多久&#xff0c;这个问题困扰了我很久。 背景 接手了一个答题小游戏&#xff0c;由于…

技术周总结 08.05-08.11周日

文章目录 一、08.06 周二1.1) 问题01 mac安装 scala:1. 使用 Homebrew2. 使用 SDKMAN!其他注意事项1. 确认 Scala 安装位置2. 设置 PATH 环境变量对于 zsh (macOS Catalina 及更高版本默认使用 zsh):对于 bash (如果您使用的是 bash shell): 3. 验证安装 二、08.09 周五2.1&…

WPF参考做的TextBox圆角,并且水印文字操作

1.首先进行 转换器操作&#xff08;获取当前Textbox Text是否为空或者空格&#xff09; / // <summary>/// 非空验证转换器/// </summary>#region String IsNullOrEmptypublic class IsNullOrEmptyConverter : IValueConverter{public object Convert(object valu…

【Linux基础】Linux基本指令(二)

目录 &#x1f680;前言一&#xff0c;mv指令二&#xff0c;more & less指令2.1 more 指令2.1 less指令 三&#xff0c;重定向技术(重要)3.1 echo指令3.2 输出重定向 >3.3 追加重定向 >>3.4 输入重定向 < 四&#xff0c;head & tail指令4.1 head 指令4.2 t…