在JDBC数据库中存储覆盖率

警告

本教程中的屏幕截图尚未针对2.0.x用户界面进行更新。但大多数其余的信息都应该是有效的,用户界面大致相同,但使用起来要容易一些。

警告

imagemosaic jdbc模块是一个社区扩展,因此不受支持。

介绍

本教程描述了在JDBC数据库中存储覆盖率及其金字塔的过程。ImageMosaic JDBC插件由Christian Mueller编写,是Geotools库的一部分。

完整的文档可在 GeoTools Image Mosaic JDBC <library/coverage/jdbc/index.html> .

本教程将展示一个可能的场景,逐步解释如何在geoserver中使用此模块(从版本1.7.2开始)

入门

我们使用postgis/postgres作为数据库引擎,一个名为“gis”的数据库,从openstreetmap的图像开始。我们还需要这个工具 http://www.gdal.org/gdal_retile.html . 安装所有依赖项的最佳方法是从这里下载 http://fwtools.maptools.org/

../../_images/start.png

创建一个工作目录,让我们调用它 working ,用鼠标右键单击(图像另存为…)下载此图像并将其另存为 start_rgb.png

检查图像:

gdalinfo start_rgb.png

This image has 4 Bands (Red,Green,Blue,Alpha) and needs much memory. As a rule, it is better to use images with a color table. We can transform with rgb2pct (rgb2pct.py on Unix).:

rgb2pct -of png start_rgb.png start.png

比较两个文件的大小。

然后,创建一个世界文件 start.wldworking 包含以下内容的目录:

0.0075471698
0.0000000000
0.0000000000
-0.0051020408
8.9999995849
48.9999999796

准备金字塔和瓦片

如果你是新来的瓦片和金字塔,快来看看这里 http://northstar-www.dartmouth.edu/doc/idl/html_6.2/Image_Tiling.html

需要多少金字塔?

让我们做一个简单的例子。假设一个图像有1024x1024像素,一个图块大小为256x256像素,我们可以在大脑中计算出我们需要16个图块。每个金字塔将瓦片数量减少4倍。第一个金字塔有16/4=4个瓦片,第二个金字塔只有4/4=1个瓦片。

解决方案:第二个金字塔适合一个瓦片,我们完成了,我们需要2个金字塔。

公式如下:

number of pyramids = log(pixelsize of image) / log(2) - log (pixelsize of tile) / log(2) .

尝试一下:进入谷歌,输入搜索词“Log(1024)/Log(2)-Log(256)/Log(2)”,然后查看结果。

如果您的图像是16384像素,而瓦片大小是512像素,则为

对数(16384)/对数(2)-对数(512)/对数(2)=5

如果您的图像是18000像素,则结果=5.13570929。t靠近地板,使用5个金字塔。记住,最后一个金字塔将4个瓦片缩减为1个瓦片,所以这个金字塔并不重要。

如果您的图像是18000 x 12000像素,请使用较大的尺寸(18000)作为公式。

要创建棱锥体和瓦片,请使用 http://www.gdal.org/gdal_retile.html 从gdal项目。

Windows用户的可执行文件是 gdal_retile.bat 或仅 gdal_retile ,Unix用户调用 gdal_retile.py

创建子目录 tiles 在您的 working 目录,并在 working 目录::

gdal_retile -co "WORLDFILE=YES"  -r bilinear -ps 128 128 -of PNG -levels 2 -targetDir tiles start.png

发生什么事了?我们告诉gdal_retile为我们的瓦片创建世界文件(-co“WORLDFILE=YES),使用双线性插值(-r双线性),瓦片大小为128x128像素(-ps 128 128),图像格式应为PNG(-of PNG),我们需要2个金字塔级别(-levels 2),结果的目录为 tiles (-targetDir tiles)并且源映像是 start.png .

备注

关于瓦片大小的几句话。128x128像素适用于此示例。不要在生产环境中使用如此小的尺寸。256x256的尺寸将使瓦片数量减少4倍,512x512将减少16倍,依此类推。生成太多的图块会降低数据库端(大表)的性能,还会提高客户端的CPU使用率(更多图像操作)。

现在您应该有以下目录

  • working 包含 start.pngstart.wld 和一个子目录 tiles .

  • working/tiles containing many *.png files and associated *.wld files representing the tiles of start.png

  • working/tiles/1 包含许多 *.png 文件和关联 *.wld 表示第一个棱锥图块的文件

  • working/tiles/2 包含许多 *.png 文件和关联 *.wld 表示第二个棱锥体的瓦片的文件

配置新映射

映射的配置在XML文件中完成。这个文件有三个主要部分。

  1. JDBC驱动程序的连接信息

  2. SQL表的映射信息

  3. 地图的配置数据

由于JDBCConnect信息和SQL映射可以被多个映射重用,因此最佳做法是为这两个映射创建XML片段,并使用XML实体引用将它们包含到映射XML中。

首先,找到地理服务器数据目录的位置。启动geoserver时,此信息包含在日志文件中。::

----------------------------------
- GEOSERVER_DATA_DIR: /home/mcr/geoserver-1.7.x/1.7.x/data/release
----------------------------------

将所有配置文件放入 coverages GeoServer数据目录的子目录。本例中的位置是

/home/mcr/geoserver-1.7.x/1.7.x/data/release/coverages

  1. 创建文件 connect.postgis.xml.inc 包含以下内容

<connect>
  <!-- value DBCP or JNDI -->
  <dstype value="DBCP"/>
  <!--   <jndiReferenceName value=""/>  -->
  <username value="postgres" />
  <password value="postgres" />
  <jdbcUrl value="jdbc:postgresql://localhost:5432/gis" />
  <driverClassName value="org.postgresql.Driver"/>
  <maxActive value="10"/>
  <maxIdle value="0"/>
</connect>

jdbc用户是“postgres”,密码是“postgres”,maxactive和maxdle是apache连接池的参数,jdbcurl和driverclassname是postgres特有的。数据库的名称是“gis”。

如果将geoserver部署到能够处理JDBC数据源的J2EE容器中,则更好的方法是

<connect>
  <!-- value DBCP or JNDI -->
  <dstype value="JNDI"/>
  <jndiReferenceName value="jdbc/mydatasource"/>
</connect>

对于本教程,我们不使用J2EE容器提供的数据源。

  1. 下一个要创建的xml片段是 mapping.postgis.xml.inc

<!-- possible values: universal,postgis,db2,mysql,oracle -->
<spatialExtension name="postgis"/>
<mapping>
    <masterTable name="mosaic" >
      <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>

第一要素 <spatialExtension> 指定模块应使用的空间扩展名。““通用”意味着根本没有空间数据库扩展,这意味着瓦片网格不存储为几何图形,而是使用简单的双值。

这个xml片段描述了3个表,首先我们需要一个主表,其中保存了每个金字塔级别的信息。第二和第三,指定用于存储图像数据、信封和瓦片名称的属性映射。为了使本教程保持简单,我们将不再进一步讨论这些xml元素。在创建sql表之后,事情就会变得很清楚了。

  1. 创建配置xml osm.postgis.xml 地图(osm表示“开放街道地图”)

<?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="osm"/>
  <coordsys name="EPSG:4326"/>
  <!-- interpolation 1 = nearest neighbour, 2 = bilinear, 3 = bicubic -->
  <scaleop  interpolation="1"/>
  <verify cardinality="false"/>
  &mapping;
  &connect;
</config>

这是最后一个xml配置文件,包括我们的映射和连接xml片段。覆盖范围名称是“osm”,CRS是爱普生:4326。 <verify cardinality="false"> 意思是不检查块的数量是否等于数据库中存储的矩形的数量。(如果是大型瓦片套件,可能会很耗时)。

这种配置是很困难的,现在,生活变得更容易了。

使用Java DDL生成工具

完整的文档在 GeoTools User Manual: Using the java ddl generation utility .

为了创建适当的SQL表,我们可以使用Java DDL生成实用程序。此实用程序包含在 gt-imagemosaic-jdbc-{version}.jar . 确保这个jar文件在 WEB-INF/lib 地理服务器安装目录。

更改为您的 working 目录并执行第一个测试:

java -jar <your_geoserver_install_dir>/webapps/geoserver/WEB-INF/lib/gt-imagemosaic-jdbc-{version}.jar

答复应为:

Missing cmd import | ddl

创建子目录 sqlscripts 在你 working 目录。在 working 目录,执行:

java -jar <your_geoserver_install_dir>/webapps/geoserver/WEB-INF/lib/gt-imagemosaic-jdbc-{version}.jar ddl -config <your geoserver data dir >/coverages/osm.postgis.xml -spatialTNPrefix tileosm -pyramids 2 -statementDelim ";" -srs 4326 -targetDir sqlscripts

参数说明

parameter

description

敌我识别

创建DDL语句

-配置

我们的文件名 osm.postgis.xml 文件

-金字塔

我们想要的金字塔数量

-StatementDelim公司

要使用的SQL语句分隔符

-安全气囊

使用空间扩展时的数据库空间引用标识符

-目标目录

脚本的输出目录

-空间前缀

要创建的表名的前缀。

在目录中 working/sqlscripts 执行后您将找到以下文件:

createmeta.sql dropmeta.sql add_osm.sql remove_osm.sql

备注

重要:

查看文件 createmeta.sqladd_osm.sql 并将其与 mapping.postgis.xml.inc . 如果你理解这种关系,你就理解了映射。

生成的脚本只是模板,您可以根据更好的性能或其他原因修改它们。但不要破坏与XML映射片段的关系。

执行DDL脚本

对于用户“postgres”,databae“gis”,按以下顺序执行:

psql -U postgres -d gis  -f createmeta.sql
psql -U postgres -d gis  -f add_osm.sql

要清理数据库,可以执行 remove_osm.sqldropmeta.sql 完成教程后。

导入图像数据

完整的文档在 GeoTools User Manual: Using the java ddl generation utility .

首先,jdbc jar文件必须在 lib/ext java运行时的目录。在我的情况下,我必须复制 postgresql-8.1-407.jdbc3.jar .

改为 working 目录和执行:

java -jar <your_geoserver_install_dir>/webapps/geoserver/WEB-INF/lib/gt-imagemosaic-jdbc-{version}.jar import  -config <your geoserver data dir>/coverages/osm.postgis.xml -spatialTNPrefix tileosm -tileTNPrefix tileosm -dir tiles -ext png

此语句将瓦片(包括所有金字塔)导入数据库。

配置地理服务器

启动GeoServer和日志在下面 Config ‣ WCS ‣ CoveragePlugins 你应该看看

../../_images/snapshot1.png

如果没有以“imagemosaicjdbc”开头的行,则 gt-imagemosiac-jdbc-{version}.jar 文件不在您的 WEB-INF/lib 文件夹。去 Config‣Data‣CoverageStores‣New 并填写公式

../../_images/snapshot2.png

出版社 New 并填写公式

../../_images/snapshot3.png

出版社 Submit .

出版社 Apply 然后 Save 以保存更改。

下一个选择 Config‣Data‣Coverages‣New 选择“osm”。

../../_images/snapshot4.png

出版社 New 你将进入覆盖编辑器。压力机 SubmitApplySave .

Welcome‣Demo‣Map Preview 你会发现一个新的层”顶部:osm". 选择它并查看结果

../../_images/snapshot5.png

如果你认为图像被拉伸了,你是对的。原因是原始图像被epsg:900913地理引用,但是postigs中不支持这个crs(在本文撰写时)。所以我用了epsg:4326。在本教程中,这是可以的。

结论

对于特定的数据库,还有许多其他的配置可能性。本教程将展示一本快速食谱,以演示本模块的一些功能。请按照完整文档的链接进行深入挖掘,特别是当您关心性能和数据库设计时。

如果有什么遗漏,欢迎提出建议。