<template> <div style="position: absolute; top: 60px; left: 30px;"> <el-row style="width: 340px"> <el-select v-model="selectT" style="float: left;width:100px;" placeholder="请选择" size="small"> <el-option label="地名" value="1" /> <el-option label="坐标" value="2" /> <el-option label="管径" value="3" /> <el-option label="管材" value="4" /> <el-option label="设施编号" value="5" /> <el-option label="阀门类型" value="6" /> <el-option label="阀门规格" value="7" /> </el-select> <el-autocomplete v-model="inputT" class="helpInput" style="width: 190px; float: left; padding-left: 5px;" clearable size="small" popper-class="my-autocomplete" :fetch-suggestions="querySearch" :placeholder="selectTt" @clear="textClear" > <template slot-scope="{ item }"> <span class="name">{{ item.value }}</span> </template> </el-autocomplete> <el-button style="float: left; height: 32px; border-radius: 0px 4px 4px 0px;" type="primary" icon="el-icon-search" size="small" plain @click="queryFeature" /> </el-row> <div id="zoomH" style="position: absolute; top: 0px; left: 350px; width: 70px;"> <div class="widgetGroupButtoms" title="前一视图" style="float: left;" @click="viewHistroy(true)"> <img src="./images/left.png"> </div> <div class="widgetGroupButtoms" title="后一视图" style="float: left;" @click="viewHistroy(false)"> <img src="./images/right.png"> </div> </div> <el-collapse-transition> <div v-show="showResult" id="resultDiv" ref="showResult" style="width:410px;margin-top:10px;"> <div style="overflow:auto;max-height:380px;margin-bottom:10px;"> <ul id="resultUl" ref="scroll" v-infinite-scroll="load" infinite-scroll-disabled="disabled"> <li v-for="(i, index) in queryResult" :key="index" @click="liClick(i)"> <div> <span class="title">{{ queryTitle }}:<span v-html="i.text" /></span> </div> <div style="margin-top: 13px;"> <span class="other">编号:<span class="text">{{ i.id }}</span></span> <span class="other" style="margin-left: 8px;">设备类型:<span class="text">{{ i.layer }}</span></span> </div> <div class="icon"><i class="el-icon-arrow-right" /></div> </li> </ul> <div ref="queryLoading" class="load"><i class="el-icon-loading" />加载中...</div> <div ref="queryNoMore" class="load">没有更多了...</div> </div> <div ref="statue" class="allResult" /> </div> </el-collapse-transition> </div> </template> <script> import { queryConfig } from './queryConfig' import { esriConfig, appconfig } from 'staticPub/config' import { loadModules } from 'esri-loader' export default { name: 'SimpleQueryTool', components: {}, props: { mapView: { type: Object, default: () => [] } }, data() { return { inputT: '', selectT: '1', selectTt: '请输入地名', queryResult: [], allFea: [], testi: 0, disabled: false, showResult: false, queryTitle: '' } }, watch: { selectT: function(e, old) { this.selectTt = [ '请输入地名', '请输入X,Y', '请输入管径大小', '请输入管材类型', '请输入设施编号', '请输入阀门类型', '请输入阀门半径大小' ][e - 1] if (e != old) { this.queryResult = [] this.showResult = false } }, mapView: function(e) { var center = e.center this.extentGourp = [] this.extentGourp.push({ center: center, zoom: e.zoom }) this.extentIndex = 0 this.isExtentChange = true this.isExtentTime = undefined var sleepZoom = [[center.x, center.y], e.zoom, undefined] loadModules(['esri/Graphic'], { url: esriConfig.baseUrl }).then(([Graphic]) => { this.showGeo = new Graphic({ geometry: { type: 'point', x: 0, y: 0, spatialReference: this.mapView.spatialReference }, symbol: { path: 'M527.676 51c146.71 0 265.919 117.742 268.288 263.887l0.036 4.437C789.928 444.319 695.261 606.878 512 807 329.564 606.484 234.897 443.926 228 319.324 228 171.133 348.133 51 496.324 51h31.352z m-15.31 53h-0.732C390.886 104 293 201.886 293 322.634 298.319 424.162 371.319 556.617 512 720c141.318-163.062 214.318-295.518 219-397.366l-0.03-3.615C729.04 199.938 631.908 104 512.367 104z M512 171c86.709 0 157 70.291 157 157s-70.291 157-157 157-157-70.291-157-157 70.291-157 157-157z m0.5 55C455.89 226 410 271.89 410 328.5S455.89 431 512.5 431 615 385.11 615 328.5 569.11 226 512.5 226z', color: '2D74E7', outline: { color: '2D74E7', width: '1px' }, size: '30px', yoffset: '15px', xoffset: '0px', type: 'simple-marker' } }) this.mapView.graphics.add(this.showGeo) }) this.mapView.watch('center', (ec) => { if (this.isExtentChange && ec.x != sleepZoom[0][0] && ec.y != sleepZoom[0][1]) { if (sleepZoom[2]) clearTimeout(sleepZoom[2]) sleepZoom[2] = setTimeout(() => { sleepZoom[0] = [ec.x, ec.y] if (this.extentIndex != this.extentGourp.length - 1) { this.extentGourp.splice( this.extentIndex + 1, this.extentGourp.length - this.extentIndex ) } this.extentGourp.push({ center: ec, zoom: this.mapView.zoom }) this.extentIndex = this.extentGourp.length - 1 }, 200) } }) } }, mounted() { this.queryConfig = queryConfig this.queryAllText = {} this.queryText(16, 'MATERIAL', this.queryAllText) this.queryText(9, 'VALVETYPE', this.queryAllText) this.loadLayerInfo() window.str = this.$refs.scroll this.disabled = true }, methods: { loadLayerInfo() { $.ajax({ // 结果 url: `${appconfig.gisResource.business_map.config[0].url}?f=pjson&token=${this.$store.state.user.arcgistoken}`, type: 'GET', success: (data) => { data = JSON.parse(data) data = data.layers var layers = [] for (let i = 0, ii = data.length; i < ii; i++) { if (!data[i].subLayerIds) layers.push(data[i].id) } sencondFun(layers) }, error: (error) => { this.$message.error('查询错误,请联系管理员') console.log(error) } }) var sencondFun = (layers) => { $.ajax({ // 结果 url: appconfig.gisResource.layer_name.config[0].url, type: 'POST', data: { token: this.$store.state.user.arcgistoken, usertoken: appconfig.usertoken, layerids: JSON.stringify(layers), f: 'pjson' }, success: (data) => { data = JSON.parse(data) if (data.code == 10000) { data = data.result.rows var rows = {} var rows2 = {} for (let i = 0, ii = data.length; i < ii; i++) { var dd = data[i] rows[data[i].layerdbname] = { id: dd.layerid, name: data[i].layername } rows2[dd.layerid] = data[i].layerdbname } this.layerIndex = rows this.layerIdIndex = rows2 } }, error: (error) => { this.$message.error('查询错误,请联系管理员') console.log(error) } }) } }, querySearch(queryString, cb) { switch (parseInt(this.selectT)) { default: cb([]) break case 4: cb(this.queryAllText['MATERIAL'].filter((e) => e.value.indexOf(queryString) > -1)) break case 6: cb(this.queryAllText['VALVETYPE'].filter((e) => e.value.indexOf(queryString) > -1)) break } }, queryText(id, name, texts) { $.ajax({ url: appconfig.gisResource.fieldUniqueValue.config[0].url, type: 'POST', data: { token: this.$store.state.user.arcgistoken, usertoken: appconfig.usertoken, layerid: id, field_name: name, f: 'pjson' }, success: (data) => { data = JSON.parse(data) console.log(id, name, texts, appconfig.gisResource.fieldUniqueValue.config[0].url) if (data.result && data.result.rows) { texts[name] = data.result.rows.map((e) => { return { value: e } }) } }, error: (error) => { this.$message.error('查询错误,请联系管理员') console.log(error) } }) }, queryFeature() { var Istr = this.inputT.replace(/^\s*|\s*$/g, '').toUpperCase() if (Istr == '') return this.$message('请输入查询内容') if (parseInt(this.selectT) == 2) { Istr = Istr.replace(',', ',') if (Istr.indexOf(',') < 0) return this.$message.error('请以 X坐标,Y坐标 格式输入 如: 104.4,30.8 ') Istr = Istr.split(',') try { var x = parseFloat(Istr[0]) var y = parseFloat(Istr[1]) } catch { return this.$message.error('坐标格式错误 请输入正确坐标格式 如: 104.4,30.8 ') } this.mapView.center = { x: x, y: y, spatialReference: this.mapView.spatialReference } if (this.mapView.zoom > 6) this.mapView.zoom = 6 this.$message.success('跳转至 X:' + x + 'Y:' + y) } else { this.disabled = false this.queryResult = [] this.showResult = true var config = this.queryConfig[['', '地名', '', '管径', '管材', '设施编号', '阀门类型', '阀门规格'][this.selectT]] const seed = new Date().getTime() this.timeTable = seed const ii = config.layers.length var statue = this.$refs.statue var dshow = 0; var dquery = 0 this.allFea = [] this.setFea = 0 var firstLoad = false var ilength = ii this.$refs.queryNoMore.style.display = 'none' this.showGeo.geometry = { type: 'point', x: 0, y: 0, spatialReference: this.mapView.spatialReference } var fields = config.fields this.queryTitle = config.text for (let i = 0; i < ii; i++) { var dc = config.layers[i] const layerId = this.layerIndex[dc].id $.ajax({ url: appconfig.gisResource.business_map.config[0].url + '/' + layerId + '/query', type: 'POST', data: { token: this.$store.state.user.arcgistoken, where: 'UPPER("' + fields + '")' + (config.isLike ? " like '%" + Istr.replace(/_/g, '$_').replace(/\?/g, '$?').replace(/%/g, '$%') + "%' ESCAPE '$'" : (" = '" + Istr + "'")), returnIdsOnly: true, f: 'pjson' }, success: (data) => { ilength -= 1 if (seed != this.timeTable) return data = JSON.parse(data) var str = '' if (!data.error) { data = data.objectIds if (data) { dquery += data.length var newRows = [] for (var j = 0, jj = data.length; j < jj; j++) { newRows.push({ l: layerId, id: data[j] }) } this.allFea = this.allFea.concat(newRows) } str += '找到相关结果:' + dquery + '个' if (!firstLoad && this.allFea.length > 0) { this.loadFun() firstLoad = true } } statue.innerHTML = str if (ilength == 0) { if (dquery == 0) { this.disabled = true this.showResult = false this.$message('未查询出结果') this.timeTable = undefined } } }, error: (error) => { this.$message.error('查询错误,请联系管理员') console.log(error) } }) } let setFea = 0 var layerDir = this.layerIdIndex var layerNameDir = this.layerIndex var queryLoading = this.$refs.queryLoading this.loadFun = () => { this.disabled = true var il = this.allFea var quertIds = {} var ii = Math.min(setFea + 4, il.length) if (ii == 0) queryLoading.style.display = 'none' for (;setFea < ii; setFea++) { var di = il[setFea] if (quertIds.hasOwnProperty(di.l)) { quertIds[di.l].push(di.id) } else { quertIds[di.l] = [di.id] } } let inlength = 0 for (const iname in quertIds) { inlength += 1 $.ajax({ url: appconfig.gisResource.business_map.config[0].url + '/' + iname + '/query', type: 'POST', data: { token: this.$store.state.user.arcgistoken, outFields: 'OBJECTID,SID,' + fields, objectIds: quertIds[iname].join(','), f: 'pjson' }, success: (data) => { if (seed != this.timeTable) return data = JSON.parse(data).features var addRows = [] for (var i = 0, ii = data.length; i < ii; i++) { var att = data[i].attributes var text = (att[fields] || '').toString() text = text.replace( new RegExp(Istr, 'g'), '<span class="highLight">' + Istr + '</span>' ) addRows.push({ layer: layerNameDir[layerDir[iname]].name, id: att.SID || '', text: text, geomentry: data[i].geometry }) } this.queryResult.push(...addRows) inlength -= 1 if (inlength == 0) { queryLoading.style.display = 'none' // console.log(this.queryResult.length + ',' + this.allFea.length) this.disabled = false if (this.$refs.scroll.offsetHeight < 380) { if (ilength != 0) { firstLoad = false } else { this.$nextTick(this.load) } } } }, error: (error) => { this.$message.error('查询错误,请联系管理员') } }) } } } }, load() { if (this.loadFun) { if (this.queryResult.length >= this.allFea.length) { this.disabled = true this.$refs.queryNoMore.style.display = '' } else { this.$refs.queryNoMore.style.display = 'none' this.$refs.queryLoading.style.display = '' this.disabled = true window.requestAnimationFrame(this.loadFun) } } }, liClick(row) { var geo = row.geomentry var x, y if (geo.paths) { geo = geo.paths[0] x = (geo[0][0] + geo[1][0]) / 2 y = (geo[0][1] + geo[1][1]) / 2 } else if (geo.rings) { } else { x = geo.x, y = geo.y } this.showGeo.geometry = { type: 'point', x: x, y: y, spatialReference: this.mapView.spatialReference } this.mapView.goTo( { center: this.showGeo.geometry, zoom: 6 } ) }, textClear() { this.queryResult = [] this.showResult = false this.timeTable = undefined this.allFea = [] this.showGeo.geometry = { type: 'point', x: 0, y: 0, spatialReference: this.mapView.spatialReference } }, viewHistroy(isLast) { if (isLast) { if (this.extentIndex == 0) return this.extentIndex -= 1 } else { if (this.extentIndex == this.extentGourp.length - 1) return this.extentIndex += 1 } this.mapView.goTo( { center: this.extentGourp[this.extentIndex].center, zoom: this.extentGourp[this.extentIndex].zoom }, { duration: 1000 } ) this.isExtentChange = false if (this.isExtentTime) clearTimeout(this.isExtentTime) this.isExtentTime = setTimeout(() => { this.isExtentChange = true }, 1200) } } } </script> <style lang="scss" scoped> #resultDiv { padding: 15px 10px 10px 10px; background: rgb(246,246,246); border-radius: 5px; box-shadow: 0px 4px 18px #938cb3; } #resultDiv .load { background: #fff; color: rgb(153,153,153); font-size: 14px; padding: 4px; text-align: center; } #resultDiv .allResult { text-align: right; color: #555; font-size: 13px; } #resultUl { list-style-type: none; margin: 0px; padding: 0; padding-right: 5px; } #resultUl li { cursor: pointer; margin-bottom: 6px; background: #fff; position: relative; padding: 13px 10px; } #resultUl li .icon { position: absolute; right: 12px; top: 50%; font-size: 20px; transform: translateY(-50%); } #resultUl li div .title { font-size: 23px; letter-spacing: 1px; } #resultUl li div .other { color: rgb(153,153,153); font-size: 13px; } #resultUl li div .other .text { color: rgb(85,85,85); } #resultUl li:hover { background: #2d74e7; color: #fff; } #resultUl li div .title >>> .highLight { color: #2d74e7; } #resultUl li:hover div .title >>> .highLight { color: #fff; } #resultUl li:hover div .other { color: #fff; } #resultUl li:hover div .other .text { color: #fff; } </style>