raster.js 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475
  1. /**
  2. * [ONEMAP.M.projectController]
  3. * @return {[object]}
  4. */
  5. define([
  6. 'html!templates/menu/cartodbInfo',
  7. 'css!styles/menu/cartodbInfo',
  8. ], function (dialogLayout) {
  9. /**
  10. * 初始化并订阅事件
  11. * @return {[type]} [description]
  12. */
  13. /**
  14. * 模块数据 用于数据存储和外部调用
  15. * @type {Object}
  16. * 数据存放
  17. */
  18. var modValue = {
  19. RASTER: {},
  20. cancelSelected: null,
  21. handler: null
  22. }
  23. function prototypeBind() {
  24. //1.0GLTG插件
  25. var fixGltf = function (gltf) {
  26. if (!gltf.extensionsUsed) {
  27. return;
  28. }
  29. var v = gltf.extensionsUsed.indexOf('KHR_technique_webgl');
  30. var t = gltf.extensionsRequired.indexOf('KHR_technique_webgl');
  31. // 中招了。。
  32. if (v !== -1) {
  33. gltf.extensionsRequired.splice(t, 1, 'KHR_techniques_webgl');
  34. gltf.extensionsUsed.splice(v, 1, 'KHR_techniques_webgl');
  35. gltf.extensions = gltf.extensions || {};
  36. gltf.extensions['KHR_techniques_webgl'] = {};
  37. gltf.extensions['KHR_techniques_webgl'].programs = gltf.programs;
  38. gltf.extensions['KHR_techniques_webgl'].shaders = gltf.shaders;
  39. gltf.extensions['KHR_techniques_webgl'].techniques = gltf.techniques;
  40. var techniques = gltf.extensions['KHR_techniques_webgl'].techniques;
  41. gltf.materials.forEach(function (mat, index) {
  42. gltf.materials[index].extensions['KHR_technique_webgl'].values = gltf.materials[index].values;
  43. gltf.materials[index].extensions['KHR_techniques_webgl'] = gltf.materials[index].extensions['KHR_technique_webgl'];
  44. var vtxfMaterialExtension = gltf.materials[index].extensions['KHR_techniques_webgl'];
  45. for (var value in vtxfMaterialExtension.values) {
  46. var us = techniques[vtxfMaterialExtension.technique].uniforms;
  47. for (var key in us) {
  48. if (us[key] === value) {
  49. vtxfMaterialExtension.values[key] = vtxfMaterialExtension.values[value];
  50. delete vtxfMaterialExtension.values[value];
  51. break;
  52. }
  53. }
  54. };
  55. });
  56. techniques.forEach(function (t) {
  57. for (var attribute in t.attributes) {
  58. var name = t.attributes[attribute];
  59. t.attributes[attribute] = t.parameters[name];
  60. };
  61. for (var uniform in t.uniforms) {
  62. var name = t.uniforms[uniform];
  63. t.uniforms[uniform] = t.parameters[name];
  64. };
  65. });
  66. }
  67. }
  68. Object.defineProperties(Cesium.Model.prototype, {
  69. _cachedGltf: {
  70. set: function (value) {
  71. this._vtxf_cachedGltf = value;
  72. if (this._vtxf_cachedGltf && this._vtxf_cachedGltf._gltf) {
  73. fixGltf(this._vtxf_cachedGltf._gltf);
  74. }
  75. },
  76. get: function () {
  77. return this._vtxf_cachedGltf;
  78. }
  79. }
  80. });
  81. }
  82. async function add(item, cancelSelected) {
  83. modValue.cancelSelected = cancelSelected
  84. // if (ONEMAP.M.myLayers.checkLength() >= map23DConfig.layerMaxLength) {
  85. // ONEMAP.C.publisher.publish({ type: 'warning', message: '图层数量已达上限' }, 'noteBar::add');
  86. // modValue.cancelSelected(item.id)
  87. // return;
  88. // }
  89. var modelData = {
  90. "category": "倾斜摄影",
  91. "info": "",
  92. "type": "raster",
  93. "name": item.title,
  94. "item": item,
  95. "layerInfo": item
  96. }
  97. var guid = null
  98. var options = {};
  99. guid = await add3DRASTER(modelData);
  100. options = {
  101. action: "add",
  102. DOM: {
  103. guid: guid,
  104. type: "RASTER",
  105. name: item.title,
  106. },
  107. mod: "RASTER"
  108. }
  109. if (!guid) return
  110. ONEMAP.M.myLayers.myLayerControl(options); // 添加信息到“我的图层”
  111. ONEMAP.C.publisher.subscribe(layerAction, guid);
  112. }
  113. function remove(options) {
  114. var guid = options.guid ? options.guid : "RASTER--" + options.id;
  115. removeRASTER(guid)
  116. modValue.cancelSelected(guid);
  117. ONEMAP.M.myLayers.myLayerControl({
  118. action: "remove",
  119. DOMid: guid
  120. }); // 移除数据层
  121. closeEntityPropertiesDialog();
  122. }
  123. function layerAction(options) {
  124. if (options.guid.split("--")[0] == "RASTER") {
  125. if (options.action == "remove") {
  126. // removeRASTER(options.guid)
  127. remove(options)
  128. modValue.cancelSelected(options.guid.split("--")[1]);
  129. } else if (options.action == "opacity") {
  130. opacityRASTER(options)
  131. } else if (options.action == "controlShow") {
  132. controlShowRASTER(options)
  133. } else if (options.action == "up" || options.action == "down") {
  134. } else if (options.action == "location") {
  135. locationVECTOR(options)
  136. }
  137. }
  138. }
  139. /**
  140. * 加载/移除倾斜摄影
  141. * @return {[type]} [description]
  142. */
  143. function add3DRASTER(options) {
  144. return new Promise((resolve, reject) => {
  145. // 0 arcgis_server
  146. // 6 json
  147. // 1 xyz
  148. // 2 arcgis-vectortile
  149. // 3 arcgis-tile
  150. // 4 tdt
  151. // 7 cartodb
  152. // 8 arcgis-dynamic
  153. // 9 wms
  154. // 5 3dtiles
  155. var guid = 'RASTER--' + options.layerInfo.id
  156. var items = options.item;
  157. addMapClickEvent();
  158. var layerObj = null
  159. if (items.c_tile_server_type == "1") {
  160. // xyz
  161. layerObj = new Cesium.UrlTemplateImageryProvider({
  162. url: items.c_url,
  163. })
  164. var layer = map3DViewer.map.imageryLayers.addImageryProvider(layerObj);
  165. // var bbox = JSON.parse(items.c_bbox)
  166. // var extentR = turf.bbox(bbox);
  167. // Cesium.Rectangle.fromDegrees(extentR[0], extentR[1], extentR[2], extentR[3])
  168. // // 二维地图定位异常
  169. // map3DViewer.map.camera.flyTo({
  170. // destination: Cesium.Rectangle.fromDegrees(extentR[0], extentR[1], extentR[2], extentR[3]),
  171. // });
  172. modValue.RASTER[guid] = layer
  173. // modValue.RASTER[guid + "_extent"] = extentR
  174. resolve(guid);
  175. } else if (items.c_tile_server_type == "2") {
  176. // arcgis-vectortile
  177. } else if (items.c_tile_server_type == "3") {
  178. // arcgis-tile
  179. layerObj = new Cesium.CGCS2000ArcGisMapServerImageryProvider({
  180. url: items.c_url,
  181. })
  182. var layer = map3DViewer.map.imageryLayers.addImageryProvider(layerObj);
  183. // var bbox = JSON.parse(items.c_bbox)
  184. // var extentR = turf.bbox(bbox);
  185. // Cesium.Rectangle.fromDegrees(extentR[0], extentR[1], extentR[2], extentR[3])
  186. // // 二维地图定位异常
  187. // map3DViewer.map.camera.flyTo({
  188. // destination: Cesium.Rectangle.fromDegrees(extentR[0], extentR[1], extentR[2], extentR[3]),
  189. // });
  190. modValue.RASTER[guid] = layer
  191. // modValue.RASTER[guid + "_extent"] = extentR
  192. resolve(guid);
  193. } else if (items.c_tile_server_type == "4") {
  194. // tdt
  195. layerObj = new Cesium.WebMapTileServiceImageryProvider({
  196. url: items.c_url + "&SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE=default&FORMAT=tiles&TILEMATRIX={TileMatrix}&TILEROW={TileRow}&TILECOL={TileCol}"
  197. });
  198. var layer = map3DViewer.map.imageryLayers.addImageryProvider(layerObj);
  199. // var bbox = JSON.parse(items.c_bbox)
  200. // var extentR = turf.bbox(bbox);
  201. // Cesium.Rectangle.fromDegrees(extentR[0], extentR[1], extentR[2], extentR[3])
  202. // // 二维地图定位异常
  203. // map3DViewer.map.camera.flyTo({
  204. // destination: Cesium.Rectangle.fromDegrees(extentR[0], extentR[1], extentR[2], extentR[3]),
  205. // });
  206. modValue.RASTER[guid] = layer
  207. // modValue.RASTER[guid + "_extent"] = extentR
  208. resolve(guid);
  209. } else if (items.c_tile_server_type == "7") {
  210. // cartodb
  211. let note = JSON.parse(items.c_note);
  212. let temId = note.id.replace(/-/g, '_')
  213. fetch('http://121.43.55.7:3000/user/dev/api/v1/map/named/tpl_' + temId, {
  214. method: "POST",
  215. headers: {
  216. "Content-Type": "application/json",
  217. },
  218. mode: "cors",
  219. }).then(resp => resp.json()).then(responses => {
  220. var url = 'http://121.43.55.7:3000/user/dev/api/v1/map/' + responses.layergroupid + '/{z}/{x}/{y}.png'
  221. let layerObj = new Cesium.UrlTemplateImageryProvider({
  222. url: url,
  223. });
  224. var layer = map3DViewer.map.imageryLayers.addImageryProvider(layerObj);
  225. layer.layerType = "cartodb"
  226. layer.layerData = options.item
  227. // var bbox = JSON.parse(items.c_bbox)
  228. // var extentR = turf.bbox(bbox);
  229. // Cesium.Rectangle.fromDegrees(extentR[0], extentR[1], extentR[2], extentR[3])
  230. // // 二维地图定位异常
  231. // map3DViewer.map.camera.flyTo({
  232. // destination: Cesium.Rectangle.fromDegrees(extentR[0], extentR[1], extentR[2], extentR[3]),
  233. // });
  234. modValue.RASTER[guid] = layer
  235. // modValue.RASTER[guid + "_extent"] = extentR
  236. resolve(guid);
  237. })
  238. } else if (items.c_tile_server_type == "8") {
  239. // arcgis-dynamic
  240. } else if (items.c_tile_server_type == "9") {
  241. // wms
  242. let note = JSON.parse(items.c_note);
  243. if (items.c_epsg == "EPSG:sh2000"){
  244. layerObj = new Cesium.WebMapServiceImageryProvider({
  245. url: items.c_url,
  246. layers: note.layers,
  247. parameters: {
  248. TRANSPARENT: true,
  249. format: note.format,
  250. },
  251. tilingScheme:new Cesium.SHmapMercatorTilingScheme()
  252. });
  253. }else{
  254. layerObj = new Cesium.WebMapServiceImageryProvider({
  255. url: items.c_url,
  256. layers: note.layers,
  257. parameters: {
  258. TRANSPARENT: true,
  259. format: note.format,
  260. },
  261. });
  262. }
  263. // if (items.c_epsg == "EPSG:sh2000")
  264. // layerObj.
  265. var layer = map3DViewer.map.imageryLayers.addImageryProvider(layerObj);
  266. // var bbox = JSON.parse(items.c_bbox)
  267. // var extentR = turf.bbox(bbox);
  268. // Cesium.Rectangle.fromDegrees(extentR[0], extentR[1], extentR[2], extentR[3])
  269. // // 二维地图定位异常
  270. // map3DViewer.map.camera.flyTo({
  271. // destination: Cesium.Rectangle.fromDegrees(extentR[0], extentR[1], extentR[2], extentR[3]),
  272. // });
  273. modValue.RASTER[guid] = layer
  274. // modValue.RASTER[guid + "_extent"] = extentR
  275. resolve(guid);
  276. }
  277. // var layer = map3DViewer.map.imageryLayers.addImageryProvider(layerObj);
  278. // // var bbox = JSON.parse(items.c_bbox)
  279. // // var extentR = turf.bbox(bbox);
  280. // // Cesium.Rectangle.fromDegrees(extentR[0], extentR[1], extentR[2], extentR[3])
  281. // // // 二维地图定位异常
  282. // // map3DViewer.map.camera.flyTo({
  283. // // destination: Cesium.Rectangle.fromDegrees(extentR[0], extentR[1], extentR[2], extentR[3]),
  284. // // });
  285. // modValue.RASTER[guid] = layer
  286. // // modValue.RASTER[guid + "_extent"] = extentR
  287. // resolve(guid);
  288. })
  289. };
  290. function addMapClickEvent() {
  291. if (modValue.handler != null) return;
  292. modValue.handler = new Cesium.ScreenSpaceEventHandler(map3DViewer.map.canvas);
  293. // 监听鼠标点击事件
  294. modValue.handler.setInputAction(function (click) {
  295. if (ONEMAP.M.toolsBar.status.toolsShow) return;
  296. let cartesian = map3DViewer.map.scene.globe.pick(map3DViewer.map.camera.getPickRay(click.position), map3DViewer.map.scene);
  297. if (Cesium.defined(cartesian)) {
  298. // 将笛卡尔坐标转换为经纬度坐标
  299. var cartographic = Cesium.Cartographic.fromCartesian(cartesian);
  300. var longitude = Cesium.Math.toDegrees(cartographic.longitude)
  301. var latitude = Cesium.Math.toDegrees(cartographic.latitude)
  302. // for (const key in modValue.RASTER) {
  303. // if (Object.hasOwnProperty.call(modValue.RASTER, key)) {
  304. // const layer = modValue.RASTER[key];
  305. // if (layer.imageryProvider._resource.url.indexOf("user/dev") >= 0) {
  306. // if(layer.alpha != 0 && layer.show){
  307. // }
  308. // }
  309. // }
  310. // }
  311. let pickRay = map3DViewer.map.camera.getPickRay(click.position);
  312. let pickLayer = map3DViewer.map.imageryLayers.pickImageryLayers(pickRay, map3DViewer.map.scene)
  313. let layers = []
  314. for (let i = 0; i < pickLayer.length; i++) {
  315. const layer = pickLayer[i];
  316. if (layer.alpha != 0 && layer.show && layer.layerType != undefined) {
  317. if (layer.layerType == "cartodb") {
  318. layers.push(layer)
  319. }
  320. }
  321. }
  322. createCartodb(layers, longitude, latitude, function (resultArr) {
  323. console.log(resultArr);
  324. // 判断数据 展示弹窗
  325. for (let i = 0; i < resultArr.length; i++) {
  326. const layer = resultArr[i];
  327. if (layer.length > 0) {
  328. // 构建弹窗
  329. openEntityPropertiesDialog(layer[0]);
  330. break;
  331. } else {
  332. // 无数据
  333. }
  334. }
  335. });
  336. }
  337. }, Cesium.ScreenSpaceEventType.LEFT_CLICK);
  338. }
  339. function openEntityPropertiesDialog(properties) {
  340. if ($("#cartodbInfoModal").length != 1) {
  341. $('body').append(dialogLayout);
  342. //拖拽
  343. $("#cartodbInfoModal .popup-ct").dragmove($('#cartodbInfoModal'));
  344. } else {
  345. $("#cartodbInfoForm table").empty();
  346. }
  347. $("#cartodbInfoModal .title").text(properties.Name)
  348. let html = `<tr><td><p>字段</p></td><td>值</td></tr>`
  349. $("#cartodbInfoForm table").append(html)
  350. Object.getOwnPropertyNames(properties).map(function (field) {
  351. if (field != "the_geom" && field != "the_geom_webmercator") {
  352. let html = `<tr><td><p>${field}</p></td><td>${properties[field]}</td></tr>`
  353. $("#cartodbInfoForm table").append(html)
  354. }
  355. })
  356. $("#cartodbInfoModal .close").bind('click', function () {
  357. closeEntityPropertiesDialog();
  358. });
  359. }
  360. function closeEntityPropertiesDialog() {
  361. $("#cartodbInfoModal").remove()
  362. }
  363. function createCartodb(layerArr, lon, lat, callback) {
  364. tt(layerArr, lon, lat, 0, [])
  365. function tt(layerArr, lon, lat, index, info) {
  366. if (layerArr.length <= 0) return;
  367. let layer = JSON.parse(layerArr[index].layerData.c_note);
  368. tableSearch(layer, layer.tables, lon, lat, 0, [], function (result) {
  369. info.push(result);
  370. if (layerArr.length > index + 1) {
  371. data = []
  372. tt(layerArr, lon, lat, index + 1, info, callback)
  373. } else {
  374. callback(info);
  375. }
  376. })
  377. }
  378. }
  379. function tableSearch(layer, table, lon, lat, index, data, callback) {
  380. let sql = "";
  381. switch (layer.type) {
  382. case "Point":
  383. sql = "select *, ST_Distance(ST_Transform(t.the_geom, 3857), ST_Transform('SRID=4326;POINT(" + lon + " " + lat + ")'::geometry, 3857)) as distance from " + table[index].name + " t where ST_Distance(ST_Transform(t.the_geom, 3857), ST_Transform('SRID=4326;POINT(" + lon + " " + lat + ")'::geometry, 3857)) < 1000 ORDER BY distance ASC LIMIT 1;"
  384. console.log(sql)
  385. break;
  386. case "Polyline":
  387. break;
  388. case "Polygon":
  389. // "select * , st_asgeojson(the_geom) as geom, st_asgeojson(st_centroid(the_geom)) as center from "
  390. sql = "select * from " + table[index].name + " where ST_Within(st_geomfromtext('point(" + lon + " " + lat + ")',4326),the_geom)"
  391. break;
  392. }
  393. $.ajax({
  394. url: "http://121.43.55.7:3000/user/dev/api/v2/sql",
  395. type: 'GET',
  396. async: false, // 当设置为Ture时,Ajax异步执行。
  397. dataType: 'jsonp',
  398. data: { q: sql },
  399. }).done(function (responses) {
  400. if (responses.rows.length != 0) {
  401. data.push(responses.rows[0])
  402. }
  403. if (table.length > index + 1) {
  404. tableSearch(layer, table, lon, lat, index + 1, data, callback)
  405. } else {
  406. callback(data);
  407. }
  408. }).fail(function () {
  409. });
  410. }
  411. function removeMapClickEvent() {
  412. if (modValue.handler) {
  413. modValue.handler.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
  414. modValue.handler = null;
  415. }
  416. }
  417. function removeRASTER(guid) {
  418. map3DViewer.map.imageryLayers.remove(modValue.RASTER[guid]);
  419. delete modValue.RASTER[guid];
  420. if (Object.getOwnPropertyNames(modValue.RASTER).length == 0)
  421. removeMapClickEvent();
  422. }
  423. function opacityRASTER(options) {
  424. modValue.RASTER[options.guid].alpha = options.options.opacity;
  425. }
  426. function controlShowRASTER(options) {
  427. if (options.options.show)
  428. modValue.RASTER[options.guid].show = true
  429. if (!options.options.show)
  430. modValue.RASTER[options.guid].show = false
  431. }
  432. function locationVECTOR(options) {
  433. let extentR = modValue.RASTER[options.guid + "_extent"]
  434. map3DViewer.map.camera.flyTo({
  435. destination: Cesium.Rectangle.fromDegrees(extentR[0], extentR[1], extentR[2], extentR[3]),
  436. });
  437. }
  438. return ONEMAP.M.Raster = {
  439. add: add,
  440. remove: remove,
  441. }
  442. });