mapTwo.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. <template>
  2. <div style="width: 680px">
  3. <div ref="charts" style="width: 100%;height: 920px;margin-top: -80px"></div>
  4. <img
  5. id="mapBackground"
  6. src="@/assets/images/main/map_bg.jpg"
  7. alt=""
  8. style="display: none"
  9. />
  10. <img
  11. v-if="showBack"
  12. @click="beBack"
  13. src="@/assets/images/main/back.png"
  14. style="width: 34px;height: 30px;cursor: pointer;position: absolute;right: 50px;bottom: 80px;"
  15. />
  16. </div>
  17. </template>
  18. <script>
  19. import * as echarts from "echarts";
  20. import shanxi from "./shanxi.json"
  21. import 大同市 from '@/views/screen/map/大同市.json'
  22. import 朔州市 from '@/views/screen/map/朔州市.json'
  23. import 忻州市 from '@/views/screen/map/忻州市.json'
  24. import 吕梁市 from '@/views/screen/map/吕梁市.json'
  25. import 太原市 from '@/views/screen/map/太原市.json'
  26. import 阳泉市 from '@/views/screen/map/阳泉市.json'
  27. import 晋中市 from '@/views/screen/map/晋中市.json'
  28. import 临汾市 from '@/views/screen/map/临汾市.json'
  29. import 长治市 from '@/views/screen/map/长治市.json'
  30. import 运城市 from '@/views/screen/map/运城市.json'
  31. import 晋城市 from '@/views/screen/map/晋城市.json'
  32. let imgElement
  33. export default {
  34. props: {
  35. mapData: Array
  36. },
  37. data() {
  38. return {
  39. appOrg: "10001",
  40. showBack: false,
  41. dataSource: {
  42. 大同市: 大同市,
  43. 朔州市: 朔州市,
  44. 忻州市: 忻州市,
  45. 吕梁市: 吕梁市,
  46. 太原市: 太原市,
  47. 阳泉市: 阳泉市,
  48. 晋中市: 晋中市,
  49. 临汾市: 临汾市,
  50. 长治市: 长治市,
  51. 运城市: 运城市,
  52. 晋城市: 晋城市,
  53. },
  54. points:[
  55. { name: "太原市", coordinate: [111.9393, 38.0070], appOrg: "1A003", x: "0", y: "2" },
  56. { name: "大同市", coordinate: [113.72499, 39.904541], appOrg: "1B001", x: "0", y: "2" },
  57. { name: "阳泉市", coordinate: [113.505474, 38.064652], appOrg: "1C001", x: "0", y: "2" },
  58. { name: "长治市", coordinate: [113.121277, 36.478022], appOrg: "1D001", x: "0", y: "2" },
  59. { name: "晋城市", coordinate: [112.783186, 35.610944], appOrg: "1E001", x: "0", y: "2" },
  60. { name: "朔州市", coordinate: [112.388197, 39.579375], appOrg: "1F001", x: "0", y: "2" },
  61. { name: "晋中市", coordinate: [113.259398, 37.329161], appOrg: "1K001", x: "0", y: "2" },
  62. { name: "临汾市", coordinate: [111.491988, 36.228828], appOrg: "1L001", x: "0", y: "2" },
  63. { name: "忻州市", coordinate: [112.664867, 38.685126], appOrg: "1H001", x: "0", y: "2" },
  64. { name: "运城市", coordinate: [110.920718, 35.188073], appOrg: "1M001", x: "0", y: "2" },
  65. { name: "吕梁市", coordinate: [111.268548, 37.684104], appOrg: "1J001", x: "0", y: "2" }
  66. ]
  67. }
  68. },
  69. created () {},
  70. mounted() {},
  71. methods: {
  72. start(){
  73. this.$nextTick(() => {
  74. if (this.mapData.length > 0){
  75. let i = 0
  76. for (let it of this.points){
  77. it.x = this.mapData[i]
  78. i++
  79. }
  80. }
  81. imgElement = document.getElementById("mapBackground");
  82. setTimeout(() => {
  83. this.initCharts();
  84. }, 500);
  85. });
  86. },
  87. initCharts() {
  88. const area = [
  89. { name: "太原市", appOrg: "1A003" },
  90. { name: "大同市", appOrg: "1B001" },
  91. { name: "阳泉市", appOrg: "1C001" },
  92. { name: "长治市", appOrg: "1D001" },
  93. { name: "晋城市", appOrg: "1E001" },
  94. { name: "朔州市", appOrg: "1F001" },
  95. { name: "晋中市", appOrg: "1K001" },
  96. { name: "临汾市", appOrg: "1L001" },
  97. { name: "忻州市", appOrg: "1H001" },
  98. { name: "运城市", appOrg: "1M001" },
  99. { name: "吕梁市", appOrg: "1J001" }
  100. ];
  101. const charts = echarts.init(this.$refs["charts"]);
  102. const option = {
  103. // 设置背景颜色,"transparent" 表示透明背景
  104. backgroundColor: "transparent",
  105. // 提示浮窗(Tooltip)配置
  106. tooltip: {
  107. show: true, // 是否显示 tooltip
  108. trigger: "item", // 触发类型,"item" 表示鼠标悬浮在图形上时触发
  109. formatter: `{b}`,
  110. backgroundColor: "rgba(5,13,21,0.25)", // 提示框背景颜色(半透明黑色)
  111. borderColor: "rgba(0, 0, 0, 0.16)", // 边框颜色
  112. triggerOn: "mousemove", // 鼠标移动时触发
  113. enterable: true, // 允许鼠标移动到 tooltip 内部(适用于可点击 tooltip)
  114. textStyle: {
  115. color: "#fff", // 文字颜色
  116. fontSize: 12, // 字体大小
  117. overflow: "break", // 文字超出时换行
  118. },
  119. padding: 3, // 提示框内边距
  120. },
  121. // 地理坐标系组件(用于地图绘制)
  122. geo: {
  123. map: "shanxi", // 使用 "shanxi" 地图
  124. zoom: 1.1, // 初始缩放比例(可调整地图大小)
  125. itemStyle: {
  126. borderColor: "#11F6F2", // 地图区域边界颜色
  127. borderWidth: 5, // 边界宽度
  128. shadowColor: "#0E7683", // 地图阴影颜色
  129. shadowBlur: 0, // 阴影模糊度
  130. shadowOffsetX: 5, // 阴影水平偏移
  131. shadowOffsetY: 13, // 阴影垂直偏移
  132. },
  133. layoutCenter: ["50%", "50%"], // 控制地图的中心位置
  134. },
  135. // 图表数据系列(series)
  136. series: [
  137. {
  138. type: "map", // 地图类型
  139. map: "shanxi", // 绑定的地图名称(与 `geo` 对应)
  140. zoom: 1.1, // 缩放级别
  141. itemStyle: {
  142. areaColor: { image: imgElement, repeat: "no-repeat" }, // 地图区域背景颜色(使用图片填充)
  143. borderColor: "#11F4F0", // 地图边界颜色
  144. borderWidth: 1, // 地图边界宽度
  145. },
  146. emphasis: {
  147. itemStyle: {
  148. areaColor: "#0D7481", // 鼠标悬浮时的区域颜色
  149. },
  150. },
  151. select: { disabled: true }, // 禁用地图的选中状态,防止点击后颜色锁定
  152. label: {
  153. show: true, // 显示区域名称
  154. color: "#FFF", // 文字颜色
  155. fontSize: 16, // 文字大小
  156. fontWeight: 600, // 字重
  157. emphasis: { color: "#fff" }, // 悬浮时的文字颜色
  158. },
  159. data: area
  160. },
  161. {
  162. type: "scatter", // 散点图(用于标注特殊位置)
  163. coordinateSystem: "geo", // 使用 `geo` 作为坐标系
  164. symbol: "image://" + require("@/assets/zhang/myMap/circle.png"), // 自定义标记(图片)
  165. symbolSize: [65, 65], // 标记大小(宽 30,高 20)
  166. label: {
  167. show: true, // 显示数字
  168. position: "inside", // 数字显示在图标的正上方
  169. color: "#fff", // 文字颜色(白色)
  170. fontSize: 18, // 字体大小
  171. fontWeight: "500", // 加粗
  172. // backgroundColor: "rgba(75,117,117,0.59)", // 文字背景色(可选)
  173. // borderColor: "rgba(56,236,250)", // 边框颜色
  174. // borderWidth: 1,
  175. // padding: [6, 7], // 文字内边距(可选)
  176. // borderRadius: 2, // 文字框圆角(可选)
  177. },
  178. data: this.points.map(({ name, coordinate, appOrg, x, y }) => ({
  179. name, // 点名称
  180. value: coordinate, // 经纬度坐标
  181. label: { formatter: `${x}` }, // 显示 `x` 数据(可换成 y)
  182. appOrg,
  183. x, // 额外数据(在建项目数)
  184. y, // 额外数据(施工项目数)
  185. })),
  186. },
  187. {
  188. type: "scatter", // 散点图(用于标注特殊位置)
  189. coordinateSystem: "geo", // 使用 `geo` 作为坐标系
  190. name: "center",
  191. symbol: "image://" + require("@/assets/zhang/myMap/building.png"),
  192. symbolSize: 40, // 标记的大小
  193. data: [{
  194. name: "山西省公司(本部)",
  195. value: [112.416448, 37.900045],
  196. appOrg: "10001"
  197. }]
  198. },
  199. ],
  200. };
  201. // 地图注册,第一个参数的名字必须和option.geo.map一致
  202. echarts.registerMap("shanxi",shanxi)
  203. charts.setOption(option);
  204. // 监听点击事件
  205. charts.on("click", (params) => {
  206. if (params.componentType === "geo") {
  207. // 点击的是地图区域
  208. console.log("Clicked map area: ", params.name);
  209. } else if (params.componentType === "series" && params.componentIndex < 2) {
  210. this.appOrg = params.data.appOrg
  211. this.$emit('transmit', this.appOrg)
  212. // 点击的是自定义图标(scatter)
  213. // 销毁当前图表实例
  214. // charts.dispose();
  215. // 重新初始化并设置新的配置项
  216. this.$nextTick(() => {
  217. // this.initChildren(params.name) // 重新初始化图表
  218. // this.initCharts();
  219. this.showBack = true
  220. });
  221. }else if(params.componentIndex === 2){
  222. this.$emit('changeCurCompany')
  223. }
  224. });
  225. },
  226. initChildren(cityName){
  227. const charts = echarts.init(this.$refs["charts"]);
  228. const option = {
  229. // 设置背景颜色,"transparent" 表示透明背景
  230. backgroundColor: "transparent",
  231. // 提示浮窗(Tooltip)配置
  232. tooltip: {
  233. show: true, // 是否显示 tooltip
  234. trigger: "item", // 触发类型,"item" 表示鼠标悬浮在图形上时触发
  235. formatter: `{b}`,
  236. backgroundColor: "rgba(5,13,21,0.25)", // 提示框背景颜色(半透明黑色)
  237. borderColor: "rgba(0, 0, 0, 0.16)", // 边框颜色
  238. triggerOn: "mousemove", // 鼠标移动时触发
  239. enterable: true, // 允许鼠标移动到 tooltip 内部(适用于可点击 tooltip)
  240. textStyle: {
  241. color: "#fff", // 文字颜色
  242. fontSize: 12, // 字体大小
  243. overflow: "break", // 文字超出时换行
  244. },
  245. padding: 3, // 提示框内边距
  246. },
  247. // 地理坐标系组件(用于地图绘制)
  248. geo: {
  249. map: "child", // 使用 "shanxi" 地图
  250. zoom: 1.1, // 初始缩放比例(可调整地图大小)
  251. itemStyle: {
  252. borderColor: "#11F6F2", // 地图区域边界颜色
  253. borderWidth: 5, // 边界宽度
  254. shadowColor: "#0E7683", // 地图阴影颜色
  255. shadowBlur: 0, // 阴影模糊度
  256. shadowOffsetX: 5, // 阴影水平偏移
  257. shadowOffsetY: 13, // 阴影垂直偏移
  258. },
  259. layoutCenter: ["50%", "50%"], // 控制地图的中心位置
  260. },
  261. // 图表数据系列(series)
  262. series: [
  263. {
  264. type: "map", // 地图类型
  265. map: "child", // 绑定的地图名称(与 `geo` 对应)
  266. zoom: 1.1, // 缩放级别
  267. itemStyle: {
  268. areaColor: { image: imgElement, repeat: "no-repeat" }, // 地图区域背景颜色(使用图片填充)
  269. borderColor: "#11F4F0", // 地图边界颜色
  270. borderWidth: 1, // 地图边界宽度
  271. },
  272. emphasis: {
  273. itemStyle: {
  274. areaColor: "#0D7481", // 鼠标悬浮时的区域颜色
  275. },
  276. },
  277. select: { disabled: true }, // 禁用地图的选中状态,防止点击后颜色锁定
  278. label: {
  279. show: true, // 显示区域名称
  280. color: "#FFF", // 文字颜色
  281. fontSize: 16, // 文字大小
  282. fontWeight: 600, // 字重
  283. emphasis: { color: "#fff" }, // 悬浮时的文字颜色
  284. },
  285. }
  286. ]
  287. };
  288. echarts.registerMap("child", this.dataSource[cityName])
  289. charts.setOption(option);
  290. },
  291. beBack(){
  292. this.initCharts()
  293. this.showBack = false
  294. this.appOrg = "10001"
  295. this.$emit('transmit', this.appOrg)
  296. }
  297. },
  298. };
  299. </script>
  300. <style scoped>
  301. </style>