SpatialAnalysis.vue 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. <template>
  2. <div>空间分析</div>
  3. <div class="analyze-data-container">
  4. <div class="item">
  5. <div class="item-label">行政镇(个)</div>
  6. <div class="item-value">{{ validateNum(analysisData.townCount) }}</div>
  7. </div>
  8. <div class="item">
  9. <div class="item-label">行政村(个)</div>
  10. <div class="item-value">{{ validateNum(analysisData.villageCount) }}</div>
  11. </div>
  12. <div class="item">
  13. <div class="item-label">面积(km²)</div>
  14. <div class="item-value">{{ validateNum(analysisData.areaSize) }}</div>
  15. </div>
  16. <div class="item">
  17. <div class="item-label">常住人口(万)</div>
  18. <div class="item-value">{{ validateNum(analysisData.populationSize) }}</div>
  19. </div>
  20. <div class="item">
  21. <div class="item-label">GDP(万元)</div>
  22. <div class="item-value">{{ validateNum(analysisData.GDP) }}</div>
  23. </div>
  24. <div class="flex" style="margin: 20px 0; width: 100%">
  25. <el-input v-model="keyword" size="large" style="flex: 1" />
  26. </div>
  27. <div class="flex">
  28. <div v-for="(item, index) in filteredList" :key="index" class="item2">{{ item.name + '(' + item.list.length + ')' }}</div>
  29. </div>
  30. </div>
  31. <DrawTools @handleAnalysisData="handleAnalysisData" />
  32. </template>
  33. <script lang="ts" setup name="AnalyzeDataDialog">
  34. import DrawTools from './DrawTools.vue';
  35. import { validateNum } from '@/utils/ruoyi';
  36. import { getSpatialAnalysis } from '@/api/globalMap';
  37. import { deepClone } from '@/utils';
  38. const emits = defineEmits(['handleMenu']);
  39. const keyword = ref('');
  40. let analysisData = ref({
  41. townCount: '',
  42. villageCount: '',
  43. areaSize: '',
  44. populationSize: '',
  45. GDP: '',
  46. list: []
  47. });
  48. const filteredList = computed(() => {
  49. const data = deepClone(analysisData.value.list);
  50. return data.filter((item) => {
  51. if (!!keyword.value) {
  52. // 模糊搜索逻辑,这里简单使用 includes 进行包含关系判断
  53. let flag = item.name.toLowerCase().includes(keyword.value.toLowerCase());
  54. if (flag) {
  55. return true;
  56. } else {
  57. let res = filteredSubItems(item);
  58. if (res && res.length > 0) {
  59. item.list = res;
  60. return true;
  61. } else {
  62. return false;
  63. }
  64. }
  65. } else {
  66. return true;
  67. }
  68. });
  69. });
  70. const filteredSubItems = (parentItem) => {
  71. return parentItem.list.filter((subItem) => {
  72. return subItem.name.toLowerCase().includes(keyword.value.toLowerCase());
  73. });
  74. };
  75. const location = ref([]);
  76. watch(
  77. () => location,
  78. () => {
  79. getSpatialAnalysis(location.value).then((res) => {
  80. if (res.data && res.data.list) {
  81. const list = [];
  82. res.data.list.forEach((item) => {
  83. if (item.num > 0) {
  84. list.push(item);
  85. }
  86. });
  87. res.data.list = list;
  88. }
  89. analysisData.value = res.data;
  90. });
  91. },
  92. {
  93. immediate: true,
  94. deep: true
  95. }
  96. );
  97. const handleAnalysisData = (data) => {
  98. location.value = data;
  99. emits('handleMenu', '空间分析');
  100. };
  101. </script>
  102. <style lang="scss" scoped>
  103. .analyze-data-container {
  104. width: 100%;
  105. font-size: 16px;
  106. padding: 15px;
  107. display: flex;
  108. flex-wrap: wrap;
  109. .item {
  110. width: calc(33.333333%);
  111. height: 100px;
  112. background-color: #fff;
  113. border-left: 1px solid #000;
  114. border-top: 1px solid #000;
  115. display: flex;
  116. flex-direction: column;
  117. justify-content: center;
  118. align-items: center;
  119. font-size: 36px;
  120. &:nth-child(3),
  121. &:nth-child(4),
  122. &:nth-child(5) {
  123. border-bottom: 1px solid #000;
  124. }
  125. &:nth-child(5) {
  126. border-right: 1px solid #000;
  127. }
  128. .item-label {
  129. margin-bottom: 18px;
  130. }
  131. }
  132. }
  133. .item2 {
  134. background-color: #fff;
  135. font-size: 36px;
  136. padding: 10px 20px;
  137. margin-right: 20px;
  138. }
  139. </style>