简单说一下基于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); }