首页 > 其他分享 >OpenLayers6使用天地图“经纬度投影(CGCS2000)”和“球面墨卡托投影(EPSG:3857)”WMTS服务

OpenLayers6使用天地图“经纬度投影(CGCS2000)”和“球面墨卡托投影(EPSG:3857)”WMTS服务

时间:2023-12-28 09:46:25浏览次数:36  
标签:EPSG rdquo 投影 let proj key ldquo import


转自:https://blog.csdn.net/nudtcadet/article/details/102908458

1.封装生成图层类

/**
* @fileOverview 天地图WMTS服务API
* @author <a href=”https://blog.csdn.net/nudtcadet”>老胡</a>
* @version 1.0
*/
import { getWidth, getTopLeft } from 'ol/extent';
import WMTS from 'ol/tilegrid/WMTS';
import { WMTS as WMTSSource } from 'ol/source';
import TileLayer from 'ol/layer/Tile';
import { get as getProjection, getTransform } from 'ol/proj';
import { applyTransform } from 'ol/extent';
 
 
/**
* @description 获得一个OpenLayers框架下的ol/layer/Tile类型天地图图层
* @param {options} Object 初始化参数
* @param {options.type} String 与官方名称相同的图层类型
* @param {options.proj} String 与官方名称相同的投影类型
* @param {options.key} String 开发者秘钥
*/
export function getTianditu(options) {
        let layers = {
                '全球境界': 'ibo',
                '地形注记': 'cta',
                '地形晕渲': 'ter',
                '影像注记': 'cia',
                '影像底图': 'img',
                '矢量注记': 'cva',
                '矢量底图': 'vec'
        }
        let projs = {
                '经纬度投影': 'EPSG:4490',
                '球面墨卡托投影': 'EPSG:900913'
        }
        let matrixSets = {
                '经纬度投影': 'c',
                '球面墨卡托投影': 'w'
        }
        let projection = getProjection(projs[options.proj]);
        let projectionExtent = projection.getExtent();
        let origin = projectionExtent ? getTopLeft(projectionExtent) : [-180, 90];
        let fromLonLat = getTransform('EPSG:4326', projection);
        let width = projectionExtent ? getWidth(projectionExtent) : getWidth(applyTransform([-180.0, -90.0, 180.0, 90.0], fromLonLat));
        let resolutions = [];
        let matrixIds = [];
        for (let z = 1; z < 19; z++) {
                resolutions[z] = width / (256 * Math.pow(2, z));
                matrixIds[z] = z;
        };
        let wmtsTileGrid = new WMTS({
                origin: origin,
                resolutions: resolutions,
                matrixIds: matrixIds
        });
        let wmtsSource = new WMTSSource({
                url: "http://t0.tianditu.gov.cn/" + layers[options.type] + "_" + matrixSets[options.proj] + "/wmts?tk=" + options.key,
                layer: layers[options.type],
                version: '1.0.0',
                matrixSet: matrixSets[options.proj],
                format: 'tiles',
                projection: projection,
                requestEncoding: 'KVP',
                style: 'default',
                tileGrid: wmtsTileGrid
        });
        let wmtsLayer = new TileLayer({
                source: wmtsSource
        });
        return wmtsLayer
}

---

2.加载经纬度底图

使用CGCS2000坐标系的,网上有很多人使用OpenLayers加载不上这个坐标系,是因为通过Proj4这个库使用EPSG.io上的坐标代码有bug,Proj4.js的加载不上,改用WKT的数据就可以。

import { Map, View } from 'ol';
import { getTianditu } from './js/tianditu'
import { register } from 'ol/proj/proj4';
import proj4 from 'proj4';
 
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 = new Map({
        target: "map",
        view: new View({
                center: [116.391478, 39.903185],
                // center: [11936406.337013, 3786384.633134],
                projection: "EPSG:4490",
                zoom: 5,
                maxZoom: 18,
                minZoom: 1
        })
});
var tdt = getTianditu({
        type: '矢量底图',
        // proj: '球面墨卡托投影',
        proj: '经纬度投影',
 
        key: '用你自己的key'
});
var zz = getTianditu({
        type: '矢量注记',
        // proj: '球面墨卡托投影',
        proj: '经纬度投影',
 
        key: '用你自己的key'
})
var jj = getTianditu({
        type: '全球境界',
        // proj: '球面墨卡托投影',
        proj: '经纬度投影',
 
        key: '用你自己的key'
})
map.addLayer(tdt)
map.addLayer(zz)
map.addLayer(jj)


3.加载球面墨卡托投影底图

import { Map, View } from 'ol';
import { getTianditu } from './js/tianditu'
import { register } from 'ol/proj/proj4';
import proj4 from 'proj4';
 
// 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 = new Map({
        target: "map",
        view: new View({
                // center: [116.391478, 39.903185],
                center: [11936406.337013, 3786384.633134],
                // projection: "EPSG:4490",
                zoom: 5,
                maxZoom: 18,
                minZoom: 1
        })
});
var tdt = getTianditu({
        type: '矢量底图',
        proj: '球面墨卡托投影',
        // proj: '经纬度投影',
 
        key: '用你自己的key'
});
var zz = getTianditu({
        type: '矢量注记',
        proj: '球面墨卡托投影',
        // proj: '经纬度投影',
 
        key: '用你自己的key'
})
var jj = getTianditu({
        type: '全球境界',
        proj: '球面墨卡托投影',
        // proj: '经纬度投影',
 
        key: '用你自己的key'
})
map.addLayer(tdt)
map.addLayer(zz)
map.addLayer(jj)

标签:EPSG,rdquo,投影,let,proj,key,ldquo,import
From: https://www.cnblogs.com/gispathfinder/p/17931988.html

相关文章

  • 线段上离p最近的点 - 投影方式
    点到线段的最近距离判断依据1)投影结果<0,则线段端点a离p最近2)投影结果>线段ab的长度,则线段端点b离p最近3)否则p在线段上的垂点为最近点 p与ab不共线时1)p在线段两侧2-a)p在线段内侧2-b)p在线段内侧2 p与ab共线时1) p在线段两侧 2-a)p在线段内侧2-b......
  • 如何在 C# 中使用 投影(Projection)
    如何在C#中使用投影(Projection)一线码农 ​关注他 你浏览过TA的个人主页投影(Projection)是一种可以将查询结果进行 塑性 的一种操作,你可以使用 投影 将一个object转成仅包含你需要属性的新对象,这篇文章中,我们就一起看看如何使用投影功......
  • 2000地理坐标转投影坐标解决办法
    2000地理坐标转投影坐标解决办法一、背景:在一次项目中,手里有一个纯属性表的数据库(.mdb)里面含有2000经纬度数值,还有一幅CGCS2000_3_Degree_GK_Zone_35投影坐标系的tif影像,想把这个经纬度点展示在影像上。二、原理:利用arcgis自带投影功能三、做法:(1)将.mdb数据库中的经纬度字......
  • blender光投影和全息投影效果
    光投影光投影需在Cycles渲染器下使用有两种方式:图片贴图投影和纹理贴图投影*图片贴图投影1.新建灯光调整好大小位置以便更好地投影在物体上,使用节点。2.在着色编辑器面板连接好节点加光影贴图进去,映射位置需要调整一下到合适的位置,就大致完成了,接下来可以调整一下能量(亮......
  • 投影式AI云镜——电梯演讲
    投影式AI云镜——电梯演讲(软件技术基础第三次作业)这个作业属于哪个课程https://edu.cnblogs.com/campus/zjlg/23rjjsjc这个作业的目标是运用电梯演讲的方式向投资方介绍自己的创新产品姓名+学号陈佳华:2021330301002陈卉:2021330301001视频链接:投影式AI云镜......
  • 高中向量点乘为什么不满足结合律 和 向量投影
    因为向量点乘不是个群。向量点乘会导出一个标量,这很奇怪但也不奇怪。三个向量放在一起的话,其中会有两个组合在一起变成标量,以后的运算就不是点乘,而是数乘了。 若v向量为单位向量,则结果为uv向量的点积(标量)*v向量.    -----不满足结合律 即:某个方向力u,在v方向......
  • 投影仪不能显示桌面图标(文字)
    在把笔记本借到投影仪上时,桌面上的图标在投影仪上死活不显示,投影仪只显示笔记本桌面背景,有部分原因如下,希望对大家有所帮助!(1)可能在显示属性里面选择了扩展桌面的选项,如果是这样,投影仪上显示的是扩展的桌面,也就是说你的鼠标可以从你的笔记本屏幕移动到投影仪上,所以桌面图标不......
  • 视觉VO(10-2-1)优化- 重投影误差 数学基础 李群李代数
    自己的手工推导https://www.cnblogs.com/gooutlook/p/16412222.htmlB站教程https://www.bilibili.com/video/BV1LT411V7zv/?spm_id_from=333.788&vd_source=f88ed35500cb30c7be9bbe418a5998ca                    ......
  • 视觉VO(10-2)优化- 重投影误差
       李代数表现形式 https://blog.csdn.net/weixin_49804978/article/details/121922128   由于相机位姿未知以及观测点的噪声,该等式存在一个误差。我们将误差求和,构建最小二乘问题,然后寻找做好的相机位姿,使它最小化: 该问题的误差项,是将像素坐标(观测到的投影......
  • 无涯教程-MongoDB - 投影语句
    在MongoDB中,投影(Projection)意味着仅选择必要的数据,而不是选择全部数据,如果文档有5个字段,而只需要显示3个字段,则从中选择3个字段。find()方法MongoDB的find()方法在MongoDB查询文档中进行了解释,该方法接受第二个可选参数是您要检索的字段列表,在MongoDB中,执行find()方法时......