openlayers解析吉奥天地图wfs服务

天地图官方网站提供的二次开发文档和例子过于简单,很多关键信息没有给予说明,例如给出了WFS服务接口,却没有提供详细的开发文档。

不过这并不影响我们的使用,因为OGC
WFS规范包含元数据查询命令,通过发送getCapabilities请求,我们可以得知服务器提供哪些WFS服务。

获取WFS服务器元数据
http://search.tianditu.com/wfs?request=getCapabilities
返回信息如下:

GeoGlobe WFS

武大吉奥信息技术有限公司GeoGlobe网络要素服务器

http://search.tianditu.com:80/wfs

DOMAIN_POI_NEW

DOMAIN_POI_NEW
DOMAIN_POI_NEW
EPSG:4326

iso19112:SI_Gazetteer

EPSG:4326

返回信息包含了WFS服务器的开发单位(武大吉奥),WFS图层的名称(DOMAIN_POI_NEW和iso19112:SI_Gazetteer),支持的逻辑操作符和空间操作符。

继续测试
http://search.tianditu.com/wfs?request=GetFeature&version=1.0.0&typeName=DOMAIN_POI_NEW&BBOX=105.99,29.99,106,30

返回

-180.0,-90.0 180.0,90.0

6764930

105.999183,29.995258

梅子村
1CHN50022400000130172
16
105.999183
29.995258

亚洲中国重庆市铜梁县梅子村

BB80

500224
5000000130172

chinapoi

DOMAIN_POI_NEW

分析返回的GML数据,可知DOMAIN_POI_NEW是地名图层,包含名称、代码、类别码等属性字段。

将图层改为iso19112:SI_Gazetteer,没有返回任何信息,google ISO19112,得到如下解释:
DIN EN ISO 19112-2005 地理信息.通过地理标识符的空间定位标准号: DIN EN ISO 19112-2005
标准名称:地理信息.通过地理标识符的空间定位

得到以上信息后,我们尝试使用Openlayers获取,即全国地名数据库。

通过URL(GET方式)访问“天地图”WFS服务,可以使用OpenLayers.Request.GET类,示例代码如下:
   //使用FEATUREID查询

   new OpenLayers.Request.GET(
{
  
   
 url :
“http://search.tianditu.com/wfs?request=GetFeature”,
  
   
 params: {
  
   
   
 typeName: “DOMAIN_POI_NEW”,
  
   
    
FEATUREID: “DOMAIN_POI_NEW.6649356”
  
    
},
  
   
 callback : handler
    });

   //使用BBOX查询

    new
OpenLayers.Request.GET( {
  
   
 url :
“http://search.tianditu.com/wfs?request=GetFeature”,
  
   
 params: {
  
   
   
 typeName: “DOMAIN_POI_NEW”,
  
   
    
BBOX: “105.99,29.99,106,30” 
//map.getExtent().toBBOX()
  
   
 },
  
   
 callback : handler
  
 });

说明:
url WFS服务器地址,必须加上?request=GetFeature
typeName 图层名称
FEATUREID WFS的图元ID,采用标准格式: [图层名].[OID编号]
BBOX 指定区域查询,注意不要设置过大,否则浏览器可能失去响应。

通过POST方式访问“天地图”WFS服务,可以使用OpenLayers.Request.POST类,示例代码如下:

    var
xmlPara = “”
  
   
   
 + “
  
   
   
 + “xmlns:wfs=’http://www.opengis.net/wfs’ “
  
   
   
 + “xmlns:gml=’http://www.opengis.net/gml’ “
  
   
   
 + “xmlns:ogc=’http://www.opengis.net/ogc’ “
  
   
   
 +
“xmlns:xsi=’http://www.w3.org/2001/XMLSchema-instance’ “
  
   
   
 + “xsi:schemaLocation=’http://www.opengis.net/wfs
http://schemas.opengis.net/wfs/1.0.0/wfs.xsd’>”
  
   
   
 + “”
  
   
   
 + “”
  
   
   
 + “”
  
   
   
 + “STANDARDNAME”
  
   
   
 + “*解放碑*”
  
   
   
 + “”
  
   
   
 + “”;
    
    var request
= OpenLayers.Request.POST( {
  
   
 url : “http://search.tianditu.com/wfs?”,
  
   
 data : xmlPara,
  
   
 callback : handler
    });
};

说明:

url WFS服务器地址

data WFS请求正文,返回的GML由回调函数handler处理

handler负责处理服务端返回的GML数据,也就是矢量化的地图数据,根据应用需求编写代码,获取feature的通用代码如下:

var g = new OpenLayers.Format.GML();
var features = g.read(req.responseText);
for ( var i = 0; i < features.length; ++i) {
   var feature =
features[i];
   var geometry =
feature.geometry;
   var attributes =
feature.attributes;
}

定义过滤条件时请使用STANDARDNAME字段,不要使用DOMAINNAME字段,前者应该有索引支持,而后者没有,查询速度差别很大。

经过测试,typeName=”DOMAIN_POI_NEW”和typeName=”iso19112:SI_Gazetteer”都能返回结果。由于缺少官方文档说明,不知道这两个图层有何区别。

尝试使用OpenLayers.Protocol.WFS无法访问“天地图”WFS服务,服务器返回:
请求参数[REQUEST]的值为空或不正确。

提醒:
使用POST查询时,页面文件或代码文件务必保存为utf-8编码,如果使用gbk、gb2312编码,汉字地名会变成乱码,导致javascript代码错误。

 

 

 

 

WFS简介:

WFS基础:
GeoServer支持OGC(开放地理信息联盟)规范的Web Feature
Service(WFS)服务。WFS服务目前有两个版本1.0和1.1。通过WFS服务可以通过网络获得原始的矢量数据,使得从客户端获取地图的原始数据结构和数据成为可能。WFS的高级应用还包括修改和锁定数据。

GeoServer全面实现了WFS 1
.0和1.1两个版本。包括一些基本操作:GetCapability,DescrptionFeatureType,GetFeature.

WFS1.0和WFS1.1的不同点:
WFS.1.1默认得到GML3,WFS1.0默认得到GML2
GML3与GML2在描述几何图形时存在细微差别。
1. 指定空间坐标系写法不同
2. 获得的坐标顺序不同。
WFS 1.1.0 request = latitude/longitude (y/x)
WFS 1.0.0 request = longitude/latitude (x/y)

WFS 矢量参数:
GeoServer提供了一组用户参数。
CQL 过滤器
Reprojection
XML request validation
GetCapability namespace filter

WFS操作
操作                       
描述
GetCapability            
获得服务列表,同时检查WFS操作和参数
DescriptionFeatureType    
获得指定数据集的信息和属性
GetFeature               
获得图形和属性的实际数据
LockFeature              
在编辑时阻止对该组件类型的访问
Transaction              
编辑已有的组件类型,创建、修改、删除
GetGMLObject             
1.1.0支持。

GetFeature
GetFeature 操作请求实际的空间数据。与其他操作相比更复杂、强大。
最简单GetFeature命令是一个没有参数的。
http://localhost:8080/geoserver/wfs?
service=wfs&
version=1.1.0&
request=GetFeature&
typeName=namespace:featureType
请求指定FID的feature
http://localhost:8080/geoserver/wfs?
service=wfs&
version=1.1.0&
request=GetFeature&
typeName=namespace:featureType&
featureID = feature

限制返回组件数量
http://localhost:8080/geoserver/wfs?
service=wfs&
version=1.1.0&
request=GetFeature&
typeName=namespace:featureType
maxFeature=N

转载自:https://blog.csdn.net/ZHANGHUI3239619/article/details/78747014

You may also like...