openlayers解析吉奧天地圖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