在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/

创建一个工作目录,让我们调用它 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.wld
在 working
包含以下内容的目录:
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.png
,start.wld
和一个子目录tiles
.working/tiles
containing many*.png
files and associated*.wld
files representing the tiles ofstart.png
working/tiles/1
包含许多*.png
文件和关联*.wld
表示第一个棱锥图块的文件working/tiles/2
包含许多*.png
文件和关联*.wld
表示第二个棱锥体的瓦片的文件
配置新映射¶
映射的配置在XML文件中完成。这个文件有三个主要部分。
JDBC驱动程序的连接信息
SQL表的映射信息
地图的配置数据
由于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
创建文件
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容器提供的数据源。
下一个要创建的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表之后,事情就会变得很清楚了。
创建配置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语句 |
-配置 |
我们的文件名 |
-金字塔 |
我们想要的金字塔数量 |
-StatementDelim公司 |
要使用的SQL语句分隔符 |
-安全气囊 |
使用空间扩展时的数据库空间引用标识符 |
-目标目录 |
脚本的输出目录 |
-空间前缀 |
要创建的表名的前缀。 |
在目录中 working/sqlscripts
执行后您将找到以下文件:
createmeta.sql
dropmeta.sql
add_osm.sql
remove_osm.sql
备注
重要:
查看文件 createmeta.sql
和 add_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.sql
和 dropmeta.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和日志在下面
你应该看看
如果没有以“imagemosaicjdbc”开头的行,则 gt-imagemosiac-jdbc-{version}.jar
文件不在您的 WEB-INF/lib
文件夹。去 并填写公式

出版社 New 并填写公式

出版社 Submit .
出版社 Apply 然后 Save 以保存更改。
下一个选择
选择“osm”。
出版社 New 你将进入覆盖编辑器。压力机 Submit , Apply 和 Save .
下
你会发现一个新的层”顶部:osm". 选择它并查看结果
如果你认为图像被拉伸了,你是对的。原因是原始图像被epsg:900913地理引用,但是postigs中不支持这个crs(在本文撰写时)。所以我用了epsg:4326。在本教程中,这是可以的。
结论¶
对于特定的数据库,还有许多其他的配置可能性。本教程将展示一本快速食谱,以演示本模块的一些功能。请按照完整文档的链接进行深入挖掘,特别是当您关心性能和数据库设计时。
如果有什么遗漏,欢迎提出建议。