New file |
| | |
| | | /** |
| | | * 缓冲区查询类 |
| | | */ |
| | | import * as turf from '@turf/turf' |
| | | import $ from 'jquery' |
| | | // import MapConfig from '@/map/conf/MapConfig' |
| | | import zrbhq from '@assets/images/map-pages/buffer/1.png' |
| | | import yjdw from '@assets/images/map-pages/buffer/2.png' |
| | | import gadw from '@assets/images/map-pages/buffer/3.png' |
| | | import yy from '@assets/images/map-pages/buffer/5.png' |
| | | import st from '@assets/images/map-pages/buffer/7.png' |
| | | import yjzy from '@assets/images/map-pages/buffer/8.png' |
| | | import xfdw from '@assets/images/map-pages/buffer/10.png' |
| | | import mgmb from '@assets/images/map-pages/buffer/15.png' |
| | | const MapConfig = { |
| | | |
| | | } |
| | | MapConfig.mapConfig = {} |
| | | MapConfig.mapConfig.bufferQueryUrlProd = 'http://10.238.235.179:6240/geoserver/sewer/ows' |
| | | class BufferQuery { |
| | | constructor (map, L) { |
| | | this.map = map |
| | | this.L = L |
| | | this.bufferLayer = null |
| | | this.resultLayer = null |
| | | this.resultMarkers = [] |
| | | this.queryResults = [] |
| | | this.radius = 10 |
| | | this.currentRadius = null |
| | | this.bufferResultLayerArr = [] |
| | | this.bufferQueryLayerArr = [] |
| | | this.vueRef = null |
| | | this.currentX = null |
| | | this.currentY = null |
| | | } |
| | | |
| | | setVueRef (vueRef) { |
| | | this.vueRef = vueRef |
| | | } |
| | | |
| | | initLayers () { |
| | | // if (this.bufferLayer != null) { |
| | | this.bufferLayer = this.L.layerGroup().addTo(this.map) |
| | | // } |
| | | // if (this.resultLayer != null) { |
| | | this.resultLayer = this.L.layerGroup().addTo(this.map) |
| | | // } |
| | | } |
| | | |
| | | drawCricleBuffer (center, radius) { |
| | | const circleLocation = new this.L.LatLng(center[1], center[0]) |
| | | const circleOptions = { |
| | | color: '#3effed', |
| | | fillColor: 'white', |
| | | fillOpacity: 0, |
| | | extendedIconClass: 'extend-icon' /* there are 3 classes defined in the marker-extend.css file */ |
| | | } |
| | | const circle = new this.L.CircleEditor(circleLocation, radius * 1000, circleOptions) |
| | | return circle |
| | | } |
| | | |
| | | getCircleCoord (center, radius) { |
| | | const options = { steps: 10, units: 'kilometers' } |
| | | const circle = turf.circle(center, radius, options) |
| | | const coordinate = turf.getCoords(circle) |
| | | return coordinate |
| | | } |
| | | |
| | | QueryInfoByArcgis (url, dis, geom, extent, layers) { |
| | | const that = this |
| | | const data = { |
| | | f: 'json', |
| | | tolerance: dis, |
| | | returnGeometry: 'true', |
| | | returnFieldName: 'false', |
| | | returnUnformattedValues: 'false', |
| | | imageDisplay: '920,622,96', |
| | | geometry: geom, |
| | | geometryType: 'esriGeometryPolygon', |
| | | sr: '4326', |
| | | mapExtent: extent, |
| | | layers: layers |
| | | } |
| | | this.vueRef.datas = [] |
| | | this.vueRef.allDatas = [] |
| | | this.vueRef.currentX = this.currentX |
| | | this.vueRef.currentY = this.currentY |
| | | this.vueRef.total = 0 |
| | | this.vueRef.total1 = 0 |
| | | this.vueRef.countsMap = {} |
| | | this._postQuery(url, data, function (res) { |
| | | console.log(res) |
| | | if (res.results != null && res.results.length !== 0) { |
| | | that.drawGraphic(res.results) |
| | | for (let i = 0; i < res.results.length; i++) { |
| | | const ndata = { |
| | | layerId: res.results[i].layerId, |
| | | layerName: res.results[i].layerName, |
| | | displayFieldName: res.results[i].displayFieldName, |
| | | value: res.results[i].value, |
| | | attributes: res.results[i].attributes, |
| | | geometryType: res.results[i].geometryType, |
| | | geometry: res.results[i].geometry, |
| | | feature: { |
| | | attributes: res.results[i].attributes, |
| | | geometry: res.results[i].geometry |
| | | } |
| | | } |
| | | that.queryResults.push(ndata) |
| | | } |
| | | // fillBufferResult(nrltData,currShowBufferLayerIndex);//填充面板 |
| | | that.fillBufferResultPanel(that.queryResults) |
| | | } |
| | | }) |
| | | } |
| | | |
| | | QueryInfoByGeoserver (url, dis, geom, extent, layers) { |
| | | const that = this |
| | | const data = { |
| | | service: 'WFS', |
| | | version: '1.1.0', |
| | | request: 'GetFeature', |
| | | // typeName: 'sewer:manhole', |
| | | typeName: 'sewer:pipeline', |
| | | maxFeatures: 50, |
| | | outputFormat: 'application/json', |
| | | srsname: 'EPSG:4326', |
| | | // filter: '<Filter xmlns="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml">\n' + |
| | | // '<Intersects><PropertyName>geom</PropertyName><gml:Polygon srsName="EPSG:4326">\n' + |
| | | // '<gml:outerBoundaryIs>\n' + |
| | | // ' <gml:LinearRing>\n' + |
| | | // eslint-disable-next-line no-irregular-whitespace |
| | | // ' <gml:coordinates>' + geom + '</gml:coordinates>\n' + |
| | | // '</gml:LinearRing>\n' + |
| | | // '</gml:outerBoundaryIs>\n' + |
| | | // '</gml:Polygon></Intersects></Filter>\n' |
| | | |
| | | /* filter: '<Filter xmlns:ogc="http://www.opengis.net/ogc" xmlns:gml="http://www.opengis.net/gml">\n' + |
| | | '\n' + |
| | | '<Intersects> \n' + |
| | | '\n' + |
| | | '<PropertyName>geom</PropertyName>\n' + |
| | | '\n' + |
| | | '<gml:MultiPolygon srsName="EPSG:4490"> \n' + |
| | | '\n' + |
| | | '<gml:polygonMember> \n' + |
| | | '\n' + |
| | | '<gml:Polygon> \n' + |
| | | '\n' + |
| | | '<gml:outerBoundaryIs> \n' + |
| | | '\n' + |
| | | '<gml:LinearRing>\n' + |
| | | '\n' + |
| | | '<gml:coordinates xmlns:gml="http://www.opengis.net/gml" decimal="." cs="," ts="">\n' + |
| | | '\n' + |
| | | geom + |
| | | '\n' + |
| | | '</gml:coordinates> \n' + |
| | | '\n' + |
| | | '</gml:LinearRing> \n' + |
| | | '\n' + |
| | | '</gml:outerBoundaryIs> \n' + |
| | | '\n' + |
| | | '</gml:Polygon> \n' + |
| | | '\n' + |
| | | '</gml:polygonMember> \n' + |
| | | '\n' + |
| | | '</gml:MultiPolygon>\n' + |
| | | '\n' + |
| | | '</Intersects>\n' + |
| | | '\n' + |
| | | '</Filter>' */ |
| | | |
| | | cql_filter: 'INTERSECTS(geom,POLYGON((' + geom + ')))' |
| | | } |
| | | // this.vueRef.datas = [] |
| | | // this.vueRef.allDatas = [] |
| | | // this.vueRef.currentX = this.currentX |
| | | // this.vueRef.currentY = this.currentY |
| | | // this.vueRef.total = 0 |
| | | // this.vueRef.total1 = 0 |
| | | // this.vueRef.countsMap = {} |
| | | this._postQuery(url, data, function (res) { |
| | | console.log(res) |
| | | if (res.results != null && res.results.length !== 0) { |
| | | that.drawGraphic(res.results) |
| | | for (let i = 0; i < res.results.length; i++) { |
| | | const ndata = { |
| | | layerId: res.results[i].layerId, |
| | | layerName: res.results[i].layerName, |
| | | displayFieldName: res.results[i].displayFieldName, |
| | | value: res.results[i].value, |
| | | attributes: res.results[i].attributes, |
| | | geometryType: res.results[i].geometryType, |
| | | geometry: res.results[i].geometry, |
| | | feature: { |
| | | attributes: res.results[i].attributes, |
| | | geometry: res.results[i].geometry |
| | | } |
| | | } |
| | | that.queryResults.push(ndata) |
| | | } |
| | | // fillBufferResult(nrltData,currShowBufferLayerIndex);//填充面板 |
| | | that.fillBufferResultPanel(that.queryResults) |
| | | } |
| | | }) |
| | | } |
| | | |
| | | fillBufferResultPanel (datas) { |
| | | // let resArray = [] |
| | | const that = this |
| | | const layerIds = [] |
| | | for (let j = 0; j < this.bufferQueryLayerArr.length; j++) { |
| | | if (this.bufferQueryLayerArr[j].ifSelected) { |
| | | layerIds.push(this.bufferQueryLayerArr[j].layerid) |
| | | } |
| | | } |
| | | const ndatas = [] |
| | | for (let i = 0; i < datas.length; i++) { |
| | | if (datas[i].layerId === layerIds[0]) { |
| | | const newObj = {} |
| | | newObj.id = i |
| | | if (Number(datas[i].layerId) === 10) { |
| | | newObj.objid = datas[i].feature.attributes.id |
| | | newObj.name = datas[i].feature.attributes.name |
| | | } else { |
| | | newObj.objid = datas[i].feature.attributes.OBJECTID |
| | | newObj.name = datas[i].value |
| | | } |
| | | |
| | | newObj.distance = this.countDisByLatLng(datas[i].feature.geometry.x, datas[i].feature.geometry.y, this.currentX, this.currentY) |
| | | newObj.x = datas[i].feature.geometry.x |
| | | newObj.y = datas[i].feature.geometry.y |
| | | switch (datas[i].layerId) { |
| | | case 5: |
| | | case 3: |
| | | case 8: |
| | | newObj.addr = datas[i].feature.attributes['单位地址'] === 'Null' ? '' : datas[i].feature.attributes['单位地址'] |
| | | newObj.person = datas[i].feature.attributes['联系人'] === 'Null' ? '' : datas[i].feature.attributes['联系人'] |
| | | newObj.tel = datas[i].feature.attributes['联系电话'] === 'Null' ? '' : datas[i].feature.attributes['联系电话'] |
| | | break |
| | | case 10: |
| | | newObj.addr = datas[i].feature.attributes.name |
| | | newObj.person = datas[i].feature.attributes.contact |
| | | newObj.tel = datas[i].feature.attributes.officeTel |
| | | break |
| | | case 9: |
| | | case 15: |
| | | newObj.addr = '' |
| | | newObj.person = datas[i].feature.attributes['负责人'] === 'Null' ? '' : datas[i].feature.attributes['负责人'] |
| | | newObj.tel = datas[i].feature.attributes['联系电话'] === 'Null' ? '' : datas[i].feature.attributes['联系电话'] |
| | | break |
| | | case 7: |
| | | newObj.addr = '' |
| | | newObj.person = '' |
| | | newObj.tel = datas[i].feature.attributes['联系方式'] === 'Null' ? '' : datas[i].feature.attributes['联系方式'] |
| | | break |
| | | case 1: |
| | | newObj.addr = '' |
| | | newObj.person = datas[i].feature.attributes['负责人'] === 'Null' ? '' : datas[i].feature.attributes['负责人'] |
| | | newObj.tel = datas[i].feature.attributes['联系电话'] === 'Null' ? '' : datas[i].feature.attributes['联系电话'] |
| | | break |
| | | } |
| | | ndatas.push(newObj) |
| | | } |
| | | } |
| | | this.vueRef.datas = ndatas |
| | | this.vueRef.allDatas = datas |
| | | this.vueRef.currentX = this.currentX |
| | | this.vueRef.currentY = this.currentY |
| | | this.vueRef.total = datas.length |
| | | this.vueRef.total1 = ndatas.length |
| | | const Map = {} |
| | | for (let k = 0; k < layerIds.length; k++) { |
| | | const id = layerIds[k] |
| | | Map[id] = that.getCountByLayerID(datas, layerIds[k]) |
| | | } |
| | | this.vueRef.countsMap = Map |
| | | } |
| | | |
| | | /** |
| | | *根据两点经纬度计算距离 |
| | | * @param lng1 |
| | | * @param lat1 |
| | | * @param lng2 |
| | | * @param lat2 |
| | | */ |
| | | countDisByLatLng (lng1, lat1, lng2, lat2) { |
| | | const a = this.Rad(lat1) - this.Rad(lat2) |
| | | const b = this.Rad(lng1) - this.Rad(lng2) |
| | | let s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a / 2), 2) + |
| | | Math.cos(this.Rad(lat1)) * Math.cos(this.Rad(lat2)) * Math.pow(Math.sin(b / 2), 2))) |
| | | s = s * 6378137.0 |
| | | s = Math.round(s * 10000) / 10000000 |
| | | return s.toFixed(3) |
| | | } |
| | | |
| | | Rad (d) { |
| | | return d * Math.PI / 180.0 |
| | | } |
| | | |
| | | /** |
| | | * 根据图层id 获取 各个图层查询结果的数量 |
| | | * @param arrs |
| | | * @param id |
| | | */ |
| | | getCountByLayerID (arrs, id) { |
| | | let count = 0 |
| | | for (let i = 0; i < arrs.length; i++) { |
| | | if (arrs[i].layerId === id) { |
| | | count++ |
| | | } |
| | | } |
| | | return count |
| | | } |
| | | |
| | | _postQuery (url, data, cb) { |
| | | $.ajax({ |
| | | type: 'GET', |
| | | url: url, |
| | | dataType: 'json', |
| | | data: data, |
| | | timeout: 600000, |
| | | async: true, |
| | | success: function (datas) { |
| | | cb(datas) |
| | | }, |
| | | error: function (e) { |
| | | console.log('返回的错误信息:', e) |
| | | return null |
| | | } |
| | | }) |
| | | } |
| | | |
| | | drawGraphic (data) { |
| | | for (let i = 0; i < data.length; i++) { |
| | | const pt = [data[i].geometry.y, data[i].geometry.x] |
| | | const iconUrl = this.getIconUrl(data[i].layerId) |
| | | const icon = new this.L.Icon({ iconUrl: iconUrl, iconSize: [20, 20], iconAnchor: [10, 10] }) |
| | | const marker = this.L.marker(pt, { |
| | | icon: icon, |
| | | attributes: data[i] |
| | | }) |
| | | this.markerBindPopup(marker) |
| | | this.resultMarkers.push(marker) |
| | | this.resultLayer.addLayer(marker) |
| | | } |
| | | } |
| | | |
| | | markerBindPopup (maker) { |
| | | const name = maker.options.attributes.value |
| | | const layerId = maker.options.attributes.layerId |
| | | let addr = '' |
| | | let person = '' |
| | | let tel = '' |
| | | const distance = this.countDisByLatLng(maker.options.attributes.geometry.x, maker.options.attributes.geometry.y, this.currentX, this.currentY) |
| | | switch (layerId) { |
| | | case 5: |
| | | case 3: |
| | | case 8: |
| | | addr = maker.options.attributes.attributes['单位地址'] === 'Null' ? '' : maker.options.attributes.attributes['单位地址'] |
| | | person = maker.options.attributes.attributes['联系人'] === 'Null' ? '' : maker.options.attributes.attributes['联系人'] |
| | | tel = maker.options.attributes.attributes['联系电话'] === 'Null' ? '' : maker.options.attributes.attributes['联系电话'] |
| | | break |
| | | case 10: |
| | | addr = maker.options.attributes.attributes.name |
| | | person = maker.options.attributes.attributes.contact |
| | | tel = maker.options.attributes.attributes.officeTel |
| | | break |
| | | case 9: |
| | | case 15: |
| | | addr = '' |
| | | person = maker.options.attributes.attributes['负责人'] === 'Null' ? '' : maker.options.attributes.attributes['负责人'] |
| | | tel = maker.options.attributes.attributes['联系电话'] === 'Null' ? '' : maker.options.attributes.attributes['联系电话'] |
| | | break |
| | | case 7: |
| | | addr = '' |
| | | person = '' |
| | | tel = maker.options.attributes.attributes['联系方式'] === 'Null' ? '' : maker.options.attributes.attributes['联系方式'] |
| | | break |
| | | case 1: |
| | | addr = '' |
| | | person = maker.options.attributes.attributes['负责人'] === 'Null' ? '' : maker.options.attributes.attributes['负责人'] |
| | | tel = maker.options.attributes.attributes['联系电话'] === 'Null' ? '' : maker.options.attributes.attributes['联系电话'] |
| | | break |
| | | } |
| | | |
| | | const html = '<div style="width: 306px; height: 156px" class="aroundPanel">' + |
| | | '<div class="header">周边环境</div>' + |
| | | '<table width="100%" border="0" align="center" cellpadding="0" cellspacing="0" class="editform edit-pf bg1 pd1" style="color: #deebf9;line-height: 26px;">\n' + |
| | | ' <tr>\n' + |
| | | ' <td width="10%" align="right" valign="top" class="zt05">名称:</td>\n' + |
| | | ' <td width="19%" align="left" valign="top" class="zt05" id="name">' + name + '</td>\n' + |
| | | ' </tr>\n' + |
| | | ' <tr>\n' + |
| | | ' <td align="right" valign="top" class="zt05">地址:</td>\n' + |
| | | ' <td align="left" valign="top" class="zt05" id="addr">' + addr + '</td>\n' + |
| | | ' </tr>\n' + |
| | | ' <tr>\n' + |
| | | ' <td align="right" valign="top" class="zt05">负责人:</td>\n' + |
| | | ' <td align="left" valign="top" class="zt05" id="person">' + person + '</td>\n' + |
| | | ' </tr>\n' + |
| | | ' <tr>\n' + |
| | | ' <td align="right" valign="top" class="zt05">联系电话:</td>\n' + |
| | | ' <td align="left" valign="top" class="zt05" id="tel">' + tel + '</td>\n' + |
| | | ' </tr>\n' + |
| | | ' <tr>\n' + |
| | | ' <td align="right" valign="top" class="zt05 line-dotted">距离(公里):</td>\n' + |
| | | ' <td align="left" valign="top" class="zt05 line-dotted" id="distance">' + distance + '</td>\n' + |
| | | ' </tr>\n' + |
| | | ' </table>' + |
| | | '</div>' |
| | | maker.bindPopup(html, { |
| | | closeButton: false, |
| | | offset: this.L.point(0, -0.5) |
| | | }) |
| | | } |
| | | |
| | | getIconUrl (index) { |
| | | let url = null |
| | | switch (index) { |
| | | case 1: |
| | | url = zrbhq |
| | | break |
| | | case 2: |
| | | url = yjdw |
| | | break |
| | | case 3: |
| | | url = gadw |
| | | break |
| | | case 5: |
| | | url = yy |
| | | break |
| | | case 7: |
| | | url = st |
| | | break |
| | | case 8: |
| | | url = yjzy |
| | | break |
| | | case 10: |
| | | url = xfdw |
| | | break |
| | | case 15: |
| | | url = mgmb |
| | | break |
| | | } |
| | | return url |
| | | } |
| | | |
| | | bufferQuery (currEventX, currEventY) { |
| | | this.currentX = currEventX |
| | | this.currentY = currEventY |
| | | const that = this |
| | | if (this.bufferLayer) { |
| | | this.bufferLayer.clearLayers() |
| | | } |
| | | this.map.setView(this.L.latLng(currEventY, currEventX), 11) |
| | | const circle = this.drawCricleBuffer([currEventX, currEventY], this.radius) |
| | | this.bufferLayer.addLayer(circle) |
| | | circle.on('edit', function () { |
| | | that.doBuffer(circle.getRadius() / 1000, that.bufferQueryLayerArr, that.currentX, that.currentY) |
| | | that.currentRadius = circle.getRadius() / 1000 |
| | | }) |
| | | this.doBuffer(this.radius, this.bufferQueryLayerArr, currEventX, currEventY) |
| | | } |
| | | |
| | | doBuffer (radius, bufferQueryLayerArr, currEventX, currEventY) { |
| | | this.bufferResultLayerArr = this.getBufferLayerArr(bufferQueryLayerArr) |
| | | this.bufferSearch(this.bufferResultLayerArr, radius, currEventX, currEventY) |
| | | } |
| | | |
| | | getBufferLayerArr (arr) { |
| | | var resultArr = [] |
| | | for (let i = 0; i < arr.length; i++) { |
| | | const obj = arr[i] |
| | | if (obj.ifSelected === 1) { |
| | | resultArr.push(obj.layerid) |
| | | } |
| | | } |
| | | return resultArr |
| | | } |
| | | |
| | | bufferSearch (layerIDs, radius, currEventX, currEventY) { |
| | | const that = this |
| | | that.resultMarker = [] |
| | | that.queryResults = [] |
| | | if (that.resultLayer) { |
| | | that.resultLayer.clearLayers() |
| | | } |
| | | // if (layerIDs == null || layerIDs.length === 0) { |
| | | // return null |
| | | // } |
| | | const xfIndex = layerIDs.indexOf(10) |
| | | if (xfIndex > -1) { |
| | | } |
| | | let queryLayerStr = 'all:' |
| | | for (let j = 0; j < layerIDs.length; j++) { |
| | | if (layerIDs[j] !== 10) { |
| | | queryLayerStr += layerIDs[j] + ',' |
| | | } |
| | | } |
| | | queryLayerStr = queryLayerStr.substring(0, queryLayerStr.length - 1) |
| | | const coord = that.getCircleCoord([currEventX, currEventY], radius) |
| | | const str = that.sgisTransfromToArcGeom(coord) |
| | | debugger |
| | | const bounds = this.map.getBounds() |
| | | const extent = bounds.toBBoxString() |
| | | debugger |
| | | if (window.vm.$nodeEnv === 'production') { |
| | | that.QueryInfoByGeoserver(MapConfig.mapConfig.bufferQueryUrlProd, radius, str, extent, queryLayerStr) |
| | | // that.QueryInfoByArcgis(MapConfig.mapConfig.bufferQueryUrlProd, radius, str, extent, queryLayerStr) |
| | | } else { |
| | | that.QueryInfoByGeoserver(MapConfig.mapConfig.bufferQueryUrlProd, radius, str, extent, queryLayerStr) |
| | | // that.QueryInfoByArcgis(MapConfig.mapConfig.bufferQueryUrlProd, radius, str, extent, queryLayerStr) |
| | | } |
| | | } |
| | | |
| | | sgisTransfromToArcGeom (coord) { |
| | | const geomStr = '' |
| | | let str = '' |
| | | for (let i = 0; i < coord[0].length; i++) { |
| | | str += coord[0][i][0] + ' ' + coord[0][i][1] + ',' |
| | | } |
| | | str = str.substring(0, str.length - 1) |
| | | const endStr = geomStr + str |
| | | return endStr |
| | | } |
| | | |
| | | /* sgisTransfromToArcGeom (coord) { |
| | | const geomStr = '{"rings":[[' |
| | | let str = '' |
| | | for (let i = 0; i < coord[0].length; i++) { |
| | | str += '[' + coord[0][i][0] + ',' + coord[0][i][1] + '],' |
| | | } |
| | | str = str.substring(0, str.length - 1) |
| | | const endStr = geomStr + str + ']]}' |
| | | return endStr |
| | | } */ |
| | | setBufferQueryLayerArr (bufferQueryLayerArr) { |
| | | this.bufferQueryLayerArr = bufferQueryLayerArr |
| | | } |
| | | |
| | | cleanLayer () { |
| | | if (this.bufferLayer) { |
| | | this.bufferLayer.clearLayers() |
| | | } |
| | | if (this.resultLayer) { |
| | | this.resultLayer.clearLayers() |
| | | } |
| | | this.map.closePopup() |
| | | } |
| | | } |
| | | export default BufferQuery |