| | |
| | | <!-- |
| | | * @Descripttion: |
| | | * @version: |
| | | * @Author: song |
| | | * @Date: 2021-04-08 15:14:57 |
| | | * @LastEditors: song |
| | | * @LastEditTime: 2021-04-24 11:59:43 |
| | | --> |
| | | <template> |
| | | <div id="track_map" |
| | | style="height: 100%"></div> |
| | | </template> |
| | | <script> |
| | | import "ol/ol.css"; |
| | | import OlView from "ol/View.js"; |
| | | // import XYZ from 'ol/source/XYZ' |
| | | import OlLayerTile from "ol/layer/Tile.js"; |
| | | import OlMap from "ol/Map.js"; |
| | | |
| | | import { |
| | | // eslint-disable-next-line no-unused-vars |
| | | defaults as OlControlDefaults, |
| | | defaults, |
| | | // 全屏控件 |
| | | FullScreen, |
| | | // 比例尺控件 |
| | | ScaleLine, |
| | | // 缩放滚动条控件 |
| | | // eslint-disable-next-line no-unused-vars |
| | | ZoomSlider, |
| | | // 鼠标位置控件 |
| | | // eslint-disable-next-line no-unused-vars |
| | | MousePosition, |
| | | // -地图属性控件 |
| | | Attribution, |
| | | // 鹰眼控件 |
| | | // eslint-disable-next-line no-unused-vars |
| | | OverviewMap, |
| | | // 缩放到范围控件 |
| | | // eslint-disable-next-line no-unused-vars |
| | | ZoomToExtent, |
| | | Rotate, |
| | | } from "ol/control.js"; |
| | | |
| | | import VectorLayer from "ol/layer/Vector"; |
| | | import VectorSource from "ol/source/Vector"; |
| | | import WMTS from "ol/source/WMTS"; |
| | | |
| | | import WMTSTileGrid from "ol/tilegrid/WMTS"; |
| | | |
| | | import Feature from "ol/Feature.js"; |
| | | import Point from "ol/geom/Point.js"; |
| | | import LineString from "ol/geom/LineString.js"; |
| | | import { Icon, Style, Fill, Stroke } from "ol/style.js"; |
| | | |
| | | import { getWidth, getTopLeft } from "ol/extent"; |
| | | |
| | | import { get as getProjection } from "ol/proj"; |
| | | import XYZ from "ol/source/XYZ"; |
| | | |
| | | import start from "/img/mapicon/start.png"; |
| | | |
| | | export default { |
| | | name: "Map", |
| | | data () { |
| | | return { |
| | | gunAddlayer: new VectorLayer({ |
| | | // 图标图层 |
| | | zIndex: 22, |
| | | source: new VectorSource(), |
| | | }), |
| | | peopleAddlayer: new VectorLayer({ |
| | | // 图标图层 |
| | | zIndex: 22, |
| | | source: new VectorSource(), |
| | | }), |
| | | carAddlayer: new VectorLayer({ |
| | | // 图标图层 |
| | | zIndex: 22, |
| | | source: new VectorSource(), |
| | | }), |
| | | peopleLineAddlayer: new VectorLayer({ |
| | | // 图标图层 |
| | | zIndex: 22, |
| | | source: new VectorSource(), |
| | | }), |
| | | startPoint: new VectorLayer({ |
| | | // 图标图层 |
| | | zIndex: 22, |
| | | source: new VectorSource(), |
| | | }), |
| | | ol2d: null, |
| | | }; |
| | | }, |
| | | mounted () { |
| | | //建立地图 |
| | | this.createmap(1); //1为本地 |
| | | |
| | | this.parentParameter(); |
| | | |
| | | window.ol2d = this.ol2d; |
| | | |
| | | var view = this.ol2d.getView(); |
| | | |
| | | view.setCenter([115.85883507433789, 28.708432053474827]); |
| | | |
| | | view.setZoom(13); |
| | | |
| | | this.ol2d.addLayer(this.gunAddlayer); |
| | | this.ol2d.addLayer(this.peopleAddlayer); |
| | | this.ol2d.addLayer(this.carAddlayer); |
| | | this.ol2d.addLayer(this.peopleLineAddlayer); |
| | | this.ol2d.addLayer(this.startPoint); |
| | | }, |
| | | methods: { |
| | | createmap (val) { |
| | | if (val == 1) { |
| | | // 本地开发使用; |
| | | this.ol2d = new OlMap({ |
| | | layers: [ |
| | | new OlLayerTile({ |
| | | zIndex: 4, |
| | | title: "影像", |
| | | source: new XYZ({ |
| | | url: "https://webmap-tile.sf-express.com/MapTileService/rt?fetchtype=static&x={x}&y={y}&z={z}&project=sfmap&pic_size=256&pic_type=png8&data_name=361100&data_format=merged-dat&data_type=normal", // 行政区划 |
| | | }), |
| | | }), |
| | | // , |
| | | // new OlLayerTile({ |
| | | // zIndex: 5, |
| | | // title: '道路+中文注记', |
| | | // source: new XYZ({ |
| | | // url: 'http://t3.tianditu.com/DataServer?T=cta_w&x={x}&y={y}&l={z}&tk=e9533f5acb2ac470b07f406a4d24b4f0' // 注记 |
| | | // }) |
| | | // }) |
| | | ], |
| | | // 注意地图控件的写法 |
| | | controls: defaults().extend([ |
| | | new FullScreen(), |
| | | new ScaleLine(), |
| | | new MousePosition(), |
| | | new Rotate(), |
| | | new Attribution(), |
| | | ]), |
| | | target: "track_map", |
| | | view: new OlView({ |
| | | center: [0, 0], |
| | | zoom: 2, |
| | | projection: "EPSG:4326", |
| | | }), |
| | | }); |
| | | |
| | | } else { |
| | | var projection = getProjection("EPSG:4326"); |
| | | var projectionExtent = projection.getExtent(); |
| | | var size = getWidth(projectionExtent) / 256; |
| | | var resolutions = []; |
| | | for (var z = 2; z < 19; ++z) { |
| | | //计算比例尺 |
| | | resolutions[z] = size / Math.pow(2, z); |
| | | } |
| | | // 正式服务器上使用 |
| | | this.ol2d = new OlMap({ |
| | | layers: [ |
| | | new OlLayerTile({ |
| | | //矢量地图 |
| | | |
| | | source: new WMTS({ |
| | | url: "http://47.49.21.207:7001/PGIS_S_TileMapServer/Maps/YX", |
| | | layer: "JX14YGJCIMGL7_L14", |
| | | style: "default", |
| | | matrixSet: "JX14YGJCIMGL7_L14", |
| | | format: "image/png", |
| | | wrapX: true, |
| | | tileGrid: new WMTSTileGrid({ |
| | | origin: getTopLeft(projectionExtent), |
| | | //resolutions: res.slice(0, 15), |
| | | resolutions: resolutions, |
| | | matrixIds: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], |
| | | }), |
| | | }), |
| | | }), |
| | | ], |
| | | |
| | | // 注意地图控件的写法 |
| | | controls: defaults().extend([ |
| | | new FullScreen(), |
| | | new ScaleLine(), |
| | | // new MousePosition(), |
| | | new Rotate(), |
| | | new Attribution(), |
| | | ]), |
| | | target: "track_map", |
| | | view: new OlView({ |
| | | center: [115.85883507433789, 28.708432053474827], |
| | | projection: projection, |
| | | zoom: 11, |
| | | maxZoom: 15, |
| | | minZoom: 1, |
| | | }), |
| | | }); |
| | | } |
| | | }, |
| | | addEntitys (item, icon, scale, name, type) { |
| | | this[type].getSource().clear(); |
| | | |
| | | const iconFeature = new Feature({ |
| | | geometry: new Point([Number(item.LGTD), Number(item.LTTD)]), |
| | | name: name, |
| | | attributes: item, |
| | | }); |
| | | |
| | | const iconStyle = new Style({ |
| | | // text: new Text({ // 字体, 未成功, 浪费许多时间 |
| | | // font: 'Normal ' + 12 + 'px ' + 'iconfont', |
| | | // text: "\e645", |
| | | // fill: new Fill({ color: "green" }), |
| | | // }), |
| | | |
| | | image: new Icon({ |
| | | scale: scale, |
| | | opacity: 1, |
| | | src: icon, |
| | | // src: require('../../assets/Mark.png') |
| | | }), |
| | | |
| | | // new CircleStyle({ // 普通样式 |
| | | // radius: 6, |
| | | // fill: new Fill({ |
| | | // color: 'rgba(200, 155, 155, 0.8)' |
| | | // }), |
| | | // stroke: new Stroke({ |
| | | // color: 'black', |
| | | // width: 0.3, |
| | | // }) |
| | | // }), |
| | | }); |
| | | |
| | | iconFeature.setStyle(iconStyle); |
| | | |
| | | this[type].getSource().addFeature(iconFeature); |
| | | |
| | | this.flyTo(Number(item.LGTD), Number(item.LTTD), 13); |
| | | }, |
| | | |
| | | addLines (arr) { |
| | | this.addEntity(arr[0][0], arr[0][1]); |
| | | this.peopleLineAddlayer.getSource().clear(); |
| | | // 点坐标 |
| | | var lineCoords = arr; // 线里点的集合 |
| | | |
| | | // 要素 |
| | | // var lineCoords = [[featureInfo.lineString[0][0],featureInfo.lineString[0][0]],[featureInfo.lineString(0),featureInfo.lineString(0)]]; |
| | | var feature_LineString = new Feature({ |
| | | geometry: new LineString(lineCoords), |
| | | }); |
| | | |
| | | feature_LineString.setStyle( |
| | | new Style({ |
| | | //填充色 |
| | | fill: new Fill({ |
| | | color: "rgba(255, 255, 255, 0.2)", |
| | | }), |
| | | //边线颜色 |
| | | stroke: new Stroke({ |
| | | color: "rgb(252, 94, 32)", |
| | | width: 5, |
| | | }), |
| | | }) |
| | | ); |
| | | |
| | | this.peopleLineAddlayer.getSource().addFeature(feature_LineString); |
| | | |
| | | this.flyTo( |
| | | arr[Math.ceil(arr.length / 2)][0], |
| | | arr[Math.ceil(arr.length / 2)][1], |
| | | 13 |
| | | ); |
| | | }, |
| | | |
| | | addEntity (LGTD, LTTD) { |
| | | this.startPoint.getSource().clear(); |
| | | |
| | | const iconFeature = new Feature({ |
| | | geometry: new Point([LGTD, LTTD]), |
| | | name: "起始点", |
| | | }); |
| | | |
| | | const iconStyle = new Style({ |
| | | // text: new Text({ // 字体, 未成功, 浪费许多时间 |
| | | // font: 'Normal ' + 12 + 'px ' + 'iconfont', |
| | | // text: "\e645", |
| | | // fill: new Fill({ color: "green" }), |
| | | // }), |
| | | |
| | | image: new Icon({ |
| | | anchor: [0.5, 170], //锚点 |
| | | anchorOrigin: "top-left", //锚点源 |
| | | anchorXUnits: "fraction", //锚点X值单位 |
| | | anchorYUnits: "pixels", //锚点Y值单位 |
| | | offsetOrigin: "top-left", |
| | | scale: 0.2, |
| | | opacity: 1, |
| | | src: start, |
| | | // src: require('../../assets/Mark.png') |
| | | }), |
| | | |
| | | // new CircleStyle({ // 普通样式 |
| | | // radius: 6, |
| | | // fill: new Fill({ |
| | | // color: 'rgba(200, 155, 155, 0.8)' |
| | | // }), |
| | | // stroke: new Stroke({ |
| | | // color: 'black', |
| | | // width: 0.3, |
| | | // }) |
| | | // }), |
| | | }); |
| | | |
| | | iconFeature.setStyle(iconStyle); |
| | | |
| | | this.startPoint.getSource().addFeature(iconFeature); |
| | | }, |
| | | |
| | | clearLine () { |
| | | this.peopleLineAddlayer.getSource().clear(); |
| | | this.startPoint.getSource().clear(); |
| | | }, |
| | | |
| | | flyTo (lgtd, lttd, size) { |
| | | var view = this.ol2d.getView(); |
| | | |
| | | view.setCenter([lgtd, lttd]); |
| | | |
| | | view.setZoom(size); |
| | | }, |
| | | |
| | | parentParameter () { |
| | | this.$emit("childParameter", this.ol2d); |
| | | }, |
| | | }, |
| | | }; |
| | | </script> |