Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1813981
  • 博文数量: 473
  • 博客积分: 13997
  • 博客等级: 上将
  • 技术积分: 5953
  • 用 户 组: 普通用户
  • 注册时间: 2010-01-22 11:52
文章分类

全部博文(473)

文章存档

2014年(8)

2013年(38)

2012年(95)

2011年(181)

2010年(151)

分类: LINUX

2010-07-13 11:00:48

[目标]

  Ka-map是一个Ajax概念的很好的MapServer前端工具,官方网址。为了使更加易用, 希望引入Ka-map。

[案 例]

  国内可见的案例有:
  ·国家动态地图网
   ·百姓地图
  ·国家自然保护区

织梦好,好织梦



[实践]

  过程简记如下:

  刚开始接 触时,Ka-map还是0.1。通过订阅邮件列表和cvs下载获取Ka-map最新版本。不久前Ka-map升级到0.2,目前cvs中是0.3的版本, 下面的过程与ka-map版本无关。

  服务器环境是Redhat EL4U2。

1、先。

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
dedecms.com


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'
copyright dedecms

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.gi...er/day=20050617
大 意是php_gd_gdImageCopy是在php_gd2.so中定义的,请检查php_gd2.so是否已经载入,顺送代码。

织梦内容管理系统

PHP代码:
 if ( PHP_OS == "WINNT" || PHP_OS == "WIN32" )
   
$szGDModule "php_gd2.dll"
;

内容来自dedecms


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,通过!
copyright dedecms

革命向成功迈进一步!

分 别修改了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:
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:

copyright dedecms


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:
PHP Fatal error: Call to a member function on a non-object in /var/www/html/ka-map/tile.php on line 225, referer:

检查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获得(比较复杂)。
dedecms.com


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,所以代码为
PHP代码:
 if ( PHP_OS == "WINNT" || PHP_OS == "WIN32" )

copyright dedecms


   
$szGDModule "php_gd2.dll"
;
else
    
$szGDModule "gd.so"
;
if (!
extension_loaded("gd"
))
    
dl($szGDModule
); 

5、测试init.php legend-templete.php 的输出都ok了,就可以测ka-map了,之前保证你的测试案例在mapserver上已经测试通过。

阅读(1379) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~