作者:Sniper
地圖動态投影之後又做了切片?資料量太大沒辦法對資料集做坐标轉換?使用資料服務查詢出的結果不能疊加在地圖上顯示?不要急!SuperMap iServer 8C(2017)新特性:對資料服務查詢結果動态投影!
讓我們來看一看具體怎麼做吧。
####1、向伺服器發送請求
由于iClient for JavaScript還沒有對資料服務查詢動态投影對接,是以我們需要使用REST API來向伺服器發送請求。使用SQL查詢作為例子,代碼如下:
var commit=new XMLHttpRequest();
var uri="http://localhost:8090/iserver/services/data-China400/rest/data/featureResults.rjson?returnContent=true";
//設定請求體參數
var entry={
getFeatureMode:"SQL",
targetEpsgCode:4326,
datasetNames:["China400:TraStation_A_pt"],
maxFeatures:1000,
queryParameter:{
"sortClause":null,
"ids":null,
"name":"Capital",
"attributeFilter":"SMID=400",
"groupClause":null,
"linkItems":null,
"joinItems":null,
"fields":null
}
};
commit.open("POST",encodeURI(uri),false,"","");
commit.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
commit.send(JSON.stringify(entry));
//解析從伺服器端傳回的 json 字元串,解析為一個 JavaScript 對象。
var response = JSON.parse(commit.responseText);
其中需要注意的就是targetEpsgCode這個參數,這個參數的意義就是對查詢的結果動态投影的目标坐标系。與之相關的還有一個targetPrj參數,當目标投坐标系無對應的EpsgCode時,使用targetPrj。
####2、擷取傳回結果
在這裡得到的response就是我們的查詢結果,來看看response的結構。
對查詢結果顯示出來的代碼和效果如下:
var container = document.getElementById('container');
container.innerHTML="";
//判斷查詢是否成功
if(response.featureCount<1)
{
//查詢失敗
container.innerHTML+="<p>查詢失敗</p>";
}else
{
//查詢成功
container.innerHTML+="<p>查詢成功</p>";
for(var i=0;i<response.features[0].fieldNames.length;i++){
container.innerHTML+="<p>"+response.features[0].fieldNames[i]+":"+response.features[0].fieldValues[i]+"</p>";
}
}
####3、将查詢結果添加在地圖上
在這裡我們可以看到,查詢得到的資料原始坐标系是EPSG:3857,也就是墨卡托投影坐标系。但是我們的地圖是動态投影到EPSG:4326(WGS84地理坐标系)上的,顯然無法直接進行疊加。
不要着急,北京西站在4326坐标系中坐标其實就隐藏在我們的查詢結果中。
在geometry中顯示的就是動态投影之後的坐标。下面我們根據這個坐标添加一個矢量要素來看看效果。
代碼範例如下:http://download.csdn.net/download/supermapsupport/9615553