|
@@ -0,0 +1,107 @@
|
|
|
+// 引入OpenLayers的主模块
|
|
|
+import Map from 'ol/Map';
|
|
|
+import View from 'ol/View';
|
|
|
+import Projection from 'ol/proj/Projection';
|
|
|
+import { getWidth, getTopLeft } from 'ol/extent';
|
|
|
+import TileLayer from 'ol/layer/Tile';
|
|
|
+import WMTS from 'ol/source/WMTS';
|
|
|
+import WMTSTileGrid from 'ol/tilegrid/WMTS';
|
|
|
+import WMTSCapabilities from 'ol/format/WMTSCapabilities';
|
|
|
+import proj4 from 'proj4';
|
|
|
+import { register } from 'ol/proj/proj4';
|
|
|
+import { defaults } from 'ol/control';
|
|
|
+import axios from 'axios';
|
|
|
+
|
|
|
+interface Options {
|
|
|
+ center: number[];
|
|
|
+ zoom?: number;
|
|
|
+ maxZoom?: number;
|
|
|
+ minZoom?: number;
|
|
|
+}
|
|
|
+interface layerParam {
|
|
|
+ layerName: string;
|
|
|
+ styleName: string;
|
|
|
+ tilematrixset: string;
|
|
|
+ format: string
|
|
|
+}
|
|
|
+
|
|
|
+proj4.defs('EPSG:4490', '+proj=longlat +ellps=GRS80 +no_defs +type=crs');
|
|
|
+proj4.defs('EPSG:4525', '+proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=37500000 +y_0=0 +ellps=GRS80 +units=m +no_defs +type=crs');
|
|
|
+register(proj4);
|
|
|
+const commonUrl = import.meta.env.VITE_APP_BASE_API + '/api/oneShare/proxyHandler/mm/'
|
|
|
+const projection = new Projection({
|
|
|
+ code: 'EPSG:4490',
|
|
|
+ units: 'degrees'
|
|
|
+});
|
|
|
+const projectionExtent = [-180, -90, 180, 90];
|
|
|
+const size = getWidth(projectionExtent) / 256;
|
|
|
+const resolutions = [];
|
|
|
+for (let z = 2; z < 22; ++z) {
|
|
|
+ resolutions[z] = size / Math.pow(2, z);
|
|
|
+}
|
|
|
+
|
|
|
+export class OpenLayersMap {
|
|
|
+ private map: Map;
|
|
|
+ constructor(element: HTMLElement | string, options?: Options = {}) {
|
|
|
+ this.map = new Map({
|
|
|
+ controls: defaults({
|
|
|
+ zoom: false,
|
|
|
+ rotate: false
|
|
|
+ }),
|
|
|
+ layers: [],
|
|
|
+ target: element,
|
|
|
+ view: new View({
|
|
|
+ center: options.center && options.center.length === 2 ? [options.center[0], options.center[1]] : [110.90153121597234, 21.98323671981171],
|
|
|
+ zoom: options.zoom ? options.zoom : 9.6,
|
|
|
+ projection: projection,
|
|
|
+ maxZoom: options.maxZoom ? options.maxZoom : 18,
|
|
|
+ minZoom: options.minZoom ? options.minZoom : 1
|
|
|
+ })
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ formatXml(code: string, minZoom?: number, maxZoom?: number, zIndex?: number, visible?: boolean) {
|
|
|
+ const xml = new WMTSCapabilities();
|
|
|
+ this.getCapabilities(code).then((lists) => {
|
|
|
+ const mapData = xml.read(lists.data);
|
|
|
+ const layerParam: layerParam = {
|
|
|
+ layerName: mapData.Contents.Layer[0].Title,
|
|
|
+ styleName: mapData.Contents.Layer[0].Style[0].Identifier,
|
|
|
+ tilematrixset: mapData.Contents.TileMatrixSet[0].Identifier,
|
|
|
+ format: mapData.Contents.Layer[0].Format[0]
|
|
|
+ };
|
|
|
+ this.createWmsLayer(code, layerParam, minZoom, maxZoom, zIndex, visible);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ // 请求接口获取地图信息
|
|
|
+ getCapabilities(code) {
|
|
|
+ return axios.get(commonUrl + code);
|
|
|
+ }
|
|
|
+ // 请求地图图片加载图层
|
|
|
+ createWmsLayer(code: string, layerParam: layerParam, minZoom?: number = 0, maxZoom?: number, zIndex?: number = -1, visible?: boolean = true) {
|
|
|
+ const source = new WMTS({
|
|
|
+ url: commonUrl + code,
|
|
|
+ crossOrigin: 'Anonymous',
|
|
|
+ layer: layerParam.layerName,
|
|
|
+ style: layerParam.styleName,
|
|
|
+ matrixSet: layerParam.tilematrixset,
|
|
|
+ format: layerParam.format,
|
|
|
+ wrapX: true,
|
|
|
+ tileGrid: new WMTSTileGrid({
|
|
|
+ origin: getTopLeft(projectionExtent),
|
|
|
+ resolutions: resolutions,
|
|
|
+ matrixIds: ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12', '13', '14', '15', '16', '17', '18', '19', '20', '21']
|
|
|
+ })
|
|
|
+ });
|
|
|
+ const layer = new TileLayer({
|
|
|
+ source: source,
|
|
|
+ zIndex: zIndex,
|
|
|
+ minZoom: minZoom,
|
|
|
+ maxZoom,
|
|
|
+ visible: visible
|
|
|
+ });
|
|
|
+ layer.set('layerName', code);
|
|
|
+
|
|
|
+ this.map.addLayer(layer);
|
|
|
+ }
|
|
|
+}
|