1. 程式人生 > >利用ajax請求arcgis釋出的wfs地圖要素服務

利用ajax請求arcgis釋出的wfs地圖要素服務

首先在寫這篇部落格之前,要感謝我的同事們,得到他們的指點,學到了不少的東西。可以說站在巨人的肩膀上,讓你看得更高、更遠。也榮幸遇到這樣的巨人。

最近開發的這個地理資訊系統專案,我負責了三維平臺部分。在三維平臺中需要接入二維釋出的資料,而我們二維地圖使用的是esri的arcgis釋出的wfs要素地圖服務。之所以使用wfs地圖服務,而不是使用儲存在普通的資料庫的原因,是因為如果用於儲存在普通資料庫中資料,那麼會涉及到資料的拼接,用於二維地圖的展示,再者,如果使用了拼接後在地圖的展示,那麼後續用於查詢,資料的增、刪、查、改都不方便。綜合上面的原因,我們使用了arcgis釋出wfs要素服務。

而下圖是我們釋出好地圖要素服務,在這裡從Layers中可以看出,我們釋出的地圖圖層為一層。點選ArcGIS JavaScript就進入到上面瀏覽器展示地圖要素介面。

而我們下面的工作是,對某一個圖層進行查詢,這裡選擇FW(0)圖層,進入到下面的介面,該介面是針對我們的FW(0)圖層的操作。我們這裡選擇Query進入到查詢設定介面。

下面就是我們專門對FW(0)圖層的查詢。其中,我們看到了很多引數,首先來看一下where,該條件是針對欄位進行的設定,例如可以這樣設定"NAME = '" + stateName + "'","POP04 > " + population等等做相關設定。其中Text、Object IDs、Time都是類似普通的sql查詢,具體的可以參考arcgis for javascript的query庫,而我們地理資訊方面的開發則需要使用傳入一些幾何圖形,比如說,點、面之類的。接下來著重講解一下,Input Geometry為輸入的幾何要素,按照我們輸入的幾何要素,下面的Geometry Type相應的選擇對應的型別。Spatial Relationship則是空間關係的計算,分別是Intersects(求交)、Contains(包含)、Crosses(相交)、Touch(相鄰)等操作。還有可以設定OutFields相應的設定shapefile裡面的輸出欄位,設定Return Geometry的true會返回幾何資訊外還會返回欄位值資訊,設定Format,其中可以為html、json、AMF、KMZ格式,我們這裡設定為json,這樣方便後面使用javascript對其解析。

下圖是對where等進行了設定,然後返回了資料。

下圖是返回的資料,我們使用chrome瀏覽器開啟除錯模式,就可以看到請求資訊。這裡最重要的是Form Data,因為該格式用於ajax請求時的引數填寫。

開啟Preview可以預覽請求到的資料。

而接下來就是我們的開發工作了,我們這裡使用的是ajax的方式去請求資料,因為我使用的是在三維地圖上點選一個點,然後將該點傳入到二維地圖服務中,利用空間相交關係來判斷哪個面與該點相交了,然後解析資料,用於前臺的展示。整個工作流程就算走完了。

首先我們來看一下程式碼,使用了ajax,其中data為我們建立的請求物件,對應了在請求介面的引數。然後使用async非同步的方式,設定了全域性,然後在success中回調了函式,進行回撥操作。

實現程式碼如下:

var ajaxLoadData=function(){
        var url="http://192.168.3.232:6080/arcgis/rest/services/HXGK/FW2000/MapServer/0/query"

        //var point = {"x":106.653, "y":26.4434, "spatialReference": {"wkid": 4490 } };
        //var point = {"x":106.652501, "y":26.443422};

        var point={"x":106.652501,"y":26.443422,"spatialReference":{"wkid":4490}}

        var strPoint="{"+"'x':106.652501,'y':26.443422,"+"'spatialReference':"+"{"+"'wkid':4490"+"}"+"}"


        var data={}
        data.where="";
        data.text=""
        data.objectIds=""
        data.time=""
        data.geometry=strPoint
        data.geometryType="esriGeometryPoint"
        data.inSR=""
        data.spatialRel="esriSpatialRelIntersects"
        data.relationParam=""
        data.outFields="*"
        data.returnGeometry=true
        data.maxAllowableOffset=""
        data.geometryPrecision=""
        data.outSR=""
        data.returnIdsOnly=false
        data.returnCountOnly=false
        data.orderByFields=""
        data.groupByFieldsForStatistics=""
        data.outStatistics=""
        data.returnZ=""
        data.returnM=""
        data.gdbVersion=""
        data.returnDistinctValues=""
        data.f="pjson"


        var xxx="xxx";

        $.ajax({
           type:'post',
           url:url,
           async:false, 
           dataType:'jsonp',
           contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
           data:data,
           success:function(resData){
             var tmpData=resData;
             alert("請求資料成功")
           },
           error:function (jqXHR, textStatus, errorThrown) {
              console.log("連線資料的時候出現了:"+textStatus);
            }

        })
    }

最後如下圖所示,在ie瀏覽器中打了debug模式後,可以看到我們成功的請求到arcgis釋出的WFS地圖要素服務。其中要素資料在featueres中,接下來只要需解析資料即可。

看了程式碼,大家需要注意的是,我們傳入的點資料是字串型別的,即我使用的是strPt裡面的變數,而不是物件的變數point的值,否則使用ajax請求會,會返回400說引數非法或者缺失的錯誤。

當然,在使用ajax請求的使用還遇到如下的錯誤,查閱了網路的相關資料,說明是dataType設定出了跨域的錯誤,只要將dataType設定為jsonp即可,這和javascript的同源策略有關,具體需要查閱相關的方面資料。

到此為止,整個使用ajax請求arcgis釋出的wfs地圖要素服務就說明完了,當然,我這只是使用了point型別的geometry大家可以試著使用polygon之類的geometry去請求資料。

                                                                              更多內容,請關注公眾號