VlConfigLayers.vue 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. <template>
  2. <i class="vl-config-layer-component" /> <!-- 模板 -->
  3. </template>
  4. <script>
  5. /**
  6. * openlayer 组件示例
  7. * @type {Array<import('vue').ComponentOptions>}
  8. */
  9. import VlCoreMixin from '../_mixin/vl-core-mixin'
  10. import { createLayers, getEnabledLayersConfig, isLayerGroup, layerConfigEach } from './create-layer'
  11. import ImageArcGISRest from 'ol/source/ImageArcGISRest'
  12. import { isBoolean } from '@/components/ol/_utils/map-layer-utils'
  13. const CONFIG_KEY = '__layer_config__'
  14. export default {
  15. name: 'VlConfigLayers',
  16. mixins: [VlCoreMixin], // 混入 mapInstance(地图实例对象)
  17. props: {
  18. layersConfig: {
  19. type: Object,
  20. required: true
  21. },
  22. visibleLayerIds: { // 显示的 图层id, 为 [] 不显示图层,为 undefined显示配置文件配置的图层
  23. type: Array,
  24. default: () => undefined
  25. }
  26. },
  27. data() {
  28. return {
  29. enabledLayersConfig: undefined,
  30. layerMapping: {} // key:id value:item
  31. }
  32. },
  33. watch: {
  34. 'layersConfig.view'(newValue, oldValue) {
  35. this.initMapView(newValue)
  36. },
  37. enabledLayersConfig: {
  38. deep: true,
  39. handler: function(newValue, oldValue) {
  40. layerConfigEach(newValue, this.layerConfigChangeSync2Layer)
  41. }
  42. },
  43. visibleLayerIds(newValue, oldValue) {
  44. const set = new Set(newValue)
  45. Object.entries(this.layerMapping).forEach(([k, v]) => {
  46. const item = v.get(CONFIG_KEY)
  47. if (!item.base) {
  48. // v.setVisible(item.visible = set.has(k))
  49. // if (isLayerGroup(v)) {
  50. // v.setVisible(item.visible = !!item.children.find(i => i.visible))
  51. // }
  52. v.setVisible(item.visible = isLayerGroup(v) ? !!item.children.find(i => i.visible) : set.has(k))
  53. }
  54. })
  55. }
  56. },
  57. created() {
  58. const { layers, view } = this.layersConfig
  59. this.initMapView(view)
  60. this.initEnabledLayersConfig(layers)
  61. },
  62. methods: {
  63. ready() {
  64. // 该方法将会在页面实例 挂载完(mounted) 后自动调用
  65. this.loadLayers(this.enabledLayersConfig)
  66. // 执行相关操作
  67. // 添加图层等 this.mapInstance.addLayer(xxx)
  68. },
  69. closure() {
  70. // 该方法将会在页面实例 销毁之前(beforeDestroy) 后自动调用
  71. // 执行相关销毁操作
  72. // 添加图层等 this.mapInstance.removeLayer(xxx)
  73. this.mapInstance.setLayers([])
  74. },
  75. initMapView(viewConfig) {
  76. const { center, zoom, extent, fitExtent, minZoom, maxZoom } = viewConfig
  77. const view = this.mapInstance.getView()
  78. view.setCenter(center)
  79. view.setZoom(zoom)
  80. minZoom && view.setMinZoom(minZoom)
  81. maxZoom && view.setMaxZoom(maxZoom)
  82. },
  83. resetMapView(fly = true) {
  84. const { center, zoom } = this.layersConfig.view
  85. if (fly) {
  86. const view = this.mapInstance.getView()
  87. view.animate({ zoom: zoom, center: center, duration: 500 })
  88. } else {
  89. this.initMapView()
  90. }
  91. },
  92. initEnabledLayersConfig(layersConfig = []) {
  93. const visibleLayerIds = this.visibleLayerIds
  94. const enabledLayers = getEnabledLayersConfig(layersConfig)
  95. if (visibleLayerIds) {
  96. layerConfigEach(enabledLayers, (layerConfig, isGroup) => {
  97. const { id: layerId, base } = layerConfig
  98. if (base) { // 底图不用处理
  99. return
  100. }
  101. if (visibleLayerIds.length) {
  102. // [...]
  103. if (isGroup) {
  104. layerConfig.visible = !!layerConfig.children.find(i => i.visible)
  105. } else {
  106. layerConfig.visible = !!visibleLayerIds.find(i => i === layerId)
  107. }
  108. } else { // []
  109. layerConfig.visible = !!base
  110. }
  111. })
  112. }
  113. this.enabledLayersConfig = enabledLayers
  114. },
  115. loadLayers(enabledLayersConfig = []) {
  116. const layerMapping = this.layerMapping = {}
  117. this.mapInstance.setLayers(createLayers(enabledLayersConfig))
  118. layerConfigEach(enabledLayersConfig, (layerConfig, isGroup) => {
  119. const { id, layer } = layerConfig
  120. layerMapping[id] = layer
  121. layer.set(CONFIG_KEY, layerConfig)
  122. if (isGroup) {
  123. const layers = layer.getLayers().getArray()
  124. layers.forEach(l => {
  125. const parent = layer
  126. l.on('change:visible', function(e) {
  127. setTimeout(() => {
  128. const brothers = parent.getLayers().getArray()
  129. const b = brothers.map(i => i.getVisible()).includes(true)
  130. parent.setVisible(b)
  131. layerConfig.visible = b
  132. }, 30)
  133. })
  134. })
  135. }
  136. delete layerConfig.layer // 删掉 ol layer 对象,否则 watch enabledLayersConfig 时候 Maximum call stack size exceeded
  137. })
  138. this.$emit('loaded', enabledLayersConfig, layerMapping)
  139. },
  140. // 图层配置改变时 更新到 图层
  141. layerConfigChangeSync2Layer(layerConfig, isGroup) {
  142. const { id, visible, opacity, legend, params, defs_temp } = layerConfig
  143. const layer = this.layerMapping[id]
  144. layer.setVisible(visible)
  145. !isBoolean(opacity) && layer.setOpacity(opacity)
  146. if (legend && visible) { // 图例 图层过滤
  147. // show:0,1 服务都是两个 layers
  148. let { layers, layerDefs, KFQLX } = params
  149. layers = layers || 'show:0,1'
  150. layerDefs = layerDefs || {}
  151. this.$set(params, 'layers', layers)
  152. this.$set(params, 'layerDefs', layerDefs)
  153. // layerDefs 处理 layers必须是 show 类型 `show:0,1` 这样的格式
  154. layers.split(':')[1].split(',').forEach(i => {
  155. if (!layerDefs[i]) {
  156. layerDefs[i] = '1 = 1'
  157. }
  158. })
  159. const { defs = {}} = legend
  160. // 启用的图例的 查询条件 集合
  161. let map = Object.values(defs).filter(i => i.enabled)
  162. .map(i => i.query || {})
  163. // 图层过滤条件 规整化
  164. map = map.reduce((sum, item) => {
  165. Object.entries(item).forEach(([k, v]) => {
  166. if (sum[k]) {
  167. Array.isArray(sum[k]) ? (sum[k].push(v)) : (sum[k] = [sum[k], v])
  168. } else {
  169. sum[k] = v
  170. }
  171. })
  172. return sum
  173. }, {})
  174. // 图层过滤条件 转字符串格式
  175. const query = Object.entries(map).map(([k, v]) => {
  176. if (Array.isArray(v)) {
  177. return `${k} in ('${v.join('\',\'')}')`
  178. }
  179. return `${k} = '${v}'`
  180. })
  181. .join(' and ')
  182. // 只有条件改变时 才重新设置参数
  183. if (legend.query !== query) {
  184. Object.entries(layerDefs).forEach(([k, v = '']) => {
  185. // 删除掉前一次的 过滤条件
  186. layerDefs[k] = v.replaceAll(` and ${legend.query}`, '')
  187. // 拼接当前 过滤条件
  188. layerDefs[k] += query ? ` and ${query}` : ''
  189. })
  190. // 记录当前 过滤条件
  191. legend.query = query
  192. }
  193. // 临时加 图层判断条件
  194. // if (defs_temp) {
  195. // layerDefs[0] = defs_temp
  196. // layerDefs[1] = defs_temp
  197. // }else{
  198. // layerDefs[0]=" 1=1 "
  199. // layerDefs[1]=" 1=1 "
  200. // }
  201. }
  202. // updateParams 要放到 图例处理 后面
  203. if (params && !isGroup) {
  204. const source = layer.getSource()
  205. source instanceof ImageArcGISRest && source.updateParams(params)
  206. }
  207. },
  208. getLayerMapping() {
  209. return this.layerMapping
  210. },
  211. getLayerById(id) {
  212. return this.layerMapping[id]
  213. },
  214. getLayerConfigById(id) {
  215. const element = this.layerMapping[id]
  216. let ele = element ? element.get(CONFIG_KEY) : undefined;
  217. return ele;
  218. }
  219. }
  220. }
  221. </script>
  222. <style lang="scss" scoped>
  223. </style>