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


    这两天在研究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

    1. <connect>
    2. <dstype value="DBCP"/>
    3. <username value="postgres"/>
    4. <password value="root"/>
    5. <jdbcUrl value="jdbc:postgresql://localhost:4321/test"/>
    6. <driverClassName value="org.postgresql.Driver"/>
    7. <maxActive value="10"/>
    8. <maxIdle value="0"/>
    9. connect>

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

    1. <spatialExtension name="postgis"/>
    2. <mapping>
    3. <masterTable name="dem" >
    4. <coverageNameAttribute name="name"/>
    5. <maxXAttribute name="maxX"/>
    6. <maxYAttribute name="maxY"/>
    7. <minXAttribute name="minX"/>
    8. <minYAttribute name="minY"/>
    9. <resXAttribute name="resX"/>
    10. <resYAttribute name="resY"/>
    11. <tileTableNameAtribute name="TileTable" />
    12. <spatialTableNameAtribute name="SpatialTable" />
    13. masterTable>
    14. <tileTable>
    15. <blobAttributeName name="data" />
    16. <keyAttributeName name="location" />
    17. tileTable>
    18. <spatialTable>
    19. <keyAttributeName name="location" />
    20. <geomAttributeName name="geom" />
    21. <tileMaxXAttribute name="maxX"/>
    22. <tileMaxYAttribute name="maxY"/>
    23. <tileMinXAttribute name="minX"/>
    24. <tileMinYAttribute name="minY"/>
    25. spatialTable>
    26. mapping>

    3. dem.postgis.xml

    1. "1.0" encoding="UTF-8" standalone="no"?>
    2. ImageMosaicJDBCConfig [
    3. mapping PUBLIC "mapping" "mapping.postgis.xml.inc">
    4. connect PUBLIC "connect" "connect.postgis.xml.inc">]>
    5. <config version="1.0">
    6. <coverageName name="dem"/>
    7. <coordsys name="EPSG:4326"/>
    8. <scaleop interpolation="1"/>
    9. <verify cardinality="false"/>
    10. &mapping;
    11. &connect;
    12. 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内容不对。按照本博客大概率不会出现问题。

  • 相关阅读:
    Zookeeper 中的 CAP
    Elasticsearch安装和下载教程
    将 Figma 轻松转换为 Sketch 的免费方法
    手把手教你 centos 7 安装RabbitMQ
    Spring底层核心原理解析
    jQuery 语法
    R语言文本挖掘相关包介绍
    HDLbits exercises 2 (MODULES节选题)
    深入理解 Dockerfile 和 docker-compose[实战篇]
    数据预处理方法
  • 原文地址:https://blog.csdn.net/m0_59119702/article/details/141095079