使用Openlayer利用GeoServer编辑要素到postGIS注意问题(WFS-T)
Openlayer+GeoServer+PostGIS是最常用的开源GIS解决方案,对要素进行编辑是GIS中常用操作之一。本文对使用Openlayer利用GeoServer编辑要素到PostGIS的注意问题进行说明。
一、空间数据库PostGIS注意问题
1. PostGIS中进行编辑的数据表应具有编辑的权限,如Insert、Update、Delete,设置方法见下图。通过添加/修改用户/组,将权限赋予相应的用户。
2. 数据表中几何字段(geom/geometry)的类型(Point/MultiPoint、LineString/MultiLineString、Polygon/MultiPolygon)应与Openlayer中编辑要素的几何类型一致,如不能一个为Point,一个为MultiPoint。这应在创建表格或Shapefile文件入库时确定(详细信息可参见Shapefile导入PostGIS的两种方法介绍及比较),或在Openlayer中对要素的几何类型进行设置。
3. 进行WFS-T操作的数据表,必须有主键(primary key),否则会出现read-only的错误提示。
二、GIS服务器GeoServer注意问题
1. 因WFS-T操作涉及事物,故WFS服务的级别应为Transaction/Complete,如下图所示:
2. 若在ajax请求中没有设置连接GeoServer的用户名和密码(username/password),则应在Security→Data中进行设置,将ROLE_ANONYMOUS添加到选择的角色中,如下图所示。但是这种设置有弊端,一旦其他用户知道了GeoServer中WFS的地址,就能对数据进行随意修改。
3. 可在设置→全球中,设置以开发者模式(Developer)记录WFS执行的详细信息,通过日志可查看WFS执行的详细过程,遇到问题也能快速定位问题所在并解决,如下图所示。日志文件在 data_dir路径的logs文件夹下,记录个人资料可选择GEOTOOLS_DEVELOPER_LOGGING.properties或VERBOSE_LOGGING.properties,后者记录的信息更详细,其他区别还不清楚。
三、前端Openlayers注意问题
1. 若Web服务器和GIS服务器不在同一个域下,会存在跨域访问的问题,解决方法详见博客Openlayers WFS 跨域问题解决思路。
2. 代码中编辑要素的几何类型,尤其是新增要素的几何类型(体现在Draw空间的type设置上),必须与PostGIS中数据表几何类型一致,如同为Point/LineString/Polygon,不能一个为Point,另一个为MultiPoint。
3. 为了数据安全,在没有将ROLE_ANONYMOUS增加到Selected Roles时,必须在ajax请求中设置连接GeoServer服务器的用户名和密码(username/password)。
4. PostGIS中数据表的几何字段名称默认为geom,Openlayers中要素的几何字段名称为geometry,此时待入库的要素必须有geom字段,否则入库后几何字段为空,此时可进行如下设置。若在创建数据表时已将几何字段名称设置为 geometry,则不用设置。
feature.set('geom',feature.getGeometry());
同时,设置要素属性值的方法如下:
feature.setProperties(values, opt_silent),详细说明参见设置要素属性。values为key-value对象,key的取值必须与postgis中表字段名称一致。
5. 实测发现,PostGIS中主键(ID)是自动生成的,即使在代码中进行如下设置,也不起作用。
feature.set('id',/*主键值*/);
四、总结
进行WFS-T操作,经常出现 read-only 和 插入后几何字段为空 的问题,下面对出现这两种问题的原因进行总结。
1. read-only问题可能的原因为:1)用户没有对数据表进行编辑的权限, 2)PostGIS中数据表的几何类型与待编辑要素的几何类型不一致, 3)没有设置ROLE_ANONYMOUS或ajax请求时没有设置用户名和密码(username/password), 4)服务级别没有达到事物操作, 5)数据表中没有设置主键(id,primary key)。
2. 插入要素后几何字段为空的原因,则是因为数据表中几何字段名称(geom)与要素默认名称(geometry)不一致造成的,应在Openlayers中进行设置。
转载自:https://blog.csdn.net/shaxiaozilove/article/details/61619388