文档库 最新最全的文档下载
当前位置:文档库 › GIS访问WFS服务

GIS访问WFS服务

GIS访问WFS服务
GIS访问WFS服务

GIS访问WFS服务

2010-02-04 15:06

要执行WFS查询,有三种方法:

① 调用一个函数帮您生成常用的WFS查询条件,并执行查询。WMSLayer类中有一组函数能够提供一些缺省的查询。(WMSLayer对象的指针如何获得?您的程序调用MapLoader::loadMapXML函数之后,map对象中的第一个图层便是WMSLayer,所以可以通过这样的语句获取该指针

dynamic_cast(m_pMapControl->getMap()->getLayer(0)))WMSLayer:: getFeatureByCircle:在指定的圆范围内查询某(几)个图层的空间地物信息。

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添加标记,在调用两次AttFilterInsert添加两个不同的条件,调用AttFilterEndAnd添加标记,到此属性查询条件建立完毕。后面调用SpatialFilterInsert直接写了一个空间查询条件。最后调用WMSLayer的getFeature函数得到查询结果result,但这个指针不能删除。

您如果想在一次查询中同时查询多个图层,那么需要多次调用QueryParam类的createAndAddQueryLayerParam方法创建QueryLayerParam对象,并使用上述方法编写查询条件。

使用上述函数建立的查询条件可以通过调用QueryLayerParam类的

getAttFilter函数得到生成的属性查询条件文本,调用getSpatialFilter得到生成的空间查询条件文本。

3 您直接写出查询语句后查询。

直接写查询语句,您需要知道WFS查询语句如何编写。

首先介绍属性查询语句如何编写。这里可以解释上面的例子中两个属性查询条件为什么不是条件1 And 条件2 ,而是 条件1 条件2

WFS查询条件中And、Or、Not这三个逻辑判断谓词需要使用<××>的形式将条件包含其中,这一点和SQL差异比较大。

以下说明每种属性比较谓词如何写成WFS查询条件:

1) Equal:第一个%s填写字段名称,第二个%s填写字段值

%s%s

2) NotEqual:第一个%s填写字段名称,第二个%s填写字段值

%s%s

3) Less:第一个%s填写字段名称,第二个%s填写字段值

%s%s

4) Greater:第一个%s填写字段名称,第二个%s填写字段值

%s%s

teral>

5) LessOrEqual:第一个%s填写字段名称,第二个%s填写字段值

%s %s

6) GreaterOrEqual:第一个%s填写字段名称,第二个%s填写字段值%s%s

7) Like:第一个%s填写字段名称,第二个%s填写字段值

escapeChar="\">%s%s

8) IsNull:第一个%s填写字段名称

%s

9) Between:第一个%s填写字段名称,第二个%s填写字段值下限,第三个%s填写字段值上限

%s%s%s 综上所述,②的例子中属性查询语句部分可以直接写成:

escapeChar="\">name新百商场

*kind2200

调用QueryLayerParam的setAttFilter函数,将上面的字符串传递进去即可(②的例子中使用的AttFilterBeginAnd、AttFilterInsert等函数就是完成了上面那串字符而已)。

下面介绍空间查询语句如何编写。以下说明每种空间比较谓词如何写成WFS查询条件:

1) Equals:第一个%s填写图形字段名称(WMSLayer类的getShapeFieldName函数可以得到),第二个%s填写GML3格式的图形

%s%s

2) Disjoint:第一个%s填写图形字段名称,第二个%s填写GML3格式的图形

%s%s

3) Touches:第一个%s填写图形字段名称,第二个%s填写GML3格式的图形

%s%s

4) Within:第一个%s填写图形字段名称,第二个%s填写GML3格式的图形

%s%s

5) Overlaps:第一个%s填写图形字段名称,第二个%s填写GML3格式的图形

%s%s

6) Crosses:第一个%s填写图形字段名称,第二个%s填写GML3格式的图形

%s%s

7) Intersects:第一个%s填写图形字段名称,第二个%s填写GML3格式的图形

%s%s

8) Contains:第一个%s填写图形字段名称,第二个%s填写GML3格式的图形

9) DWithin:第一个%s填写图形字段名称,第二个%s填写GML3格式的图形,第三个%f填写一个距离(实际坐标距离)

%s%s

units="m">%f

10) Beyond:第一个%s填写图形字段名称,第二个%s填写GML3格式的图形,第三个%f填写一个距离(实际坐标距离)

%s%s

units="m">%f

11) BBOX:第一个%s填写图形字段名称,第二个%s填写坐标系统,后面四个%f填写一个矩形范围(顺序为xmin,ymin,xmax,ymax)

%s

srsName="%s">%f,%f %f,%f

多个空间查询条件也需要逻辑比较谓词来包含,一个空间查询条件可以看作是一个属性查询条件,这方面操作是一致的。

上面提到的GML3格式的图形,涉及到如何将图形对象转换为GML3格式的问题,详细的您可以参考有关书籍,这里介绍如何调用UCMAP的函数来达到转换的目的,GMLWriter类有个静态函数toGML3,调用方法如下:

CString geo=GMLWriter::toGML3(geometry,projection,geometryType);

其中geometry为图形对象指针,projection由WMSLayer的getProjection函数得到,geometryType由WMSLayer的getGeometryType函数得到。geo就是GML3格式的图形描述字符串。

相关文档