1. 程式人生 > >openlayers解析吉奧天地圖wfs服務

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