@alexhuang
2015-04-19T13:13:25.000000Z
字数 1678
阅读 2315
GIS
主要记录下关于GeoServer 服务自动发布的工作。
GeoServer的服务层次,分为:
WorkSpace(工作空间)
Store(数据存储) 加载数据实体例如shp,tif
Layer(图层) 从数据存储中发布某个图层,选择样式(SLD),地理范围等信息
在GeoServer文件夹中工作空间文件夹下,当保存数据存储后,会自动生成数据存储在工作空间中对应的配置文件,coveragestore.xml包含了数据的绝对路径。
关于一个影像服务的创建,首先是根据数据存储下的影像数据计算范围shapefile。这一步很关键,也就是说,经过测试,单独修改配置文件xml中的NativeBoundingBox 不会更新图层信息。就算删除配置文件xml,图层仍然存在。
自动更新图层的思路目前有几种:
- 不需要删除创建服务时生成的xml文件和GeoServer中的图层,但删除shp和prj等数据目录下的文件,重新保存Store,重新生成shp和prj。并且按照图层中重新读取的NativeBound和shp文件改写xml文件。
测试结果: 糟糕,在不重新启动整个服务的情况下,wms服务出现错乱。- 删除GeoServer中的对应图层(如何程序实现先不管),重新保存Store后,直接重新发布图层。这是最好的解决方案。待测试:
测试结果:重新发布图层无法用程序控制,点击图层保存没有结果。原因不明,没有报错信息,无法调试(原因不明,但是在图层编辑页面切换标签页之后可以保存,标签页的地址是随机生成,暂时无法模拟)。
由于无法用程序控制图层的保存,所以需要寻找这个原因或者 找替代方案,目前证明了xml配置文件在不重新启动整个服务的情况下无法更新图层信息。
当解决了程序模拟更新影像服务的问题之后(解决于4月6日下午15:30),需要解决分级切片部分更新的问题。如何在分布式环境下,在每台子节点的GeoServer上同名影像服务中,以新的影像切片覆盖同一位置的原有切片??这是很重要的问题!!
由于整个环境是分布式,假如ABC三台子节点,第一次影像发布时,djw影像发布成功,ABC三台节点分别存放djw不同区域的切片数据。例如A节点存放了左上角区域的切片,B节点存放了右上角区域切片。
由于切片模块中任务分配是随机的,先请求先获取,先执行。所以对于一个影像,第二次切片,每个节点分配到的部分完全可能和第一次不一致。由此造成的问题是,对于一个节点来说,更新影像时生成的切片本来应该覆盖原有的同一位置的切片,但切片是分布式的,无法覆盖其他节点上的切片数据。例如A节点分配到的新影像块对应的历史影像数据位于C节点上。
由于分布式带来的数据更新问题比较难以解决。所以每次对新时间点的数据进行切片后,新发布一个影像服务来存储新的切片。
发布不同时间点的影像数据是为了给客户端提供显示和查询的功能,使客户端可以方便地查看感兴趣区域(AOI)不同时间点的遥感影像。在客户端查询切片影像的时候涉及两个部分:
1.客户端向分布式节点中的GeoServer发送GetCapability请求获取图层列表,例如通过匹配cite:2015*来找出该节点GeoServer中2015年发布的影像图层,这个列表作为查询的数据源,如果用户输入的时间范围没有包含任何以上的图层,将返回空值。(已完成)
2.用户选择查询的时间范围,例如201504131000-201504141000作为时间参数。再加上用户选定的AOI,这样提交查询,后台函数会向所有节点上的GeoServer发送GetMap请求,后台获得每个节点返回的结果(图片),显示在客户端,并提供下载。(后台函数未完善)。