map.ts 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. import { defHttp } from '/@/utils/http/axios';
  2. import { omitBy, isNil, get } from 'lodash-es';
  3. import { useMineDepartmentStore } from '/@/store/modules/mine';
  4. import { StatusColorEnum } from '/@/enums/jeecgEnum';
  5. // import { findNode } from '/@/utils/helper/treeHelper';
  6. enum Api {
  7. list = '/province/mineData/getMineData',
  8. getGoafAlarmLevel = '/province/homeData/getGoafAlarmLevel',
  9. }
  10. /**
  11. * 列表接口
  12. * @param params
  13. */
  14. export function getMarkers(params: any): Promise<any> {
  15. return defHttp.post({ url: Api.list, params: omitBy(params, isNil) }, { joinParamsToUrl: true });
  16. }
  17. export function getGoafAlarmLevel(params: any): Promise<any> {
  18. return defHttp.post({ url: Api.getGoafAlarmLevel, params: omitBy(params, isNil) }, { joinParamsToUrl: true });
  19. }
  20. export function getShanxiGeoJSON() {
  21. return fetch('/js/shanxi.geo.json').then((r) => r.json());
  22. }
  23. export function getGeoJSON(params: any) {
  24. // const getFeatColor = (gb) => {
  25. // const colorMap = {
  26. // // 邮编前7位:颜色
  27. // // '1566101': '#14baff',
  28. // // '1566102': '#14baff',
  29. // // '1566103': '#ffff12',
  30. // // '1566104': '#ffff12',
  31. // // '1566105': '#ffab12',
  32. // // '1566106': '#ffab12',
  33. // // '1566107': '#fe1414',
  34. // // '1566108': '#fe1414',
  35. // // '1566109': '#fe1414',
  36. // // '1566111': '#fe1414',
  37. // '1566101': StatusColorEnum.blue,
  38. // '1566102': StatusColorEnum.yellow,
  39. // '1566103': StatusColorEnum.gold,
  40. // '1566104': StatusColorEnum.red,
  41. // '1566105': StatusColorEnum.green,
  42. // '1566106': StatusColorEnum.gray,
  43. // '1566107': StatusColorEnum.orange,
  44. // '1566108': StatusColorEnum.purple,
  45. // '1566109': StatusColorEnum.black,
  46. // '1566110': StatusColorEnum.blue,
  47. // };
  48. // return get(colorMap, gb.slice(0, -2), StatusColorEnum.blue);
  49. // };
  50. const getAlarmColor = (lv) => {
  51. const colorMap = {
  52. 4: StatusColorEnum.red,
  53. 3: StatusColorEnum.gold,
  54. 2: StatusColorEnum.yellow,
  55. 1: StatusColorEnum.blue,
  56. 0: StatusColorEnum.blue,
  57. };
  58. return get(colorMap, lv, StatusColorEnum.blue);
  59. };
  60. const positionPresets = new Map([
  61. [
  62. '陕西局',
  63. {
  64. x: '35.83317',
  65. y: '109.425873',
  66. },
  67. ],
  68. [
  69. '地方监管',
  70. {
  71. x: '35.83317',
  72. y: '109.425873',
  73. },
  74. ],
  75. [
  76. '陕西省(集团)',
  77. {
  78. x: '35.83317',
  79. y: '109.425873',
  80. },
  81. ],
  82. [
  83. '执法一处',
  84. {
  85. x: '38.640448',
  86. y: '110.025366',
  87. },
  88. ],
  89. [
  90. '执法二处',
  91. {
  92. x: '39.195141',
  93. y: '110.844117',
  94. },
  95. ],
  96. [
  97. '执法三处',
  98. {
  99. x: '35.83317',
  100. y: '109.425873',
  101. },
  102. ],
  103. [
  104. '执法四处',
  105. {
  106. x: '35.184',
  107. y: '109.937609',
  108. },
  109. ],
  110. [
  111. '执法五处',
  112. {
  113. x: '33.812234',
  114. y: '108.337231',
  115. },
  116. ],
  117. ]);
  118. // const pointInPolygon = (point, polygon) => {
  119. // const x = point[0],
  120. // y = point[1];
  121. // let inside = false;
  122. // for (let i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
  123. // const xi = polygon[i][0],
  124. // yi = polygon[i][1];
  125. // const xj = polygon[j][0],
  126. // yj = polygon[j][1];
  127. // const intersect = yi > y !== yj > y && x < ((xj - xi) * (y - yi)) / (yj - yi) + xi;
  128. // if (intersect) inside = !inside;
  129. // }
  130. // return inside;
  131. // };
  132. // const pointInMultiPolygon = (point, multiPolygon) => {
  133. // for (const polygon of multiPolygon.coordinates) {
  134. // // 外环
  135. // const outerRing = polygon[0];
  136. // if (pointInPolygon(point, outerRing)) {
  137. // // 检查内环(洞),如果点在任意一个内环内,则不算内部
  138. // let insideHole = false;
  139. // for (let i = 1; i < polygon.length; i++) {
  140. // const hole = polygon[i];
  141. // if (pointInPolygon(point, hole)) {
  142. // insideHole = true;
  143. // break;
  144. // }
  145. // }
  146. // if (!insideHole) return true;
  147. // }
  148. // }
  149. // return false;
  150. // };
  151. return Promise.all([getShanxiGeoJSON(), getMarkers(params)]).then(([geojson, { records }]) => {
  152. const mineStore = useMineDepartmentStore();
  153. const map = new Map<string, any>();
  154. // 根据树信息将煤矿信息分类并整合为一个数组
  155. for (const element of records) {
  156. // 为初始的数据赋值
  157. if (!element.dynamic) {
  158. element.id = element.deptId;
  159. // 子节点计数器
  160. element.count = 1;
  161. element.isLeaf = true;
  162. element.dynamic = false;
  163. element.alarmLevel = parseInt(element.alarmLevel) || 0;
  164. element.longitude = parseFloat(element.longitude);
  165. element.latitude = parseFloat(element.latitude);
  166. element.fillColor = getAlarmColor(element.alarmLevel);
  167. // 地图缩放等级
  168. element.zoom = 8;
  169. map.set(element.deptId, element);
  170. }
  171. if (map.has(element.parentId)) {
  172. const node = map.get(element.parentId);
  173. node.count += element.count;
  174. node.alarmLevel = Math.max(node.alarmLevel, element.alarmLevel);
  175. node.fillColor = getAlarmColor(node.alarmLevel);
  176. continue;
  177. }
  178. const ref = mineStore.findDepartById(element.parentId);
  179. if (!ref) continue;
  180. const node = {
  181. id: ref.id,
  182. deptId: ref.id,
  183. parentId: ref.parentId,
  184. name: ref.departName,
  185. count: element.count,
  186. isLeaf: false,
  187. dynamic: true,
  188. alarmLevel: element.alarmLevel,
  189. longitude: positionPresets.get(ref.departName)?.y || element.longitude,
  190. latitude: positionPresets.get(ref.departName)?.x || element.latitude,
  191. fillColor: getAlarmColor(element.alarmLevel),
  192. zoom: 5 + parseInt(ref.orgType),
  193. };
  194. map.set(element.parentId, node);
  195. records.push(node);
  196. }
  197. map.clear();
  198. // geojson.features.forEach(({ properties, geometry }) => {
  199. // properties.fillColor = getFeatColor(properties.gb);
  200. // // const temp = records.filter((item) => pointInMultiPolygon([item.longitude, item.latitude], geometry));
  201. // const temp = reduceRight(
  202. // records,
  203. // (acc, item) => {
  204. // acc.add(mineStore.getRootId!);
  205. // // 从右边开始,因为父节点都在最后面
  206. // if (pointInMultiPolygon([item.longitude, item.latitude], geometry)) {
  207. // acc.add(item.id);
  208. // acc.add(item.parentId);
  209. // }
  210. // return acc;
  211. // },
  212. // new Set()
  213. // );
  214. // properties.children = [...temp];
  215. // });
  216. const markers = {
  217. type: 'FeatureCollection',
  218. features: records.map((item) => ({
  219. type: 'Feature',
  220. id: item.deptId,
  221. geometry: {
  222. type: 'Point',
  223. coordinates: [item.longitude, item.latitude],
  224. },
  225. properties: item,
  226. })),
  227. };
  228. return [geojson, records, markers];
  229. });
  230. }