簡單說一下基於Skyline的在Web程序中怎麼實現查詢吧
Skyline主要是爲程序提供地圖服務,一般我們會在遙感或者三維地形圖上疊加一些面狀或者點的屬性,如房屋或者區域範圍的劃分信息等等。往往程序中都需要對滿足一定條件的對象進行高亮顯示,或者讓地圖聚焦到那裏。這時候其實只需要去遍歷已加載的對象,找出滿足條件的即可。
程序如下:
//遍歷指定圖層
function TraverseLayer(layerName)
{
//IInformationTree是地圖的圖層列表
//layerName是要查詢的圖層名稱,如地圖上疊加了一個叫"旅遊區.shp"的圖層,那麼layerName就是"旅遊區.shp"
// itemId是對應的圖層編號,Skyline裏對每一個對象都有一個ID號,獲得該ID號就可以對對象進行一系列操作
var itemId = IInformationTree.FindItem(layerName);
//獲取該圖層下的第一個子節點
//GetNextItem的第二個參數11,表示取子節點
var childId=IInformationTree.GetNextItem(itemId,11);
//遍歷所有子節點
while(childId!=0)
{
//根據Id獲取對象
var oChild=IInformationTree.GetObject(childId);
//獲取該對象的所有屬性值,是以XML的形式返回的,如<村名>XXX</村名><面積>56</面積>......
var xml=oChild.ClientData;
// 從返回的屬性值語句中,提取需要的屬性
var name1=GetValueFromXml(xml,"村名");
//獲取下一結點
childId=IInformationTree.GetNextItem(childId,13);
}
}
通過這個函數,可以在遍歷的過程中,查詢滿足條件的對象。
當要遍歷的對象比較少的時候,很方便。但是一旦對象多了,遍歷起來速度就很慢。
比如說,我們現在要對一個土地利用類型的圖層進行查詢。該圖層爲SHP類型,由很多PolyGon組成,大概有幾萬條數據。每個Polygon對象,又具有名字、土地類型、面積等屬性。查詢的時候,需要查出滿足條件的對象高亮顯示,同時又產生一個面積等數據的統計表格。採用上面的方法大概要用幾分鐘才能完成,這樣的速度肯定是不行的。
另一種方法,是將圖層的對象屬性值,全都拷到SQLserver裏去,需要查詢對象的時候,將請求發送給服務器,由後臺來處理,返回所需的數據。
而對於對象的高亮顯示,則採用Skyline的對於圖層對象的SetValue方法。這種方法相比起來速度就快得多了
//高亮指定圖層的部分對象
function HighLightObj()
{
//獲取圖層
var itemId = IInformationTree.FindItem("2010年.shp");
var classStr = "<Classification FuncType=\"0\"><Class>" +
"<Condition><(\"[村名]\"=\"金魚橋\" Or \"[村名]\"=\"沈家橋\") And\"[土地類型]\"=\"居民點\" ></Condition>" +
"<Value>4080ff</Value>" +
"</Class>" + "<DefaultValue>ffffff</DefaultValue>" +
"</Classification>";
IInformationTree.GetLayer(itemId).SetFeature();
IInformationTree.GetLayer(itemId).SetValue("Line Color",1,classStr);
}