12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485 |
- import { Tile } from "ol/layer";
- import TileWMTS from "ol/tilegrid/WMTS";
- import { WMTS } from "ol/source";
- import { Projection, get as getProjection, getTransform } from "ol/proj";
- import { register } from "ol/proj/proj4";
- import proj4 from "proj4";
- import { applyTransform, getTopLeft, getWidth } from "ol/extent";
- // 注册cgcs2000坐标转换器
- 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);
- const getTileWMTSTileGrid = (from: Projection, to: Projection) => {
- const projectionExtent = to.getExtent();
- const origin = projectionExtent ? getTopLeft(projectionExtent) : [-180, 90];
- const fromLonLat = getTransform(from, to);
- const width = projectionExtent
- ? getWidth(projectionExtent)
- : getWidth(applyTransform([-180.0, -90.0, 180.0, 90.0], fromLonLat));
- const resolutions = [];
- const matrixIds = [];
- for (let z = 1; z < 19; z++) {
- resolutions[z] = width / (256 * Math.pow(2, z));
- matrixIds[z] = z.toString();
- }
- return new TileWMTS({
- origin: origin,
- resolutions: resolutions,
- matrixIds: matrixIds,
- });
- };
- const tileTMaps = {
- 全球境界: "ibo",
- 地形注记: "cta",
- 地形晕渲: "ter",
- 影像注记: "cia",
- 影像底图: "img",
- 矢量注记: "cva",
- 矢量底图: "vec",
- };
- const wmtsProjection = getProjection("EPSG:4490")!;
- const tileGridCache: { [key in string]: TileWMTS } = {};
- const typeWMTSCacne: { [key in string]: WMTS } = {};
- const getWMTS = (type: TileType, mapEpsg: string) => {
- if (typeWMTSCacne[mapEpsg + type]) {
- return typeWMTSCacne[mapEpsg + type];
- }
- const wmtsTileGrid =
- mapEpsg in tileGridCache
- ? tileGridCache[mapEpsg]
- : getTileWMTSTileGrid(getProjection(mapEpsg)!, wmtsProjection);
- const layer = tileTMaps[type];
- const key = "69167db5c31974a619fe60f0c4cd21b5";
- const url = `https://t0.tianditu.gov.cn/${layer}_c/wmts?tk=${key}`;
- return new WMTS({
- url,
- layer,
- version: "1.0.0",
- matrixSet: "c",
- format: "tiles",
- projection: wmtsProjection,
- requestEncoding: "KVP",
- style: "default",
- tileGrid: wmtsTileGrid,
- });
- };
- export type TileType = keyof typeof tileTMaps;
- export const baseTileLayer = new Tile();
- export const geoTileLayer = new Tile({
- source: getWMTS("矢量注记", "EPSG:4326"),
- });
- export const setBaseTileType = (type: TileType) => {
- baseTileLayer.setSource(getWMTS(type, "EPSG:4326"));
- };
|