GIS访问WFS服务
2010-02-04 15:06
要执行WFS查询,有三种方法:
① 调用一个函数帮您生成常用的WFS查询条件,并执行查询。WMSLayer类中有一组函数能够提供一些缺省的查询。(WMSLayer对象的指针如何获得?您的程序调用MapLoader::loadMapXML函数之后,map对象中的第一个图层便是WMSLayer,所以可以通过这样的语句获取该指针
dynamic_cast
WMSLayer:: getFeatureByRect:在指定的矩形范围内查询某(几)个图层的空间地物信息。
WMSLayer:: getFeatureByPoint:点选查询。指定地图的某一点的位置,查询该处某(几)个图层的空间地物信息。
WMSLayer:: getFeatureByPolygon:在指定的多边形范围内查询某(几)个图层的空间地物信息。
WMSLayer:: getFeatureByLine:查询与指定的线相交的某(几)个图层的空间地物信息。
以getFeatureByCircle为例,说明如何使用。
QueryParam params;
QueryLayerParam*
param=params.createAndAddQueryLayerParam(L"layerName");
Point pt(118.780716f,32.047253f);
GetFeatureResult *result=layer->getFeatureByCircle(&pt,100,¶ms); 首先建立一个QueryParam对象(该对象有个十分重要的参数maxFeatures,即此次查询最大要素个数,其默认值为100,调用setMaxFeatures函数可以修改这个值),之后调用QueryParam类的createAndAddQueryLayerParam函数创建一个QueryLayerParam,这个对象对应着服务器上的一个FeatureType,即WMS 地图中的一个图层,名字为“layerName”,需要您自己修改。然后调用WMSLayer 的getFeatureByCircle函数,以一个point对象、一个距离和之前建立的QueryParam对象作为参数。函数返回一个GetFeatureResult对象指针,这个对象包含您需要的查询结果,但这个指针不能删除。
② 调用一系列函数帮您生成您自定义的WFS查询条件后查询。WMSLayer类有个getFeature函数,这个函数是执行查询用的,在执行这个函数之前,您要建立一个QueryParam对象,并填充里面的查询条件。QueryParam类具有如下一组函数来帮助您编写查询条件,spatialFilterBeginAnd,spatialFilterEndAnd,spatialFilterBeginOr,spatialFilterEndOr,spatialFilterBeginNot,spatialFilterEndNot(),spatialFilterInsert这些函数用于编写空间查询条件。AttFilterBeginAnd,AttFilterEndAnd,AttFilterBeginOr,AttFilterEndOr,AttFilterBeginNot,AttFilterEndNot,AttFilterInsert这些函数用于编写属性查询条件。空间查询条件和属性查询条件会被系统自动合并。下面举个例子说明如何使用这些函数:
假定我们要查询pnanjing这个FeatureType上name字段值类似于“新百商场*”(即字段值由“新百商场”开头,并且后面字符数量随意)、并且kind字段
等于“2200”、并且位于指定的矩形范围内。这个查询中,我们将属性查询和空间查询区分开来处理。具体代码如下所示(layer为WMSLayer对象指针):QueryParam params;
QueryLayerParam*
param=params.createAndAddQueryLayerParam(L"pnanjing");
param->AttFilterBeginAnd();
param->AttFilterInsert(L"name",Like,L"新百商场*",NULL);
param->AttFilterInsert(L"kind",Equal,L"2200",NULL);
param->AttFilterEndAnd();
Envelope env(0,120,0,120);
param->SpatialFilterInsert(BBOX,NULL,&env,0,layer->getShapeFieldName( ),layer->getProjection(),layer->getGeometryType());
GetFeatureResult *result =layer->getFeature(¶ms);
首先先建立QueryParam对象,在建立名字为“pnanjing”的QueryLayerParam 参数,之后调用AttFilterBeginAnd添加
您如果想在一次查询中同时查询多个图层,那么需要多次调用QueryParam类的createAndAddQueryLayerParam方法创建QueryLayerParam对象,并使用上述方法编写查询条件。
使用上述函数建立的查询条件可以通过调用QueryLayerParam类的
getAttFilter函数得到生成的属性查询条件文本,调用getSpatialFilter得到生成的空间查询条件文本。
3 您直接写出查询语句后查询。
直接写查询语句,您需要知道WFS查询语句如何编写。
首先介绍属性查询语句如何编写。这里可以解释上面的例子中两个属性查询条件为什么不是条件1 And 条件2 ,而是
WFS查询条件中And、Or、Not这三个逻辑判断谓词需要使用<××>××>的形式将条件包含其中,这一点和SQL差异比较大。
以下说明每种属性比较谓词如何写成WFS查询条件:
1) Equal:第一个%s填写字段名称,第二个%s填写字段值
2) NotEqual:第一个%s填写字段名称,第二个%s填写字段值
3) Less:第一个%s填写字段名称,第二个%s填写字段值
4) Greater:第一个%s填写字段名称,第二个%s填写字段值
teral>
5) LessOrEqual:第一个%s填写字段名称,第二个%s填写字段值
6) GreaterOrEqual:第一个%s填写字段名称,第二个%s填写字段值
7) Like:第一个%s填写字段名称,第二个%s填写字段值
escapeChar="\"> 8) IsNull:第一个%s填写字段名称 9) Between:第一个%s填写字段名称,第二个%s填写字段值下限,第三个%s填写字段值上限 escapeChar="\"> * 调用QueryLayerParam的setAttFilter函数,将上面的字符串传递进去即可(②的例子中使用的AttFilterBeginAnd、AttFilterInsert等函数就是完成了上面那串字符而已)。 下面介绍空间查询语句如何编写。以下说明每种空间比较谓词如何写成WFS查询条件: 1) Equals:第一个%s填写图形字段名称(WMSLayer类的getShapeFieldName函数可以得到),第二个%s填写GML3格式的图形 2) Disjoint:第一个%s填写图形字段名称,第二个%s填写GML3格式的图形 3) Touches:第一个%s填写图形字段名称,第二个%s填写GML3格式的图形 4) Within:第一个%s填写图形字段名称,第二个%s填写GML3格式的图形 5) Overlaps:第一个%s填写图形字段名称,第二个%s填写GML3格式的图形 6) Crosses:第一个%s填写图形字段名称,第二个%s填写GML3格式的图形 7) Intersects:第一个%s填写图形字段名称,第二个%s填写GML3格式的图形 8) Contains:第一个%s填写图形字段名称,第二个%s填写GML3格式的图形 9) DWithin:第一个%s填写图形字段名称,第二个%s填写GML3格式的图形,第三个%f填写一个距离(实际坐标距离) units="m">%f 10) Beyond:第一个%s填写图形字段名称,第二个%s填写GML3格式的图形,第三个%f填写一个距离(实际坐标距离) units="m">%f 11) BBOX:第一个%s填写图形字段名称,第二个%s填写坐标系统,后面四个%f填写一个矩形范围(顺序为xmin,ymin,xmax,ymax) srsName="%s"> 多个空间查询条件也需要逻辑比较谓词来包含,一个空间查询条件可以看作是一个属性查询条件,这方面操作是一致的。 上面提到的GML3格式的图形,涉及到如何将图形对象转换为GML3格式的问题,详细的您可以参考有关书籍,这里介绍如何调用UCMAP的函数来达到转换的目的,GMLWriter类有个静态函数toGML3,调用方法如下: CString geo=GMLWriter::toGML3(geometry,projection,geometryType); 其中geometry为图形对象指针,projection由WMSLayer的getProjection函数得到,geometryType由WMSLayer的getGeometryType函数得到。geo就是GML3格式的图形描述字符串。