map-data.js 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. import JMap from 'JMap'
  2. import JMapQuery from 'JMapQuery'
  3. export default {
  4. data() {
  5. return {
  6. map: null,
  7. mapPolList: [],
  8. colorList: [
  9. ['#99e', "#F33"],
  10. ['#ee6', "#c38"],
  11. ['#c38', "#F33"],
  12. ['#6E7', '#F33'],
  13. ['#6A7', "#F33"],
  14. ['#EF7', "#F33"],
  15. ['#AF7', "#F33"],
  16. ['#BAC', "#F33"],
  17. ['#BEF', "#F33"],
  18. ['#BBB', "#F33"],
  19. ['#EFA', "#F33"],
  20. ['#FE6', "#F33"],
  21. ['#7F6', "#F33"],
  22. ['#7dc', "#F33"],
  23. ],
  24. colorIndList: [-1, 7, 21, 26, 31, 37, 46, 52, 57, 66, 68, 71, 74, 100],
  25. oldPopup: null,
  26. oldPopupId: null,
  27. }
  28. },
  29. computed: {
  30. mapWidth: function() {
  31. //这里的this指向的是当前的vue实例
  32. return this.$refs.mapF.$el.offsetWidth / 2 + 'px'
  33. },
  34. mapHeight: function() {
  35. //这里的this指向的是当前的vue实例
  36. return this.$refs.mapF.$el.offsetHeight / 2 - 40 + 'px'
  37. }
  38. },
  39. mounted() {
  40. window.vue = this;
  41. window.jMap = null;
  42. window.jmapQuery = null;
  43. },
  44. methods: {
  45. async initMap() {
  46. window.vue = this;
  47. window.jMap = null;
  48. window.jmapQuery = null;
  49. window.jMap = new JMap();
  50. var map_params = {
  51. camera: {
  52. x: 121.4175597,
  53. y: 31.1192480,
  54. radius: 18000.0,
  55. offset: { heading: -4, pitch: -70, range: 0 }
  56. },
  57. map_complete_callback: () => {
  58. window.jmapQuery = new JMapQuery(window.jMap);
  59. // ToDo...
  60. },
  61. map_left_click_callback: (obj, type, movement) => {
  62. },
  63. map_right_click_callback: (obj) => {
  64. },
  65. };
  66. let res = await this.$axios.get("/atlas/encrypt")
  67. // 加载地图
  68. window.jMap.createMap("mapF", res.data, window.location.origin, map_params, {});
  69. // 地图样式
  70. window.jMap.switchBaseLayer('light')
  71. // 增加街镇边界
  72. let options = {
  73. click: (val) => {
  74. console.log(val)
  75. },
  76. isZoom: false,
  77. style: {
  78. outline: true,
  79. outlineColor: 'red',
  80. // material:'rgb(0,0,0)',
  81. // perPostionHeight: false,
  82. height: 5,
  83. width: 5,
  84. label: {
  85. show: true,
  86. text: '',
  87. font: '16px Helvetica',
  88. fillColor: 'blue',
  89. pixelOffset: [0, -20],
  90. backgroundColor: 'rgb(0,0,0)',
  91. showBackground: false
  92. }
  93. },
  94. // where:"name != '江川路街道'"
  95. }
  96. window.jMap.addLayer('mh_dyn_district', [1], options)
  97. // 街镇标题
  98. var qp = new JMapQueryParam({
  99. queryMapService: 'mh_dyn_district',
  100. queryMapLayers: [1],
  101. outFields: ['code', 'name', 'center_x', 'center_y'],
  102. callBack: (res) => {
  103. res.features.forEach(async val => {
  104. await window.jMap.FlagInfo.show({
  105. id: val.attributes.code,
  106. position: { x: Number(val.attributes.center_x), y: Number(val.attributes.center_y), z: 0 },
  107. element: `<div class='ysc-dynamic-layer ys-css3-box' onclick="vue.clickFlag(${val.attributes.code})"><div class='biaozhu'>${val.attributes.name} ${val.attributes.code}</div></div>`
  108. }, { isZoom: false,})
  109. });
  110. }
  111. })
  112. new JMapQuery(window.jMap).execQuery(qp)
  113. },
  114. clickFlag(val) {
  115. console.log(val)
  116. },
  117. randomColor() {
  118. var color = "#";
  119. //for循环中,如果后面仅有一条语句,{}可省略不写
  120. //随机生成6位0-15之间的数字,再用toString(16)将数字转成16进制
  121. for (var i = 0; i < 6; i++) color += parseInt(Math.random() * 16).toString(16);
  122. return color;
  123. },
  124. deleteMarker(lnglats) {
  125. this.map.remove(lnglats);
  126. },
  127. // 创建标点和点击事件
  128. addMarker(lnglats, type) {
  129. let icon = ''
  130. let target = lnglats.map((val, ind) => {
  131. if (type === 'water') {
  132. icon = val.waterAdministrative === '单位' ? 'http://120.55.70.156/image/unitWater.png' : val.waterAdministrative === '市政' ? 'http://120.55.70.156/image/szWater.png' : val.waterAdministrative === '社区' || val.waterAdministrative === '居民' ? 'http://120.55.70.156/image/sqWater.png' : ''
  133. }
  134. let marker = {
  135. id: ind + 1,
  136. attributes: val.waterAdministrative,
  137. attrbutes: val,
  138. position: { x: val.gisX, y: val.gisY, z: 0 },
  139. // image: { url: icon,width:29.5,height:48.5 },
  140. };
  141. return marker
  142. })
  143. console.log(target)
  144. window.jMap.Locate.pointLocate(target, {
  145. isZoom: false,
  146. scaleByDistance: { minScaling: 0, maxScaling: 1, minDistance: 1000, maxDistance: 30000 },
  147. click: (val) => {
  148. this.elementInfo(val, type)
  149. }
  150. })
  151. },
  152. // 无经纬度创建标点和点击事件
  153. addMarkerAddress(lnglats) {
  154. let target = lnglats.map((val, ind) => {
  155. if (!val.addressId) {
  156. let addressInfo = window.jMap.queryMphInfo(val.address)[val.address][0]
  157. return {
  158. ...val,
  159. addressId: addressInfo.address_id, // 地址id
  160. province: addressInfo.province, // 市
  161. district: addressInfo.district, // 区
  162. sub_district: addressInfo.sub_district, // 街镇
  163. streetname: addressInfo.streetname, // 路
  164. address: addressInfo.address, // 户
  165. committee: addressInfo.committee, // 居委会
  166. }
  167. }
  168. })
  169. target = target.reduce((item, next) => {
  170. !item.some(val => val.addressId === next.addressId) && item.push(next)
  171. return item
  172. }, []);
  173. console.log(target)
  174. console.log(Math.floor(target.length / 100))
  175. for (let item = 0; item < Math.floor(target.length / 100); item++) {
  176. console.log(item)
  177. console.log(target.slice(item * 100, (item + 1) * 100).map(val => val.addressId).join())
  178. setTimeout(() => {
  179. window.jMap.locateMph(
  180. target.slice(item * 100, (item + 1) * 100).map(val => val.addressId).join(), {
  181. isZoom: false,
  182. scaleByDistance: { minScaling: 0, maxScaling: 1, minDistance: 1000, maxDistance: 30000 },
  183. click: (value) => {
  184. this.elementInfo(value, 'fire')
  185. }
  186. }
  187. )
  188. }, 0)
  189. }
  190. },
  191. leftBtnClick() {
  192. this.leftBtn = !this.leftBtn;
  193. },
  194. rightBtnClick() {
  195. this.rightBtn = !this.rightBtn
  196. },
  197. elementInfo(value, type) {
  198. let element = ''
  199. if (type === 'water') {
  200. element = `<div class="ysc-dynamic-layer ys-css3-box" onclick="vue.removePopup">
  201. <div class="tableTooltip mapTab">
  202. <div class="tableTitle">
  203. <div>${value.attrbutes.type}</div>
  204. </div>
  205. <el-row class="tableContent">
  206. <div class="max">水源位置:${value.attrbutes.address}</div>
  207. <div>电话:${value.attrbutes.phone}</div>
  208. <div class="max">支队名称:${value.attrbutes.detachmentName}</div>
  209. <div>管辖机构:${value.attrbutes.jurisdictionalAgency}</div>
  210. <div>水源类型:${value.attrbutes.type}</div>
  211. <div>取水形式:${value.attrbutes.getWaterType}</div>
  212. <div>水源性质:${value.attrbutes.waterAdministrative}</div>
  213. <div>状态:${value.attrbutes.status == 1 ?'可用':'不可用'}</div>
  214. <div>供水单位:${value.attrbutes.waterUnit}</div>
  215. </el-row>
  216. </div>
  217. </div>`
  218. } else if (type === 'fire') {
  219. element = `<div class="ysc-dynamic-layer ys-css3-box" onclick="vue.removePopup">
  220. <div class="tableTooltip mapTab">
  221. <div class="tableTitle">
  222. <div>${'单位及执法情况'}</div>
  223. </div>
  224. <el-row class="tableContent">
  225. <div>单位地址:${'XX路135弄'}</div>
  226. <div>法人:${'张三'}</div>
  227. <div>管理人:${'李四'}</div>
  228. <div>历史检查次数:<a>${'6次'}</a></div>
  229. <div class="divTitle">行政许可记录</div>
  230. <div>审核时间:${'2021-06-26'}</div>
  231. <div>验收时间:${'2021-06-26'}</div>
  232. <div>安检时间:${'2021-06-26'}</div>
  233. <div>历史隐患数:${'2处'}</div>
  234. <div class="divTitle">历史处罚情况</div>
  235. <div>历史火灾数:${'2'}</div>
  236. <div>单位自主管理情况:<a>点击查看</a></div>
  237. </el-row>
  238. </div>
  239. </div>`
  240. }
  241. this.addMarkerInfo(element, value)
  242. console.log(element)
  243. },
  244. // 标点点击弹窗
  245. addMarkerInfo(element, value, isBtn = false) {
  246. console.log(element, value)
  247. // window.jMap.Popup && window.jMap.Popup.hide([this.oldPopup && this.oldPopup.id]);
  248. if (this.oldPopup && value.id === this.oldPopup.id) {
  249. window.jMap.Popup.hide();
  250. return this.oldPopup = null
  251. }
  252. // console.log(value)
  253. window.jMap.Popup.show({
  254. id: value.id,
  255. // position: value.wgs84position, //使用自定义窗体
  256. position: { x: Number(value.wgs84position.x), y: Number(value.wgs84position.y), z: Number(value.wgs84position.z) }, //使用自定义窗体
  257. element: element,
  258. }, { isZoom: false, offset: [0, -40] });
  259. if (!isBtn) {
  260. window.jMap.goTo({
  261. x: Number(value.wgs84position.x),
  262. y: Number(value.wgs84position.y),
  263. radius: 1000
  264. }, {
  265. duration: 3,
  266. offset: {
  267. heading: -4,
  268. pitch: -70,
  269. range: 0
  270. }
  271. })
  272. window.jMap.Buffer.generate({
  273. geometry: [{ position: [{ x: Number(value.wgs84position.x), y: Number(value.wgs84position.y) }], type: 'point' }],
  274. distance: 1000
  275. }, {
  276. callBack: (el) => {
  277. console.log(el)
  278. for (const i in el) {
  279. var target = {
  280. id: i,
  281. position: CoordUtil.arrayToJson(el[i].rings[0])
  282. }
  283. }
  284. window.jMap.Locate.regionLocate(target, {
  285. style: {
  286. color: 'rgba(235, 98, 98, .1)',
  287. transparency: .3
  288. }
  289. })
  290. },
  291. })
  292. }
  293. this.oldPopup = value
  294. },
  295. removePopup(e) {
  296. console.log(e)
  297. },
  298. }
  299. }