天地圖官方網站提供的二次開發文檔和例子過于簡單,很多關鍵信息沒有給予說明,例如給出了WFS服務接口,卻沒有提供詳細的開發文檔。
不過這并不影響我們的使用,因為OGC WFS規范包含元數據查詢命令,通過發送getCapabilities請求,我們可以得知服務器提供哪些WFS服務。
獲取WFS服務器元數據
http://search.tianditu.com/wfs?request=getCapabilities
返回信息如下:
<WFS_Capabilities version="1.0.0" xsi:schemaLocation="http://www.opengis.net/wfs http://schemas.opengeospatial.net//wfs/1.0.0/WFS-capabilities.xsd">
<Service>
<Name>GeoGlobe WFS</Name>
<Title>GeoGlobe網絡要素服務器</Title>
<Abstract>武大吉奧信息技術有限公司GeoGlobe網絡要素服務器</Abstract>
<KeywordList/>
<OnlineResource>http://search.tianditu.com:80/wfs</OnlineResource>
</Service>
<Capability>
<Request>
<GetCapabilities>
<DCPType>
<HTTP>
<Get onlineResource="http://search.tianditu.com:80/wfs"/>
</HTTP>
</DCPType>
</GetCapabilities>
<GetFeature>
<ResultFormat>
<GML2/>
</ResultFormat>
<DCPType>
<HTTP>
<Get onlineResource="http://search.tianditu.com:80/wfs"/>
<Post onlineResource="http://search.tianditu.com:80/wfs"/>
</HTTP>
</DCPType>
</GetFeature>
<DescribeFeatureType>
<SchemaDescriptionLanguage>
<XMLSCHEMA/>
</SchemaDescriptionLanguage>
<DCPType>
<HTTP>
<Get onlineResource="http://search.tianditu.com:80/wfs"/>
</HTTP>
</DCPType>
</DescribeFeatureType>
</Request>
<VendorSpecificCapabilities/>
</Capability>
<FeatureTypeList>
<Operations>
<Query/>
</Operations>
<FeatureType>
<Name>DOMAIN_POI_NEW</Name>
<Title>DOMAIN_POI_NEW</Title>
<Abstract>DOMAIN_POI_NEW</Abstract>
<Keywords>DOMAIN_POI_NEW</Keywords>
<SRS>EPSG:4326</SRS>
<LatLongBoundingBox minx="-180.0" miny="-90.0" maxx="180.0" maxy="90.0"/>
</FeatureType>
<FeatureType>
<Name>iso19112:SI_Gazetteer</Name>
<Title>iso19112:SI_Gazetteer</Title>
<SRS>EPSG:4326</SRS>
<LatLongBoundingBox minx="-180.0" miny="-90.0" maxx="180.0" maxy="90.0"/>
</FeatureType>
</FeatureTypeList>
<ogc:Filter_Capabilities>
<ogc:Spatial_Capabilities>
<ogc:Spatial_Operators>
<ogc:BBOX/>
<ogc:Equals/>
<ogc:Disjoint/>
<ogc:Intersect/>
<ogc:Touches/>
<ogc:Crosses/>
<ogc:Within/>
<ogc:Contains/>
<ogc:Overlaps/>
<ogc:Beyond/>
</ogc:Spatial_Operators>
</ogc:Spatial_Capabilities>
<ogc:Scalar_Capabilities>
<ogc:Logical_Operators/>
<ogc:Comparison_Operators>
<ogc:Simple_Comparisons/>
<ogc:Like/>
<ogc:Between/>
</ogc:Comparison_Operators>
</ogc:Scalar_Capabilities>
</ogc:Filter_Capabilities>
</WFS_Capabilities>
返回信息包含了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
返回
<wfs:FeatureCollection xsi:schemaLocation="http://www.opengis.net/wfs WFS_Basic.xsd http://www.geostart.com.cn/geoglobe describe.xsd">
<gml:boundedBy>
<gml:Box>
<gml:coordinates>-180.0,-90.0 180.0,90.0</gml:coordinates>
</gml:Box>
</gml:boundedBy>
<gml:featureMember>
<DOMAIN_POI_NEW>
<OID>6764930</OID>
<Geometry>
<gml:Point srsName="-1">
<gml:coordinates>105.999183,29.995258</gml:coordinates>
</gml:Point>
</Geometry>
<DOMAINNAME>梅子村</DOMAINNAME>
<DOMAINCODE>1CHN50022400000130172</DOMAINCODE>
<NLEVEL>16</NLEVEL>
<X>105.999183</X>
<Y>29.995258</Y>
<COLDATE/>
<NAMETIME/>
<ENDTIME/>
<CLASSID/>
<STANDARDNAME>亞洲中國重慶市銅梁縣梅子村</STANDARDNAME>
<TELEPHONE/>
<ADDRESS/>
<KIND>BB80</KIND>
<ZIPCODE/>
<ADMINCODE>500224</ADMINCODE>
<POI_ID>5000000130172</POI_ID>
<PID/>
<DATATYPE>chinapoi</DATATYPE>
<FENAME/>
<locationType>
<SI_LocationType>
<name>DOMAIN_POI_NEW</name>
</SI_LocationType>
</locationType>
</DOMAIN_POI_NEW>
</gml:featureMember>
</wfs:FeatureCollection>
分析返回的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 = "<?xml version='1.0' encoding='UTF-8'?>"
+ "<wfs:GetFeature maxFeatures='100' service='WFS' version='1.0.0' "
+ "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'>"
+ "<wfs:Query typeName='iso19112:SI_Gazetteer' srsName='EPSG:4326'>"
+ "<ogc:Filter xmlns:ogc='http://www.opengis.net/ogc'>"
+ "<ogc:And><ogc:PropertyIsLike wildCard='*' singleChar='.' escape='!'>"
+ "<ogc:PropertyName>STANDARDNAME</ogc:PropertyName>"
+ "<ogc:Literal>*解放碑*</ogc:Literal>"
+ "</ogc:PropertyIsLike></ogc:And></ogc:Filter>"
+ "</wfs:Query></wfs:GetFeature>";
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代碼錯誤。
posted on 2010-12-10 16:22
天狼 閱讀(5936)
評論(3) 編輯 收藏