import "ol/ol.css"; import { Map, View } from 'ol'; import TileLayer from 'ol/layer/Tile'; import XYZ from 'ol/source/XYZ' import { fromLonLat, get, transform , Projection, addProjection } from 'ol/proj'; import MousePosition from 'ol/control/MousePosition'; import VectorLayer from 'ol/layer/Vector'; import VectorSource from 'ol/source/Vector'; import { Fill, Stroke, Circle, Style, Icon, Text } from 'ol/style'; import Feature from 'ol/Feature'; import LinearRing from 'ol/geom/LinearRing'; import Overlay from 'ol/Overlay'; import TileArcGISRest from 'ol/source/TileArcGISRest'; import myMap from "@/utils/map.js"; import request from '@/utils/requestTwo.js' import EsriJSON from 'ol/format/EsriJSON'; import { getTopLeft, getWidth, buffer, getCenter } from 'ol/extent'; import '@/assets/less/map.less' import MapConfig from '@/utils/mapconfig'; import GeoJSON from 'ol/format/GeoJSON'; import { getVectorContext } from 'ol/render'; import store from '@/store' import { GetFieldValue } from "@/api/ghyzt/yztfield.js"; import VectorTileLayer from 'ol/layer/VectorTile'; import VectorTileSource from 'ol/source/VectorTile'; import MVT from 'ol/format/MVT'; import { createXYZ } from 'ol/tilegrid'; import { appendParams } from 'ol/uri'; import axios from "axios"; import { createMapboxStreetsV6Style } from "@/utils/mvt_style.js"; import proj4 from 'proj4'; import { register } from 'ol/proj/proj4' import WMTS from 'ol/source/WMTS'; import WMTSTileGrid from 'ol/tilegrid/WMTS'; import { LineString, MultiLineString, MultiPoint, MultiPolygon, Point, Polygon, } from 'ol/geom'; import { baseLayer } from './map.js' import { assertEnumMember } from "@babel/types"; import { ElMessage } from "element-plus"; proj4.defs("EPSG:4490", "GEOGCS[\"China Geodetic Coordinate System 2000\",DATUM[\"China_2000\",SPHEROID[\"CGCS2000\",6378137,298.257222101,AUTHORITY[\"EPSG\",\"1024\"]],AUTHORITY[\"EPSG\",\"1043\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4490\"]]"); register(proj4); var map; const arcMap = (function() { var myMaps = { _basemap: null, _domid: null, _EPSG: null, _center: [121.662, 43.798], EPSG: { C3857: 'EPSG:3857', C4326: 'EPSG:4326', C4490: 'EPSG:4490', //国家2000 C4610: 'EPSG:4610', //西安1980 }, //地图 map: {}, //对比的地图 map1: null, map2: null, map3: null, map4: null, //比较地图 compareMap(type, view, item, option) { var imgsource; if (option.source) { imgsource = option.source } else { if (item.type == 'WMTS') { imgsource = new XYZ({ url: item.url + `/tile/{z}/{y}/{x}`, }); } else { imgsource = new TileArcGISRest({ url: item.url, }); } } myMap[type] = arcMap[type] = new Map({ layers: [ new TileLayer({ name: item.url, source: imgsource, }) ], view: view, target: type }) var la = new VectorLayer({ name: "compare-feature", declutter: false, source: new VectorSource({ features: [], }), style: new Style({ stroke: new Stroke({ color: '#1171d6', width: 4, lineDash: [1, 2, 3, 4, 5, 6], }), }), zIndex: 9, visible: true }); var la1 = new VectorLayer({ name: "detailedLayer", declutter: false, className: 'layer', source: new VectorSource({ features: [], }), style: new Style({ stroke: new Stroke({ color: '#ff0000', width: 2, }), }), zIndex: 9, visible: true }); var pointLayer = new VectorLayer({ zIndex: 999, declutter: false, source: new VectorSource(), visible: false, }); arcMap.addLayer(pointLayer, type); // 把绘制了的canvas设置到style里面 var style = new Style({ image: new Icon({ src: new URL('../assets/map/point.png', import.meta.url).href, // imgSize: [canvas.width, canvas.height], // rotation: (item.psjd-90) * Math.PI / 180 }) }); //创建一个Feature,并设置好在地图的位置 var shape = new Feature({ geometry: new Point([view.getCenter()[0], view.getCenter()[1]]), id:'screenCenter'+type, }); // 应用具有不规则几何图形的样式到Feature shape.setId('screenCenter'+type) shape.setStyle(style); // 将Feature添加到之前的创建的layer中去 pointLayer.getSource().addFeature(shape); arcMap[type].addLayer(la, type); arcMap[type].addLayer(la1, type); if (option.click) { arcMap[type].on('singleclick', function(evt) { for (var i = 1; i <= 4; i++) { if (arcMap['map' + i]) { arcMap['map' + i].removeOverlay(arcMap['map' + i].getOverlayById("popup_temp" + 'map' + i)); } } var lonlat = arcMap.webMercatorToWgs84(evt.coordinate[0], evt.coordinate[1]); var view = arcMap[type].getView(); arcMap.SearchWfsByLoc(item.url, `${lonlat[0]},${lonlat[1]}`, (view.getResolution() * 6.7), function(d, f) { if (d.length) { for (var i = 1; i <= 4; i++) { if (arcMap['map' + i]) { var _cmap = arcMap.getLayerByNameAndMap('compare-feature', 'map' + i); _cmap.getSource().clear(); _cmap.getSource().addFeatures(d); } } if (!item.attrs) { var data = d[0].getProperties(); var header = []; for (let key in data) { if (key != 'geometry') { header.push({ sxbm: key, sxmc: key }) } } item.attrs = header; } arcMap.popupInfo({ feature: d[0], type: type, position: evt, title: item.name, attrs: item.attrs }) arcMap[type].updateSize(); } else { } }) }); } if (option.autoPupop) { // arcMap[type].on('movestart',function(evt){ // pointLayer.setVisible(false) // }) arcMap[type].on('moveend',function(evt){ let cur_feature = pointLayer.getSource().getFeatureById('screenCenter'+type) if(cur_feature){ let CPoint = [arcMap[type].getView().getCenter()[0], arcMap[type].getView().getCenter()[1]] cur_feature.setGeometry(new Point(CPoint)) var lonlat = arcMap.webMercatorToWgs84(CPoint[0], CPoint[1]); var view = arcMap[type].getView(); for (var i = 1; i <= 4; i++) { if (arcMap['map' + i]) { arcMap['map' + i].removeOverlay(arcMap['map' + i].getOverlayById("popup_temp" + 'map' + i)); } } arcMap.SearchWfsByLoc(item.url, `${lonlat[0]},${lonlat[1]}`, (view.getResolution() * 6.7), function(d, f) { if (d.length) { for (var i = 1; i <= 4; i++) { if (arcMap['map' + i]) { var _cmap = arcMap.getLayerByNameAndMap('compare-feature', 'map' + i); _cmap.getSource().clear(); _cmap.getSource().addFeatures(d); } } if (!item.attrs) { var data = d[0].getProperties(); var header = []; for (let key in data) { if (key != 'geometry') { header.push({ sxbm: key, sxmc: key }) } } item.attrs = header; } arcMap.popupInfo({ feature: d[0], type: type, position: {coordinate:CPoint} , title: item.name, attrs: item.attrs }) arcMap[type].updateSize(); } }) } // pointLayer.setVisible(true) }) } }, loadMap: function(domId, par = {}) { var _op = { center: MapCenter.point, zoom: 8, base: ["tdtImg", "tdtImgAnn", "tdtVec", "tdtVecAnn", "jxMap", "cityLine"], view: null }; var option = Object.assign({}, _op, par); //构建默认地图视图 if (!option.view) { option.view = new View({ projection: get('EPSG:3857'), center: fromLonLat(option.center), zoom: option.zoom, units: 'm', minZoom: 2, }) } arcMap._EPSG = arcMap.EPSG.C3857; this._domid = domId; this._basemap = []; for (var i = 0; i < option.base.length; i++) { var _layer = baseLayer[option.base[i]](); if (_layer) { if (i == 0) { _layer.setVisible(true); } arcMap._basemap.push(_layer); } } map = myMap.map = arcMap.map = new Map({ target: domId, layers: this._basemap, view: option.view }); this.tempLayers.init(); if (!option.hideCity) this.cityLineDefault(!par.zoom) else if (!par.zoom) myMap.zoomToextent(MapCenter.extent) }, tempLayers: { _draw: "dview_draw_Layer", _search: "dview_search_Layer", dview_draw_Layer: null, dview_search_Layer: null, init: function() { if (!arcMap.getLayer(this._draw)) { arcMap.addLayer(arcMap.CreateVecLayer(this._draw)); this.dview_draw_Layer = arcMap.getLayer(this._draw); } if (!arcMap.getLayer(this._search)) { arcMap.addLayer(arcMap.CreateVecLayerOfPopup(this._search)); this.dview_search_Layer = arcMap.getLayer(this._search); this.dview_search_Layer.setStyle(arcMap.SetSelectStyle); } }, clear: function(layer) { if (layer) { layer.getSource().clear(); } else { this.dview_draw_Layer.getSource().clear(); this.dview_search_Layer.getSource().clear(); } } }, cityLineDefault(zoom) { request({ url: `/js/${XZQ_DM}.geojson`, method: 'get', }).then(res => { var f = new GeoJSON().readFeatures(Base64.decode(res)); var city = baseLayer.cityLine(); city.getSource().addFeatures(f); city.setVisible(true); arcMap.addLayer(city); if (zoom) arcMap.zoomToextent(f[0].getGeometry().getExtent()) }) }, //按name获取 getLayer: function(name) { var layer_ = null; this.map.getLayers().forEach(function(layer, i) { if (layer && layer.get("name") && layer.get("name") == name.toString()) { layer_ = layer; return; } }); return layer_; }, //按id获取 getLayerById: function(id) { var layer_ = null; this.map.getLayers().forEach(function(layer, i) { if (layer && layer.get("id") && layer.get("id") == id.toString()) { layer_ = layer; return; } }); return layer_; }, //获取指定地图的图层 getLayerByNameAndMap: function(name, type) { var layer_ = null; this[type].getLayers().forEach(function(layer) { if (layer && layer.get("name") && layer.get("name") == name) { layer_ = layer; return; } }); return layer_; }, zoomToextent: function(extent, meters) { meters = meters || 1000 var view = arcMap.map.getView() view.fit(buffer(extent, meters), arcMap.map.getSize()); }, zoomToFeature: function(feature, meters) { meters = meters || 1000; let extent; //添加支持多个feature sky220622 if (Array.isArray(feature)) { let cords = []; for (let i = 0; i < feature.length; i++) { let cord = feature[i].getGeometry().getExtent(); cords.push([cord[0], cord[1]]); cords.push([cord[2], cord[3]]); } let testfs = new Feature({ geometry: new LineString(cords) }) extent = testfs.getGeometry().getExtent(); } else { extent = feature.getGeometry().getExtent(); } arcMap.map.zoomToextent(feature.getGeometry().getExtent(), meters) }, //缩放到中心点 zoomToCenter: function(zoom, center) { var view = arcMap.map.getView() view.setZoom(zoom || 12); view.setCenter(fromLonLat(center || myMaps._center)); }, //缩放到图层 zoomToLayer: function(layurl, cl) { var url = layurl + '?f=pjson' //空间查询url; request({ method: 'get', url: url, }).then(res => { var extent = [res.fullExtent.xmin, res.fullExtent.ymin, res.fullExtent.xmax, res.fullExtent.ymax]; myMaps.zoomToextent(extent, 20000) if (cl) cl(extent); }) }, //移动 moveToFeature: function(feature) { let extent; //sky220622 添加支持多个feature if (Array.isArray(feature)) { let cords = []; for (let i = 0; i < feature.length; i++) { let cord = feature[i].getGeometry().getExtent(); cords.push([cord[0], cord[1]]); cords.push([cord[2], cord[3]]); } let testfs = new Feature({ geometry: new LineString(cords) }) extent = testfs.getGeometry().getExtent(); } else { extent = feature.getGeometry().getExtent(); } var center = getCenter(extent) var view = arcMap.map.getView() view.setCenter(center); arcMap.map.render(); }, addLayer: function(layer, type) { if (type) { this[type].addLayer(layer); } else { this.map.addLayer(layer); } }, //删除图层 removeLayer: function(layer) { var _layer = layer if (typeof(layer) == "string") _layer = arcMap.getLayer(layer) if (_layer) _layer.setVisible(false); this.map.removeLayer(_layer); }, CreateVecLayer: function(layername, style, popup) { style = style || new Style({ fill: new Fill({ color: 'rgba(255, 255, 255, 0.2)' }), stroke: new Stroke({ color: '#00008B', width: 2 }), image: new Circle({ radius: 7, fill: new Fill({ color: '#00008B' }) }) }); if (typeof(style) == "string") { style = MapConfig[style].style; } var _VectorLayer = new VectorLayer({ zIndex: 9, declutter: false, source: new VectorSource(), name: layername, style: style, visible: true }); if (popup) this.CreateLayerPopup(_VectorLayer, popup); return _VectorLayer; }, SetSelectStyle: function(feature, resolution) { return new Style({ fill: new Fill({ color: 'rgba(255, 255, 255, 0.2)' }), stroke: new Stroke({ color: '#ffcc33', width: 2 }), image: new Circle({ radius: 7, fill: new Fill({ color: '#ffcc33' }) }), }); }, //地图平移 animateByGeom(g) { var view = arcMap.map.getView(); var center = g.getCenter(); view.animate({ center: fromLonLat([center[0], center[1]]), zoom: arcMap.map.getView().getZoom(), duration: 1000, }); }, CreateVecLayerOfPopup: function(layername, style) { return this.CreateVecLayer(layername, style, true); }, CreateLayerPopup: function(layer, popup) { if (layer && typeof(layer) != "object") layer = arcMap.getLayer(layer); if (layer) layer.popupInfo = popup; return layer; }, lonLatToWebMercator: function(lon, lat) { var x = lon * 20037508.34 / 180; var y = Math.log(Math.tan((90 + lat) * Math.PI / 360)) / (Math.PI / 180); y = y * 20037508.34 / 180; return [x, y]; }, webMercatorToWgs84: function(x, y) { var lon = x / 20037508.34 * 180; var lat = y / 20037508.34 * 180; lat = 180 / Math.PI * (2 * Math.atan(Math.exp(lat * Math.PI / 180)) - Math.PI / 2); return [lon, lat]; }, LonLatDisplay: function() { var mousePositionControl = new MousePosition({ coordinateFormat: function(e) { var es = arcMap.webMercatorToWgs84(e[0], e[1]) return "经度:" + es[0].toFixed(2) + "° , 纬度:" + es[1].toFixed(2) + "°"; }, projection: get('EPSG:3857'), className: 'lonlat', target: document.getElementById('lonlat'), undefinedHTML: ' ', }); mousePositionControl.setMap(arcMap.map); }, removePopupOverlay: function() { arcMap.map.removeOverlay(arcMap.getPopupOverlay()); }, getPopupOverlay: function() { return this.map.getOverlayById("popup_temp"); }, addOverlay: function(Overlay, type) { if (type) { this[type].addOverlay(Overlay); } else { this.map.addOverlay(Overlay); } }, //地图弹窗--点 popupInfo: function(option) { var feature = option.feature; var evt = option.position; var _popupId_ = option.type ? "popup_temp" + option.type : "popup_temp"; if (typeof(option.type) == 'string') { arcMap[option.type].removeOverlay(this.map.getOverlayById(_popupId_)); } else { option.type = null; arcMap.map.removeOverlay(arcMap.getPopupOverlay()); } var html = arguments[1]; if (!html) { html = "