分享

开放GIS标准OGC之路-WFS初探2

 Jcstone 2012-03-16

LockFeature
从现在开始我们将进入"幽暗的山谷",这里风景秀丽但是危机四伏。这不是危言耸听,一直以来我们仅仅是从服务器获得数据,但是接下来的操作将修改服务器的状态。设想,你维护着一个提供GIS服务的系统,你需要定期更新数据。那你就需要一个方法,不单是能获得这些数据还要能修改这些数据。设想和你一样的维护人员有许多,你们同时维护着这个数据源。如果你们只是同时查询,下载,打印数据,那唯一的问题就是服务器会偶尔显得拥堵。但是如果你们同时修改数据问题就来了。我们来设想这样的情况,A获得了图层states的1,2,3,4四个Feature,然后把Feature 1的属性做了修改,这时B向服务器发出删除Feature的指令,碰巧Feature 1被删除了,此时A才将修改后的数据提交到服务器。会发生什么?服务器首先是找不到Feature 1,然后它会返回异常给A说Feature 1不存在,而A会很郁闷,Feature 1明明是存在的!这种情况就是分布式系统常常需要处理的,并发访问。不幸的是几乎所有GIS系统都是分布式的。


说了这么多无非是想引入LockFeature。WFS为我们考虑到了并发访问的问题,它提出的解决方案就是锁住需要修改的Feature。我们只需要告诉服务器我们希望锁住哪些Feature,然后服务器会返回两组数据,一组是成功锁定的Feature Id,一组是无法锁定的Feature Id。我们来看一个典型调用
< LockFeature
version ="1.1.0"
service ="WFS"
lockAction ="SOME"
xmlns ="
http://www./wfs"
xmlns:myns ="
http://www./myns"
xmlns:ogc ="
http://www./ogc"
xmlns:xsi ="
http://www./2001/XMLSchema-instance"
xsi:schemaLocation ="
http://www./wfs ../wfs/1.1.0/WFS.xsd" >
< Lock typeName ="topp:states" >
< ogc:Filter >
< ogc:FeatureId fid ="states.1" />
< ogc:FeatureId fid ="states.3" />
</ ogc:Filter >
</ Lock >
</ LockFeature >
和它的返回
Code
<? xml version="1.0" encoding="UTF-8" ?>
< wfs:LockFeatureResponse
xsi:schemaLocation ="
http://www./wfs http://localhost:8080/geoserver/schemas/wfs/1.1.0/wfs.xsd"
xmlns:ogc ="
http://www./ogc"
xmlns:tiger ="
http://www." xmlns:wfs ="http://www./wfs"
xmlns:topp ="
http://www./topp"
xmlns:xsi ="
http://www./2001/XMLSchema-instance"
xmlns:sf ="
http://www./spearfish"
xmlns:ows ="
http://www./ows"
xmlns:gml ="
http://www./gml"
xmlns:xlink ="
http://www./1999/xlink" >
< wfs:LockId > GeoServer_6074053a2e54aae0 </ wfs:LockId >
< wfs:FeaturesNotLocked >
< ogc:FeatureId fid ="states.1" />< ogc:FeatureId fid ="states.3" />
</ wfs:FeaturesNotLocked >
</ wfs:LockFeatureResponse >


所有含义一目了然。我们可以用Filter来指定需要锁定的Feature,返回数据告诉我们这些Feature哪些成功锁定,哪些不能锁定。不能锁定的Feature显然就是已经被锁定了的。这里有两个地方需要注意,首先是调用参数里面有一个"expiry"属性。这个值代表希望锁定的时间,以分钟为单位。如果超过这个时间还没有解锁,服务器会自动解锁,这样就避免了死锁。另外一个是返回值里有一个LockId节点。它的值标识了一次锁定行为,这个值一直到此次锁定解开前都是有效地,在Transaction中我们会用到它。

值得注意的是,在WFS里LockFeature是可选的,也就是说标准并不要求服务器一定要提供这个方法,
所以我们在使用时必须检查GetCapabilities的返回值,看这个服务器是否支持锁定Feature。


Transaction

Transaction,熟悉数据库的朋友对这个词都不陌生,事务。WFS修改数据的方法就是"提交事务"。这个方法也是可选的,这就意味着你完全可以开发一个不支持修改操作的GIS服务器,然后声称你的服务器符合WFS标准。
先来看典型调用
< wfs:Transaction service ="WFS" version ="1.0.0"
xmlns:cdf ="
http://www./cite/data"
xmlns:ogc ="
http://www./ogc"
xmlns:wfs ="
http://www./wfs"
xmlns:topp ="
http://www./topp" >
< wfs:LockId > OgcWfs_237erh8437578 </ wfs:LockId >
< wfs:Delete typeName ="topp:tasmania_roads" >
< ogc:Filter >
< ogc:PropertyIsEqualTo >
< ogc:PropertyName > topp:TYPE </ ogc:PropertyName >
< ogc:Literal > alley </ ogc:Literal >
</ ogc:PropertyIsEqualTo >
</ ogc:Filter >
</ wfs:Delete >
</ wfs:Transaction >
。这个调用中用到Filter其实我们应该了解在所有OGC标准中需要定位和检索的地方都会用到Filter,
它就像一个通用组件。我们专心看看LockId这个节点,在讨论LockFeature时我们见过它,它标识一次成功的锁定操作。现在这个值终于有用武之地了。我们锁定Feature的目的就是为了不受干扰的修改它们,如果我们要修改的Feature有被锁定的对象我们就需要提供这个Id,不然我们会得到一个错误。
和数据库一样,Transaction提供Insert,Update和Delete操作。此外服务器开发商还可以增加自己的操作
,并且在Capability中列出。一个Transaction节点可以包含许多这些操作,下面我们一个个介绍他们。
先从Insert开始。

Insert操作为指定的FeatureType创建新的Feature实例,Feature的数据用GML描述。它会返回新Feature的Id,顺序和提交的顺序一致。其实WFS有一套复杂的机制允许用户指定新Feature的Id,
详细情况请阅读标准文档(毕竟我们这个文章不是标准文档的翻译)。这是一个典型的Insert调用
< wfs:Transaction service ="WFS" version ="1.0.0"
xmlns:wfs ="
http://www./wfs"
xmlns:topp ="
http://www./topp"
xmlns:gml ="
http://www./gml"
xmlns:xsi ="
http://www./2001/XMLSchema-instance"
xsi:schemaLocation ="
http://www./wfs http://schemas./wfs/1.0.0/WFS-transaction.xsd http://www./topp http://localhost:8080/geoserver/wfs/DescribeFeatureType?typename=topp:tasmania_roads" >
< wfs:Insert >
< topp:tasmania_roads >
< topp:the_geom >
< gml:MultiLineString srsName ="
http://www./gml/srs/epsg.xml#4326" >
< gml:lineStringMember >
< gml:LineString >
< gml:coordinates decimal ="." cs ="," ts =" " >
494475.71056415,5433016.8189323 494982.70115662,5435041.95096618
</ gml:coordinates >
</ gml:LineString >
</ gml:lineStringMember >
</ gml:MultiLineString >
</ topp:the_geom >
< topp:TYPE > alley </ topp:TYPE >
</ topp:tasmania_roads >
</ wfs:Insert >
</ wfs:Transaction >

以及返回
<? xml version="1.0" encoding="UTF-8" ?>
< wfs:WFS_TransactionResponse version ="1.0.0"
xmlns:wfs ="
http://www./wfs"
xmlns:ogc ="
http://www./ogc"
xmlns:xsi ="
http://www./2001/XMLSchema-instance"
xsi:schemaLocation ="
http://www./wfs http://localhost:8080/geoserver/schemas/wfs/1.0.0/WFS-transaction.xsd" >
< wfs:InsertResult >
< ogc:FeatureId fid ="new0" />
</ wfs:InsertResult >
< wfs:TransactionResult >
< wfs:Status >
< wfs:SUCCESS /> </ wfs:Status >
</ wfs:TransactionResult >
</ wfs:WFS_TransactionResponse >

Update操作需要指定要修改的Feature和要修改的属性以及属性的新值。它可以用我们的Filter来指定Feature。
这是一个典型的Update调用

<!-- YOU PROBABLY DO NOT WANT TO RUN THIS QUERY SINCE
IT WILL MODIFY YOUR SOURCE DATA FILES
This will update one of the geometry fields in the tasmania_roads dataset.
-->
< wfs:Transaction service ="WFS" version ="1.0.0"
xmlns:topp ="
http://www./topp"
xmlns:ogc ="
http://www./ogc"
xmlns:wfs ="
http://www./wfs"
xmlns:gml ="
http://www./gml"
xmlns:xsi ="
http://www./2001/XMLSchema-instance"
xsi:schemaLocation ="
http://www./wfs http://schemas./wfs/1.0.0/WFS-transaction.xsd" >
< wfs:Update typeName ="topp:tasmania_roads" >
< wfs:Property >
< wfs:Name > the_geom </ wfs:Name >
< wfs:Value >
< gml:MultiLineString srsName ="
http://www./gml/srs/epsg.xml#4326" >
< gml:lineStringMember >
< gml:LineString >
< gml:coordinates > 500000,5450000,0 540000,5450000,0 </ gml:coordinates >
</ gml:LineString >
</ gml:lineStringMember >
</ gml:MultiLineString >
</ wfs:Value >
</ wfs:Property >
< ogc:Filter >
< ogc:FeatureId fid ="tasmania_roads.1" />
</ ogc:Filter >
</ wfs:Update >
</ wfs:Transaction >
以及返回
<? xml version="1.0" encoding="UTF-8" ?>
< wfs:WFS_TransactionResponse version ="1.0.0"
xmlns:wfs ="
http://www./wfs"
xmlns:ogc ="
http://www./ogc"
xmlns:xsi ="
http://www./2001/XMLSchema-instance"
xsi:schemaLocation ="
http://www./wfs http://localhost:8080/geoserver/schemas/wfs/1.0.0/WFS-transaction.xsd" >
< wfs:InsertResult >
< ogc:FeatureId fid ="none" />
</ wfs:InsertResult >
< wfs:TransactionResult >
< wfs:Status >
< wfs:SUCCESS />
</ wfs:Status >
</ wfs:TransactionResult >
</ wfs:WFS_TransactionResponse >

Delete操作只需要指定Feature就ok了。

到这里我们就把Transaction介绍完了,我发现一个问题,WFS不支持创建新的FeatureType。
我不知道专家们为什么这样设计,我只能接受这个实事,毕竟WFS已经够复杂了够强大了。

转:
http://www.cnblogs.com/sillyemperor/archive/2009/10/15/1583726.html


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多