如何创建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

You may also like...

退出移动版