之前总喜欢一个大的东西弄完写点总结,现在发现好多小问题到那时候都忘记了,于是改变一下习惯好了。以下是正文。
最近在做地图,用的这两个开源的东西,怨念很多啊,文档各种不全,各种少,加上对js又不是很熟,进展实在是慢,老是被一些小问题卡,特别是geoserver,bug还挺多,比如一次点开很多个修改layer的属性窗口,重复这样的操作:修改,提交,马上下一个……这样的话很多修改一般来说都是失效的,必须一个一个来,然后修改style后,对应的layer不一定会跟着变,更有甚者,有时候将某个layer关联到自己的style后,操作几次又变回去了,给layer换style后,有这个layer的layergroup又得重新添加、删除一下这个layer,样式才能生效。每次改style,自带的编辑器在chrome,ff下全是不对的,用vim改好后,还得重新修改、保存一下style,不然也不会生效。layer名字要是一样,即使它们是在不同的workgroup里面,想对某个layergroup添加其中的某个layer时,添加的总是特定的某一个,我估计它只通过layer的name而不是id来找layer了,去geoserver的issue tracker上看,还有09年的bug都没fix呢,唉,就这样凑和着用吧,真是便宜没好货啊。
在服务端我的数据是shp的,并没有用到数据库,某一个文件夹下面就是这年朝代在某个时间点的各种行政图划分,比如说州府级驻点,县级驻点等,开始用的时候还不太会,每个shp都添加一个store、layer,总共弄下来,几十个,点都点死我了,后来全都添加好后发现只要用Directory of spatial files就好了,一次添加一个文件夹,真囧,这个估计应该是我看文档不仔细。写style的时候主要看SLD COOKBOOK里的那几个例子,大概也够了,然后细节的地方可以再参考一下schema,先看名字再google,因为有的属性在cookbook里也没介绍,慢慢摸索吧。颜色什么的我都是参照google maps来做的。具体的sld会上传附件。在做layergroup的时候发现geoserver有点不好,我和另外一个做地图的同学交流了一下,他服务端客户端全是自己做的,他说一般服务端都会有一个功能,对每个layer可以设置一个最小最大的分辨率,而geoserver里一定要在sld里改,又由于之前说的各种bug,弄的很不方便,最好直接在设置里就有。说起来挺简单,当时做的时候倒是烦死了,主要是bug的影响,有时候真想砸电脑- -。
Openlayers主要是对着那个class api和examples来做,wms当然最简单了,wfs有些要注意的地方。因为wms里面表示layer的话就用ns:layername这样就好了,于是我在wfs里之前也是这么做的,然后发现虽然post出去了,也得到了数据,但怎么就是features完全为空呢。还以为是在解析数据的时候出了什么问题,在openlayers里跟踪调了很久也没得到答案,再后来完全按照examples里加了namespace,結果我居然把一个字母打掉了,openplan被我打成openlan!!于是以为这一条路也不对,就完全做不下去了!!真是可耻啊!怎么会犯这种错误的,卡了我几天啊。后来终于发现,把namespace写对就可以了。wfs还要注意一点就是有ajax跨域的问题,要有一个代理,它自带了一个proxy.cgi,估计用apache跑一下就行,当然要装py,虽然我没有试过,但应该部署起来没啥问题。
WFS是异步调用,于是取得了数据后应该用callback的方式来调用接下来的函数,找了半天api文档才发现调用的語法- -囧。然后由于我数据都是中文,测试时是拿的geoserver自带的那些来做的,心里想着估计编码等出问题,果然如此。编码弄起来总是很纠结的,具体过程就不说了,我还尝试过js里全写unicode,不过后来发现js这边其实没问题,因为我本身所有的编码都是utf8,后来查了资料,说XHR的send也是发送utf8的格式的数据,但是在chromium里查看它的resources,发现显示的都是乱码,这是我总在检查客户端的原因,后来在服务 端的log里发现接收到的数据是正常的,想着可能是chromium里的编码设置有点问题吧。在geoserver-users的maillist里问了下,地址:http://sourceforge.net/mailarchive/forum.php?thread_name=AANLkTin%2B%3DWymsSNvmv07Q1W%3D7XWgPhO0gr04GQ7R%3D2w2%40mail.gmail.com&forum_name=geoserver-users。发现是wfs 1.1用的output是outputFormat = text/xml; subtype=gml/3.1.1。这里可能处理编码有点问题,换成1.0的话,也就是GML2在返回的内容上就可以了,虽然在某个属性里还有乱码,不过好像不影响。
返回的内容不是乱码了,但是还是得不到features。我很无奈啊,这里又卡了我半天,在openlayers里调试,终于发现是xml格式不对,用ff打开就显示not well-formed的错误,但是用测试样例的话就好好的,莫非又是中文的问题?自己在测试半天,发现以前看xml語法时还真看漏了,元素名要以下划线或字母开头,唉,又是这种错误,我也很无奈啊,注意一下发现讲語法的很少有讲到这点。这里讲的比较全一点:http://webfans.hrbeu.edu.cn/WLBC/xml/200609/60.html。还得手动去改那些layer的名字,累。
最后放点sld上来,其实都大同小异的。顺便sld里设置字体为文泉驿啊什么的都不起作用,也不知道为什么。写的乱七八糟的,都是给自己看。。
style.tar