基于Geoserver发布的wfs服务,实现空间和属性信息的查询。wfs包含getFeature操做,用来检索要素信息,支持返回gml格式的地理要素表达。ajax
WFS的getFeature操做须要提供的参数:json
参数名称 | 是否必须 | 默认值 | 举例 | 含义 |
VERSION | 是 | 1.1.0 | version=1.1.0或version=1.0.0 | 版本号 |
SERVICE | 是 | WFS | WFS | 服务名称 |
REQUEST=GetFeature | 是 | 请求操做(固定值) | ||
TYPENAME | 是 | text/xml; subtype=gml/3.1.1 | typeName=bj.xzqytypeName=bj.xzqy, bj:sqdw_font_point | 图层名称(命名空间.图层名称),多个图层名称用逗号隔开 |
OUTPUTFORMAT | outputFormat=GML2 | 输出类型 | ||
BBOX | BBOX=-75.102613,40.212597,-72.361859,41.512517,EPSG:4326 | 矩形范围(左下角X坐标,左下角Y坐标,右上角X坐标,右上角Y坐标,EPSG:4326) | ||
FILTER | FILTER=<Filter><Within><PropertyName>InWaterA_1M/wkbGeom<PropertyName> <gml:Envelope><gml:lowerCorner>10,10</gml:lowerCorner> <gml:upperCorner>20 20</gml:upperCorner></gml:Envelope></Within></Filter> | 过滤条件,gml格式定义空间范围,可包含属性条件。Filter是一种符合OGC规范的语言,一种XML实现的语言。SLD用它来实现复杂的Rule选择。WFS在全部须要定位操做对象的地方都会使用Filter。Filter的做用是构建一个表达式,返回值就是Feature的集合。 | ||
SORTBY | 排序字段 | |||
MAXFEATURES | 最多返回结果个数 | |||
PROPERTYNAME | propertyName=STATE_NAME,PERSONS | 属性字段名称,逗号隔开 | ||
SRSNAME | 投影方式名称 | |||
FEATUREID | FEATUREID=states.3 | ID号(图层名称.ID号),多个用逗号隔开 | ||
EXPIRY | 排除 | |||
RESULTTYPE | ||||
FEATUREVERSION |
举例:app
http://www.someserver.com/wfs?SERVICE=WFS& VERSION=1.1.0& REQUEST=GetFeature&PROPERTYNAME=InWaterA_1M/wkbGeom,InWaterA_1M/tileId&TYPENAME=InWaterA_1M& FILTER=
<Filter>
<Within>
<PropertyName>InWaterA_1M/wkbGeom<PropertyName>
<gml:Envelope>
<gml:lowerCorner>10,10</gml:lowerCorner>
<gml:upperCorner>20 20</gml:upperCorner>
</gml:Envelope>
</Within>
</Filter>
FILTER详解:Filter是一种基于XML的而且符合OGC规范的语言。SLD用它来实现复杂的Rule选择。WFS在全部须要定位操做对象的地方都会使用Filter。Filter的做用是构建一个表达式,返回值就是Feature的集合,换句话说Filter就如他的名字通常为咱们从一个集合中过滤出一个知足咱们要求的子集。而过滤的方法就是Filter定义的操做符。Filter定义了三种操做符:地理操做符(Spatial operators),比较操做符(Comparison operators)和逻辑操做符(Logical operators)。async
名称 | 含义 | 举例 |
Equals | 等于 | |
Disjoint | 不相交 | |
Intersects | 相交(存在交集) | |
Touches | ||
Within | 在..内部 | |
DWithin | 在…外部 | |
Overlaps | 叠加 | |
Crosses | 经过 | |
Contains | 包含 | |
Beyond | ||
BBOX | 矩形范围 |
名称 | 含义 | 举例 |
PropertyIsEqualTo | == | |
PropertyIsNotEqualTo | != | |
PropertyIsLessThan | < | |
PropertyIsGreaterThan | > | |
PropertyIsLessThanOrEq | <= | |
PropertyIsGreaterThanO | >= | |
PropertyIsLike | 利用通配符等符号对字符进行模糊匹配 | <Filter> url <PropertyIsLike wildCard="*" singleChar="#" escapeChar="!">spa <PropertyName>LAST_NAME</PropertyName>.net <Literal>JOHN*</Literal> 3d </PropertyIsLike>code </Filter>orm |
PropertyIsNull | 为空 | |
PropertyIsBetween | 在…之间 |
举例:构建一个表达式,人口在一千万以上,而且在指定的空间范围内的城市。
<Filter> <And> <PropertyIsGreaterThan> <PropertyName>population</PropertyName> <Literal>10000000</Literal> </PropertyIsGreaterThan> <BBOX> <PropertyName>geom</PropertyName> <Envelope srsName="EPSG:4326"> <lowerCorner>-180 -90</lowerCorner> <upperCorner>180 90</upperCorner> </Envelope> </BBOX> </And> </Filter>
验证:
拓扑查询(点与面相交- Intersects)点查询 查询条件设置以下:
<Filter xmlns="http://www.opengis.net/ogc"xmlns:gml="http://www.opengis.net/gml"> <Intersects> <PropertyName>bj:the_geom</PropertyName> <gml:Point srsName="http://www.opengis.net/gml/srs/epsg.xml#4326"> <gml:coordinates>116.817265,40.5296504</gml:coordinates> </gml:Point> </Intersects> </Filter>
目前我用到的应用场景在于点击查询,当我点击底图上的一个点的时候,我得到了当前点击的坐标值,而后来构造查询filter
其中须要注意的是PropertyName所表示的含义,
咱们在geoserver中选择用geojson来打开服务
在这个服务中,propertyname对应的是值为the_geom
在另外一个服务中则为geom ,因此我认为在作拓扑查询的时候,propertyname所对应的是geometry_name这个属性
线查询的Filter构造
<Filter xmlns="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml"> <Within> <PropertyName>GEOM</PropertyName> <gml:LineString> <gml:coordinates>113.763,34.435 113.763,34.5 113.844,34.5 113.844,34.435</gml:coordinates> </gml:LineString> </Within> </Filter>
面查询(最经常使用)Filter构造
<Filter xmlns="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml"> <Intersects> <PropertyName>GEOM</PropertyName>
<gml:Polygon> <gml:outerBoundaryIs> <gml:LinearRing> <gml:coordinates>113.763,34.435 113.763,34.5 113.763,34.435</gml:coordinates> </gml:LinearRing> </gml:outerBoundaryIs> </gml:Polygon> </Intersects> </Filter>
面查询用的最可能是由于,在实际点击中,你很难准确的点击到好比线上面 因此通常使用的是面与线相交,咱们构造一个容差值(构造出一个面)
let filterPointLT = Number(_param.x) - Number(_param.tolerance) + "," + Number(_param.y) + Number(_param.tolerance); //左上角坐标 let filterPointLB = Number(_param.x) - Number(_param.tolerance) + "," + (Number(_param.y) - Number(_param.tolerance)); //左下角坐标 let filterPointRT = Number(_param.x) + Number(_param.tolerance) + "," + Number(_param.y) + Number(_param.tolerance); //右上角坐标 let filterPointRB = Number(_param.x) + Number(_param.tolerance) + "," + (Number(_param.y) - Number(_param.tolerance)); //右下角坐标 let filterPoint = filterPointLT + " " + filterPointLB + " " + filterPointRB + " " + filterPointRT + " " + filterPointLT;
构造Filter
<Filter xmlns="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml"> <Intersects> <PropertyName> geom</PropertyName> <gml:Polygon> <gml:outerBoundaryIs> <gml:LinearRing> <gml:coordinates>filterPoint</gml:coordinates> </gml:LinearRing> </gml:outerBoundaryIs> </gml:Polygon> </Intersects> </Filter>
最后构造一个HTML请求
let _wfsUrl = "http://localhost:8080/geoserver/gas/ows? service=WFS&version=1.0.0&request=GetFeature &typeName=gas:t_area&outputFormat=application%2Fjson&filter="+ filter;
发送请求
$.ajax({ url: _wfsUrl, async: true, type:'GET', dataType: 'json', success(result) { callback(result); }, error(err) { console.log(err); } })