ka-map调试笔记
|
长城小站是由志愿者支持的公益性网站,无固定经济来源。2012年小站台历是由各方网友赞助图片、设计、印刷精心制作的纪念品,用于小站运营经费筹款。 欢迎您购买小站台历,支持长城小站与小站博客的发展。 |
|
[目标]
Ka-map是一个Ajax概念的很好的MapServer前端工具,官方网址http://ka-Map.MapTools.org 。为了使TheGreatWallWebGis更加易用,希望引入Ka-map。
[案例]
国内可见的案例有:
·国家动态地图网 http://www.webmap.cn/basicmap/index.php
·百姓地图 http://www.100map.com/
·国家自然保护区http://www.emay.com.cn/nature/htdocs/
[实践]
过程简记如下:
刚开始接触时,Ka-map还是0.1。通过订阅邮件列表和cvs下载获取Ka-map最新版本。不久前Ka-map升级到0.2,目前cvs中是0.3的版本,下面的过程与ka-map版本无关。
服务器环境是Redhat EL4U2。
1、先在Redhat EL4U2上安装Mapserver成功。
2、安装php_mapscript,有rpm包可以直接安装。
(注意直接安装mapserv网站上的包后,名叫'php_mapscript.so',而include目录下config.dist.php中为'php_mapscript_46.so',所以把文件改名或者修改config.php或者做个链接都可以 )
3、修改include下config.dist.php并改名为config.php。
4、运行init.php测试,无任何正常输出。检查错误日志:报告
PHP Warning: dl(): Unable to load dynamic library '/usr/lib/php4/php_mapscript_46.so' - /usr/lib/php4/php_mapscript_46.so: undefined symbol: php_sprintf in /var/www/thegreatwall/html/public/TheGreatWallWebGis/test/init.php on line 54
PHP Fatal error: Call to undefined function: ms_newmapobj() in /var/www/thegreatwall/html/public/TheGreatWallWebGis/test/init.php on line 60
php_mapscript_46.so为什么加不上?google资料无果。
有过诸多怀疑,比如PHP版本不对,SELinux捣乱之类的可能性。后决定自己编译一下试试。
先检查来源,发现php_mapscript是mapserv的一个直系后代,就先基于MapServer网站上提供的src.rpm进行rebuild,报需要各类devel包一堆,配齐并理顺版本关系、安装,然后开始rebuild,到最后报大堆的错误,气恼。
下载tar.gz源码包,适当configure,小关键是指定--with-php=/usr/include/php4,这样php_mapscript也会被自动编译。然后就是make。到mapscript/php3下将新生成的php_mapscript.so复制到/usr/lib/php4目录下,还是不行。错误的内容变为
PHP Warning: dl(): Unable to load dynamic library '/usr/lib/php4/php_mapscript_46.so' - /usr/lib/php4/php_mapscript_46.so: undefined symbol: php_gd_gdImageCopy in /var/www/html/ka-map/tile.php on line 149
这和编译过程中的一个警告提示是相匹配的
php_mapscript.c: In function `php3_ms_img_pasteImage':
php_mapscript.c:6267: warning: implicit declaration of function `php_gd_gdImageColorExact'
php_mapscript.c:6271: warning: implicit declaration of function `php_gd_gdImageColorTransparent'
php_mapscript.c:6274: warning: implicit declaration of function `php_gd_gdImageCopy'
php_mapscript.c: In function `php3_ms_img_saveImage':
php_mapscript.c:5997: warning: 'tmp' might be used uninitialized in this
function
google一下,在ka-map邮件列表中有一个答复给了我提示
http://blog.gmane.org/gmane.comp.gis.mapserver.user/day=20050617
大意是php_gd_gdImageCopy是在php_gd2.so中定义的,请检查php_gd2.so是否已经载入,顺送代码。
if ( PHP_OS == "WINNT" || PHP_OS == "WIN32" )
$szGDModule = "php_gd2.dll";
else
$szGDModule = "php_gd2.so";
if (!extension_loaded("gd"))
dl($szGDModule);
php_gd2.so是什么?google搜索未果,猜测应该是php的gd支持。到EL4的安装盘中查到有php-gd.rpm的包,任务是在/usr/lib/php4/下安装一个gd.so,这个目录是php的动态库目录,所以猜测gd.so任务和php-gd2.so相同,遂安装php-gd.rpm,然后修改诸文件,凡加载php_mapscript_46.so的语句前,一律先挂gd.so,测试init.php,通过!
革命向成功迈进一步!
分别修改了init.php legend.php legend-templete.php scale.php
然后调ka-map主程序查看,不料浏览器上显示需有40多个图在等待下载,而测试机硬盘则嘎嘎声大作起来,没弄明白怎么回事一会儿ssh终端都登陆不上了,最后心疼硬盘就重起机器(弄了台奔腾300当测试机,除了机器和网卡,什么外设都没有,只能远程控制),咋搞得?
起来后,检查错误日志,有
PHP Warning: [MapServer Error]: msDrawMap(): Failed to draw layer named 'river'.n in /var/www/html/ka-map/tile.php on line 224, referer: http://192.168.28.19/ka-map/
PHP Warning: [MapServer Error]: msSHPOpenFile(): (/var/www/html/ka-map/../china/hyd2_4l)n in /var/www/html/ka-map/tile.php on line 224, referer: http://192.168.28.19/ka-map/
PHP Warning: [MapServer Error]: msSHPOpenFile(): (/var/www/html/ka-map/../china/data/hyd2_4l)n in /var/www/html/ka-map/tile.php on line 224, referer: http://192.168.28.19/ka-map/
PHP Fatal error: Call to a member function on a non-object in /var/www/html/ka-map/tile.php on line 225, referer: http://192.168.28.19/ka-map/
检查map文件和数据,原来拿来测试的map文件中的需要数据有部分没有拽过来,没想到这个错误动静如此大,再重试了一下,发现听到硬盘狂转20秒内重起httpd服务就还有救过来的希望。
所以,map文件应该先用mapserver试一下,成功了,再去ka-map试验。
把需要的数据文件拷贝到指定的位置,到浏览器边一刷新,ok,ka-map成功运行了:)
[总结]
1、在Linux上安装ka-map需要先安装mapserver和php_mapscript.so,php_mapscript.so可以通过安装rpm包(网站上提供mapserver-php-4.6.0beta3-mh1.i686.rpm)或者自己编译mapserver.tar.gz获得(比较复杂)。
2、修改config.php,注意修改php_mapscript_46为php_mapscript。
3、测试init.php,如果没有正常显示测试文本的话。检查错误日志。如果是php不能加载php_mapscript.so的话,那么也许你需要php_gd.so。找到你的linux对应的php_gd.so,安装。
4、如果是3的问题的话,需要修改init.php legend.php legend-templete.php scale.php等文件,在加载php_mapscript.so前加载php_gd.so。我的php的gd库名叫gd.so,所以代码为
if ( PHP_OS == "WINNT" || PHP_OS == "WIN32" )
$szGDModule = "php_gd2.dll";
else
$szGDModule = "gd.so";
if (!extension_loaded("gd"))
dl($szGDModule);
5、测试init.php legend-templete.php 的输出都ok了,就可以测ka-map了,之前保证你的测试案例在mapserver上已经测试通过。