如何创建EPSG Geodetic Parameter Dataset for Postgresql 8
如何创建EPSG Geodetic Parameter Dataset for Postgresql 8
环境:
Glassfish, GEOSERVER2.1, POSTGRESQL 8.4, POSTGIS1.4
首先有几个问题
1.
GeoServer 2.0.0 和 GeoServer 2.0.1 在Glassfish上的SRS LIST不全
2.
GeoServer 2.0.0 和 GeoServer 2.0.1 在TOMCAT上的SRS LIST是完整的
3.
GeoServer 2.0.1的MIX模式CHALANGE模式搞反了。
可能原因分析:
gt-epsg-hsql-2.6.0.jar以及gt-epsg-hsql-2.6.1.jar在Glassfish工作不正常
据说gt-epsg-hsql-2.6.2.jar有修正这个问题
在这里
http://docs.codehaus.org/display/GEOTDOC/07+Referencing对几种EPSG插件的用途有说明
* EPSG HSQL Plugin: will unpack an hsql database containing the
official epsg database into a temp directory, a great solution for
desktop applications.
* EPSG WKT Plugin: uses an internal
property file and is lightweight rather than official and correct. A
great solution for applets
* EPSG Postgres Plugin: uses the
official epsg database which you have to load into PostgreSQL yourself. A
great solution for Java EE applications.
* EPSG Access Plugin:
directly use an the official epsg database as distributed. A great
solution for windows users.
* EPSG Oracle Plugin: currently
unsupported
现在的目标是在POSTGRESQL上建立EPSG Geodetic Parameter
Dataset
要做如下几步工作:
1. 下载最新的数据集
EPSG官方支持MS Access, mySQL, Oracle, PostgreSQL几种数据库, 当然hsql是某些人支持的。
http://www.epsg.org/databases/epsg-v7_4sql-PostgreSQL.zip
2.
解压后有五个文件
epsg-v7_4_readme.doc
epsg-v7_4_readme.pdf
EPSG_v7_4.mdb_Tables_PostgreSQL.sql
EPSG_v7_4.mdb_FKeys_PostgreSQL.sql
EPSG_v7_4.mdb_Data_PostgreSQL.sql
3. 问题来了,
执行EPSG_v7_4.mdb_Tables_PostgreSQL.sql与EPSG_v7_4.mdb_FKeys_PostgreSQL.sql
都无问题
执行EPSG_v7_4.mdb_Data_PostgreSQL.sql (399325行)会有很多问题。
几个原因:
数据库编码
数据库约束关系
猜测一个文本文件的编码不是一件有趣的事情,我试了几个常用编码后就放弃了,开始请GOOLE大婶帮忙,最终在一个好像是德文的网站上查到有人建立
EPSG的数据库,用的编码是LATIN9, 好了
重新建立建立一个编码是LATIN9的数据库(注意采用模板template0,因为template0编码一致)
(这里可考虑不执行EPSG_v7_4.mdb_FKeys_PostgreSQL.sql直接执行
EPSG_v7_4.mdb_Data_PostgreSQL.sql, 但是仍然会报一堆错误 )
分解EPSG_v7_4.mdb_Data_PostgreSQL.sql,注意查看表间约束关系,对手工操作 查看来说 还是有些麻烦的。
只能说EPSG的这个脚本太不严谨了。
有接近四十万行的数据,最终依靠耐心,把脚本分解为十几个,依次执行了,只有一个例外epsg_coordinatereferencesystem,因
为比较特殊是自我引用的约束,
对这个表的数据
就多执行几次,忽略他的约束报错,大概执行了四五遍吧,数据全部进去了,继续执行,
直到最后
UPDATE
epsg_alias
SET object_table_name = replace(object_table_name,
CHAR(182), CHAR(10));
UPDATE epsg_alias
SET alias = replace(alias,
CHAR(182), CHAR(10));
……………..
这里也是无法执行
对postgresql来讲char()是一个函数,而char(182)也是会执行失败,比如运行select
char(182)会报错(可能是POSTGRESQL版本升级后的函数调用有些差异)
ERROR: syntax
error at end of input
LINE 2: select char(123)
^
加上SCHEMA 再执行 select pg_catalog.char(182)
ERROR:
“char” out of range
测试最小范围 select pg_catalog.char(127)
超过127会报out of range的错误,
看来INT4 转为 CHAR的范围就是最大到127
那到底182代表一个什么字符CHAR呢,查到是”¶”,看起来很眼熟吧,字符串处理如果做过 换行符TAB替换的估计看了有些眼熟,
我也忘了,就直接修改最后的SQL语句吧 注意你的编辑器编码仍然选择LATIN 9 (ISO-8859-15)
最后的SQL改成
UPDATE epsg_alias
SET object_table_name =
replace(object_table_name, ‘¶’, pg_catalog.char(10));
UPDATE
epsg_alias
SET alias = replace(alias, ‘¶’, pg_catalog.char(10));
….. …..
执行..完成。
总结:
到最终完成epsg-v7_4sql-PostgreSQL.zip发现了一个接一个的错误,原因可能是最高版本的POSTGRESQL不支持,
但
究其原因,这个版本是不太严谨的,无论编码还是数据库脚本顺序,不过依据他的数据量,如果靠手工整理好的顺序,还是花了一下午时间。
如果
先处理最后的脚本修改char(182)为’¶’,
修改char(10)为pg_catalog.char(10)然后,先不建立约束关系,建立表后直接导入数据,然后再建立约束关系,还是可能节约一些时
间的(不过还得整理约束关系导入的顺序,也是个麻烦事)
不过 最终还是很高兴的,建立一个POSTGRESQL 8.4的EPSG
Geodetic Parameter Dataset,想来可能是世界上第一个哦,YY一下,
然后要继续玩我的
GLASSFISH3下的GEOSERVER2了
这个… 最终要谢谢的是GOOGLE大婶!
转载自:https://blog.csdn.net/kdyi/article/details/5263047