一個項目使用了ArcGIS JS API開發GIS展示層,但GIS服務使用了Geoserver,這時加載Geoserver數據和查詢數據就和之前完全不一樣了,以下介紹下我使用ArcGIS JS API+Geoserver開發過程中解決Geoserver圖層屬性查詢的一個方案。
以Geoserver中發布的圖層 city 為例。我現在要查詢city圖層中ID=53090000000000的對象,並使用ArcGIS JS API將查詢到的結果顯示出來。
首先找到查詢的實際地址:
http://localhost:9999/geoserver/換成自自己工作空間名稱/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=換成自自己工作空間名稱:city&maxFeatures=50&outputFormat=application/json&CQL_FILTER=ID=53090000000000
先不要管這個地址哪兒來的,對應上面需要改的地方改下試試先。如果不對,可以參考以下做法修正部分參數:
第一步:
第二步:
照這樣自己抓取看下,最后把抓取地址中的輸出類型改為json就可以了。參考上面給出的示例地址。
做好上面的准備過后,就是請求了。構建好url地址,使用ajax的post請求即可,如果出現跨域問題可以通過jsonp或者后台寫個httppost程序來轉換下。
我們關注的是請求結果,如下圖:
得到的結果包含了字段屬性和圖形坐標,這里可以使用json2.js完成對象到json的轉換。這里重要的介紹下圖形的重新繪制,我們關注的是features下的coordinates。
參考ArcGIS JS API中創建面的方法,如下圖:
於是我這樣寫:
var json = { "rings": points, "spatialReference": { "wkid": 4326 } }; var polygon = new esri.geometry.Polygon(json);
結果居然是錯誤的,中間經歷了很多的嘗試,后來找到准確的寫法是這樣的:
var feature = features[i]; var points = []; for (var n = 0; n < feature.geometry.coordinates.length; n++) { points.push(feature.geometry.coordinates[n][0]); } var json = { "rings": points, "spatialReference": { "wkid": 4326 } }; var polygon = new esri.geometry.Polygon(json);
只能說geoserver存儲圖形的坐標方式和arcserver是不一樣的吧,這里是一個坑,希望對同樣掉入這個坑的人有點幫助。