偉景行 citymaker 從入門到精通(3)——點擊地圖獲取坐標,點擊模型獲取模型信息和屬性信息


在地圖上點擊要素查看要素信息,也就是identify功能

 


  • script部分
  1         // 通過枚舉索引獲取枚舉名稱
  2         function getEnumTextByIdx(enumObj, idx) {
  3             for (var item in enumObj) {
  4                 var itemValue = enumObj[item];
  5                 if (itemValue == idx) {
  6                     return item;
  7                 }
  8             }
  9         }
 10 
 11         // 通過fid獲取要素的字段屬性值
 12         function getAttrValueByFid(featureClassInfo, fid) {
 13             // 連接信息
 14             var connectionInfo = __g.new_ConnectionInfo;
 15             //從featureClassInfo獲取數據源的連接字符串,然后用此連接字符串進行連接
 16             connectionInfo.fromConnectionString(featureClassInfo.dataSourceConnectionString);
 17             // 數據源
 18             var dataSource = __g.dataSourceFactory.openDataSource(connectionInfo);
 19             // 數據集
 20             var dataSet = dataSource.openFeatureDataset(featureClassInfo.dataSetName);
 21             // 要素類
 22             var featureClass = dataSet.openFeatureClass(featureClassInfo.featureClassName);
 23             // 返回的字段屬性集合
 24             var attrValues = [];
 25             // 通過fid獲取行
 26             var rowBuffer = featureClass.getRow(fid);
 27             // 遍歷字段
 28             var fieldinfos = featureClass.getFields();
 29             for (var i = 0; i < fieldinfos.count; i++) {
 30                 var fieldinfo = fieldinfos.get(i);
 31                 if (null == fieldinfo)
 32                     continue;
 33                 // 字段各種屬性,字段值
 34                 var fieldName = fieldinfo.name;
 35                 var value = rowBuffer.getValue(i);
 36 
 37                 var fieldValue = {};
 38                 fieldValue.name = fieldName;
 39                 fieldValue.alias = fieldinfo.alias;
 40                 // 字段類型是個枚舉,分別獲取枚舉索引和值名稱
 41                 fieldValue.typeIdx = fieldinfo.fieldType;
 42                 fieldValue.type = getEnumTextByIdx(gviFieldType, fieldinfo.fieldType);
 43                 fieldValue.value = value;
 44 
 45                 attrValues.push(fieldValue);
 46             }
 47 
 48             // 釋放對象
 49             rowBuffer.releaseObject();
 50             featureClass.releaseObject();
 51             dataSet.releaseObject();
 52             dataSource.releaseObject();
 53 
 54             return attrValues;
 55         }
 56 
 57         //鼠標選擇事件
 58         function onMouseClickSelect(pickResult, intersectPoint, mask, eventSender) {
 59             // 點擊地圖的點
 60             if (intersectPoint) {
 61                 // 點坐標
 62                 var x = intersectPoint.x;
 63                 var y = intersectPoint.y;
 64                 var z = intersectPoint.z;
 65 
 66                 alert("x:" + x + " y:" + y + " z:" + z);
 67             }
 68 
 69             // 選中的對象
 70             if (pickResult) {
 71                 // 對象類型是FeatureLayer(矢量圖層),也就是模型,因為模型都是通過矢量圖層加載的
 72                 if (pickResult.type == gviObjectType.gviObjectFeatureLayer) {
 73                     // 唯一id
 74                     var fid = pickResult.featureId;
 75                     // 圖層
 76                     var featureLayer = pickResult.featureLayer;
 77                     // 圖層名
 78                     var featureLayerName = featureLayer.name;
 79                     // featureClass信息(不是真正的FeatureClass對象)
 80                     var featureClassInfo = featureLayer.featureClassInfo;
 81                     // featureClass名稱
 82                     var featureClassname = featureClassInfo.featureClassName;
 83 
 84                     // 點擊要素的字段的屬性(字段名,別名,類型。。。)以及字段值
 85                     // PS:獲取字段屬性和值需要連接數據源,不是必須的話就不要獲取了
 86                     var attrValues = getAttrValueByFid(featureClassInfo, fid);
 87 
 88                     var msg = "";
 89 
 90                     //遍歷字段
 91                     for (var i = 0; i < attrValues.length; i++) {
 92                         var attrValue = attrValues[i];
 93 
 94                         //字段名
 95                         var fieldName = attrValue.name;
 96                         //字段別名
 97                         var alias = attrValue.alias;
 98                         // 字段類型枚舉索引
 99                         var typeIdx = attrValue.typeIdx;
100                         //字段類型枚舉名稱
101                         var type = attrValue.type;
102                         //字段值
103                         var value = attrValue.value;
104 
105                         msg += "字段名:" + fieldName + ";" + "字段別名:" + alias + ";" + "字段類型枚舉索引:" + typeIdx + ";" + "字段類型枚舉名稱:" + type + ";" + "字段值:" + value + "\n";
106                     }
107 
108                     alert(msg);
109                 }
110             }
111         }
112 
113         $(function ($) {
114             // 初始化三維控件
115             initAxControl();
116             //cep文件路徑,本地路徑也行
117             var cepPath = "http://192.168.15.53:32555/default.cep";
118             //打開cep
119             __g.project.open(cepPath, false, "");
120 
121             // 鼠標拾取模式(此模式下可進行鼠標拾取操作)
122             __g.interactMode = gviInteractMode.gviInteractSelect;
123 
124             //mouseSelectObjectMask影響點擊什么類型對象會觸發onmouseclickselect事件
125 
126             // 鼠標拾取的時候需要過濾的對象類型:地形
127             //__g.mouseSelectObjectMask = gviMouseSelectObjectMask.gviSelectTerrain;
128             // 鼠標拾取的時候需要過濾的對象類型:矢量圖層
129             //__g.mouseSelectObjectMask = gviMouseSelectObjectMask.gviSelectFeatureLayer;
130             // 鼠標拾取的時候需要過濾的對象類型:全部
131             __g.mouseSelectObjectMask = gviMouseSelectObjectMask.gviSelectAll;
132 
133             //綁定鼠標選擇事件
134             __g.onmouseclickselect = onMouseClickSelect;
135         });


其中mouseSelectObjectMask控制點擊什么類型對象會觸發onmouseclickselect事件,值為gviSelectTerrain就是點擊地形才觸發onmouseclickselect,gviSelectFeatureLayer是點擊矢量圖層加載的要素才觸發,gviSelectAll就是所有類型都觸發

 

以上代碼下載

鏈接:http://pan.baidu.com/s/1miRLHjU 密碼:w2gp

 


全系列鏈接:

偉景行 citymaker 從入門到精通系列 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM