Openlayers 自定义投影坐标系数据转换以及在线转换工具

news2024/11/20 3:37:36

Openlayers 自定义投影坐标系数据转换以及在线转换工具

  • OpenLayers 教程
    • 查看 EPSG 码和定义
    • Openlayers 自定义投影坐标系数据转换以及在线转换工具
    • 在线示例

OpenLayers 教程

工作中经常会遇到转换坐标的情况,一般都会写代码搞定,但是有时候只需要查看一下数据,犯不上专门搞段代码,这里整个在线工具,提供使用。

内置了几个投影坐标系:EPSG: 4326、EPSG: 3857、EPSG: 2433、EPSG: 4610、EPSG: 4526

除此之外,还支持自由参数输入,输入 EPSG 码和 definition 即可。

查看 EPSG 码和定义

1. 可以通过此网站 EPSG 查看 EPSG 码和定义。

在这里插入图片描述

2. 输入坐标系编码查询
在这里插入图片描述

3. 选择坐标系,点击进入,往下滑,找到 proj4js,右侧即投影坐标系定义。
在这里插入图片描述

Openlayers 自定义投影坐标系数据转换以及在线转换工具

<html lang="en">
<head>
    <meta charSet="utf-8">
    <!--注意:openlayers 原版的比较慢,这里引起自己服务器版-->
    <link rel="stylesheet" href="http://openlayers.vip/examples/css/ol.css" type="text/css">
    <style>
        /* 注意:这里必须给高度,否则地图初始化之后不显示;一般是计算得到高度,然后才初始化地图 */
        .map {
            height: 500px;
            width: 100%;
            float: left;
        }

        .ol-zoom {
            display: none;
        }

        #labelPopup {
            background-color: white;
        }
    </style>
    <!--注意:openlayers 原版的比较慢,这里引起自己服务器版-->
    <script src="http://openlayers.vip/examples/resources/ol.js"></script>
    <!--proj4 插件-->
    <script src="http://openlayers.vip/examples/resources/proj4.js"></script>
    <script src="./tiandituLayers.js"></script>
    <title>OpenLayers example</title>
    <script>
        var _hmt = _hmt || [];
        (function () {
            var hm = document.createElement("script");
            hm.src = "https://hm.baidu.com/hm.js?f80a36f14f8a73bb0f82e0fdbcee3058";
            var s = document.getElementsByTagName("script")[0];
            s.parentNode.insertBefore(hm, s);
        })();
    </script>
</head>
<body>
<h2 style="height: 120px;">OpenLayers projection transfer --- 默认为多边形的转换,什么都不填可以转换默认数据。</h2>
<!--地图容器,需要指定 id -->
<div id="map" class="map"></div>
<H3>优先使用下拉框坐标系,如果填写了自定义坐标系,则使用自定义坐标系。</H3>
<p>先下拉框选择投影坐标系或者自定义输入坐标系和定义,再输入数据进行转换。</p>
<div style="position: absolute;top: 54px;left:10px;">
    <div>
        <div>
            <span>原投影坐标:</span>
            <select name="" id="origin" style="height: 30px;width: 100px;margin-left: 16px">
                <!--各种数据类型-->
                <option value="EPSG:4326">默认为WGS84,请选择投影坐标--</option>
                <option value="EPSG:3857">Web墨卡托</option>
                <option value="EPSG:4214">北京54</option>
                <option value="EPSG:4610">西安80</option>
                <option value="EPSG:4555">新北京</option>
                <option value="EPSG:2433">Beijing_1954_3_Degree_GK_CM_108E</option>
                <option value="EPSG:4527">CGCS2000_3_Degree_GK_Zone_39</option>
            </select>

            <span>
                自定义坐标系:
            </span>
            <span>
                <input style="width: 208px" type="text" id="origin_epsg_code" placeholder="坐标系编码,比如:EPSG:4326">
            </span>
            <span>
                <input style="width: 436px" type="text" id="origin_epsg_definition"
                       placeholder="坐标系定义,比如:+proj=longlat +datum=WGS84 +no_defs +type=crs">
            </span>
        </div>

        <br/>
        <div>
            <span>转换投影坐标:</span>
            <select name="" id="toData" style="height: 30px;width: 100px;">
                <!--各种数据类型-->
                <option value="EPSG:4326">默认为WGS84,请选择投影坐标--</option>
                <option value="EPSG:3857">Web墨卡托</option>
                <option value="EPSG:4214">北京54</option>
                <option value="EPSG:4610">西安80</option>
                <option value="EPSG:4555">新北京</option>
                <option value="EPSG:2433">Beijing_1954_3_Degree_GK_CM_108E</option>
                <option value="EPSG:4527">CGCS2000_3_Degree_GK_Zone_39</option>
            </select>

            <span>
                自定义坐标系:
            </span>
            <span>
                <input style="width: 208px" type="text" id="to_epsg_code" placeholder="坐标系编码,比如:EPSG:4326">
            </span>
            <span>
                <input style="width: 436px" type="text" id="to_epsg_definition"
                       placeholder="坐标系定义,比如:+proj=longlat +datum=WGS84 +no_defs +type=crs">
            </span>
        </div>

    </div>
</div>
<!--原始数据以及转换后数据-->
<textarea style="position:absolute;top:160px" id="result" cols="50" rows="30"></textarea>
<script type="text/javascript">
    var map = new ol.Map({
        // 地图容器
        target: 'map',
        // 地图图层,比如底图、矢量图等
        layers: [
            getIMG_CLayer(),
            getIBO_CLayer(),
            getCIA_CLayer(),
        ],
        // 地图视野
        view: new ol.View({
            projection: "EPSG:4326",
            // 定位
            center: [115.67724700667199, 37.73879478106912],
            // 缩放
            zoom: 6,
            maxZoom: 18,
            minZoom: 1,
        })
    });

    var defaultStyle = new ol.style.Style({
        //边框样式
        stroke: new ol.style.Stroke({
            color: 'red',
            width: 3,
        }),
        //填充样式
        fill: new ol.style.Fill({
            color: 'rgba(0, 0, 255, 0.3)',
        }),
    })
    // 初始化图层
    var layer = initVectorLayer();

    // 默认多边形
    const polygonStr = "POLYGON((116.25730023609182 39.99408085954892,116.255712368355 39.99236424577939,116.25476823078176 39.9906905473541,116.255712368355 39.98815854204404,116.25704274402639 39.98742898119199,116.25802979694387 39.98687108171689,116.2591885112383 39.9846394838165,116.26227841602346 39.983051616079685,116.26382336841604 39.981292086965915,116.26562581287405 39.981034594900486,116.26695618854544 39.980777102835056,116.26875863300344 39.981034594900486,116.27021775470755 39.981549579031345,116.27163396106741 39.98043378008115,116.2724064372637 39.97991879595029,116.27408013568899 39.98017628801572,116.27146229969046 39.98395283830869,116.2727497600176 39.988759356863376,116.27064690814993 39.98966057909238,116.26978860126516 39.98966057909238,116.26935944782278 39.990046817190525,116.25730023609182 39.99408085954892))";

    /**
     * @todo 矢量图层
     * @returns {VectorLayer}
     * @constructor
     */
    function initVectorLayer() {
        //实例化一个矢量图层Vector作为绘制层
        let source = new ol.source.Vector();
        //创建一个图层
        let customVectorLayer = new ol.layer.Vector({
            source: source,
            zIndex: 2,
            //设置样式
            style: defaultStyle,
        });
        //将绘制层添加到地图容器中
        map.addLayer(customVectorLayer);

        return customVectorLayer;
    }

    /**
     * @todo wkt格式数据转化成图形对象
     * @param {string} wkt   "POINT(112.7197265625,39.18164062499999)" 格式数据
     * @param {string|Projection} sourceCode 源投影坐标系
     * @param {string|Projection} targetCode 目标投影坐标系
     * @returns {Feature}
     */
    function getFeatureByWKT(wkt, sourceCode, targetCode) {
        try {
            let view = map.getView();
            if (!wkt) {
                return null;
            }
            let format = new ol.format.WKT();

            let feature;

            feature = format.readFeature(wkt, {
                featureProjection: targetCode || view.getProjection(),
                dataProjection: sourceCode || view.getProjection(),
            });

            return feature;
        } catch (e) {
            console.log(e);
            return null;
        }
    }

    /**
     * @Todo 将feature   转化成wkt格式
     * 大地坐标转地理坐标,可以先new feature 然后转为wkt(设置转换  'EPSG:4326' 'EPSG:3857'),在转回feature即可
     * @method getWKTByFeatures
     * @param feature  参数为feature对象
     * @param code  坐标系
     * @returns str  返回wkt数据
     */
    function getWKTByFeature(feature, sourceCode, targetCode, type) {
        try {
            let view = map.getView();
            if (!feature) {
                return null;
            }
            let format = new ol.format.WKT();

            if (feature instanceof Array) {
                if (type) {
                    let arr = [];
                    for (let i = 0; i < feature.length; i++) {
                        arr.push(format.writeFeature(feature[i], {
                            //传入feature的坐标系
                            featureProjection: sourceCode || view.getProjection(),
                            //返回数据的坐标系
                            dataProjection: targetCode || view.getProjection()
                        }))
                    }
                    return arr.join('#');
                } else {
                    return format.writeFeatures(feature, {
                        //传入feature的坐标系
                        featureProjection: sourceCode || view.getProjection(),
                        //返回数据的坐标系
                        dataProjection: targetCode || view.getProjection()
                    });
                }
            } else {
                return format.writeFeature(feature, {
                    //传入feature的坐标系
                    featureProjection: sourceCode || view.getProjection(),
                    //返回数据的坐标系
                    dataProjection: targetCode || view.getProjection()
                });
            }
        } catch (e) {
            console.log(e);
            return null
        }
    }

    // 定位
    function moveTo(layerTemp) {
        layerTemp && map.getView().fit(layerTemp.getSource().getExtent(), {
            duration: 1,//动画的持续时间,
            callback: null,
        });
    }

    // 注册投影坐标系
    function registerEPSG() {

        proj4.defs("EPSG:4214", "+proj=longlat +ellps=krass +towgs84=15.8,-154.4,-82.3,0,0,0,0 +no_defs +type=crs");
        ol.proj.proj4.register(proj4);
        proj4.defs("EPSG:4610", "+proj=longlat +ellps=IAU76 +no_defs +type=crs");
        ol.proj.proj4.register(proj4);
        proj4.defs("EPSG:2433", "+proj=tmerc +lat_0=0 +lon_0=108 +k=1 +x_0=500000 +y_0=0 +ellps=krass +towgs84=11.911,-154.833,-80.079,0,0,0,0 +units=m +no_defs +type=crs");
        ol.proj.proj4.register(proj4);
        proj4.defs("EPSG:4527", "+proj=tmerc +lat_0=0 +lon_0=117 +k=1 +x_0=39500000 +y_0=0 +ellps=GRS80 +units=m +no_defs +type=crs");
        ol.proj.proj4.register(proj4);
        proj4.defs("EPSG:4490", "+proj=longlat +ellps=GRS80 +no_defs +type=crs");
        ol.proj.proj4.register(proj4);
        proj4.defs("EPSG:4555", "+proj=longlat +ellps=krass +no_defs +type=crs");
        ol.proj.proj4.register(proj4);
    }

    registerEPSG();

    // 原始数据
    let originData;

    // 过程数据
    let tempData;

    // 转换方法
    function transfer() {

        // 原数据类型
        let origin = document.getElementById("origin")
        let originIndex = origin.selectedIndex;
        let originSelect = origin.options[originIndex].value;

        // 自定义投影坐标系
        let originInputCode = document.getElementById("origin_epsg_code").value;
        let originInputDefinition = document.getElementById("origin_epsg_definition").value;

        // 如果填写自定义坐标系,则注册
        if (originInputCode && originInputDefinition) {
            proj4.defs(originInputCode, originInputDefinition);
            ol.proj.proj4.register(proj4);
        }


        // 转换数据类型
        var toData = document.getElementById("toData")
        let toDataIndex = toData.selectedIndex;
        let toDataSelect = toData.options[toDataIndex].value;


        // 自定义转换投影坐标系
        let toInputCode = document.getElementById("to_epsg_code").value;
        let toInputDefinition = document.getElementById("to_epsg_definition").value;

        // 如果填写自定义坐标系,则注册
        if (toInputCode && toInputDefinition) {
            proj4.defs(toInputCode, toInputDefinition);
            ol.proj.proj4.register(proj4);
        }

        // 显示数据
        tempData = document.getElementById("result").value;

        // 记录原数据
        originData = originData || tempData;

        // 过程图形要素
        let featureTemp = getFeatureByWKT(tempData || polygonStr,
            originInputCode ? ol.proj.get(originInputCode) : ol.proj.get(originSelect), ol.proj.get('EPSG:4326'));

        layer.getSource().addFeatures([featureTemp]);

        moveTo(layer)

        // 填充数据
        document.getElementById("result").value = getWKTByFeature(featureTemp,
            ol.proj.get('EPSG:4326'), toInputCode ? ol.proj.get(toInputCode) : ol.proj.get(toDataSelect));

        // 重新设置下拉框类型
        set_select_checked('origin', toDataSelect);
    }

    /**
     * 设置select控件选中
     * @param selectId select的id值
     * @param checkValue 选中option的值
     */
    function set_select_checked(selectId, checkValue) {
        var select = document.getElementById(selectId);

        for (var i = 0; i < select.options.length; i++) {
            if (select.options[i].value == checkValue) {
                select.options[i].selected = true;
                break;
            }
        }
    }

    // 清空数据
    function restore() {
        layer.getSource().clear();
        document.getElementById("result").value = '';
        document.getElementById("origin").options[0].selected = true;
        document.getElementById("toData").options[0].selected = true;
    }

</script>
<button id="transfer" onClick="transfer()">转换</button>
<button id="restore" onClick="restore()">清除</button>
</body>
</html>

在线示例

Openlayers 自定义投影坐标系转换工具:OpenLayers projection transfer

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/81963.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

web前端期末大作业:基于HTML+CSS+JavaScript汽车租赁网站(47页)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

ELK 企业级日志分析系统

一、ELK 概述 1、ELK 简介 ELK平台是一套完整的日志集中处理解决方案&#xff0c;将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用&#xff0c; 完成更强大的用户对日志的查询、排序、统计需求。 ●ElasticSearch&#xff1a;是基于Lucene&#xff08;一个全文检…

[附源码]Python计算机毕业设计Django安防管理平台

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

CleanMyMacX软件怎么样?实际使用效果功能讲解

如果你也对MAC系统的优化和文件管理摸不清头脑&#xff0c;不知道该如何清理垃圾和缓存文件。那你可以试试我最近发现的这款软件——CleanMyMac X。 这是一款MAC OS的老牌清理软件&#xff0c;集系统的清理、提速、保护和软件的卸载于一体,由知名软件开发商MACPaw开发&#xf…

未来五年,人类和数字化劳动力混合的员工队伍将变得非常普遍

从机器管家安德鲁&#xff0c;到钢铁侠的贾维斯&#xff0c;无论是实体智能机器人&#xff0c;还是人工智能系统&#xff0c;人们对于机器人助手的想象从未停止过。 虽然&#xff0c;人类和机器人助手一起工作&#xff0c;听上去很科幻&#xff0c;但这一情况如今已比想象的更…

SpringBoot整合邮件服务(QQ邮箱)

文章目录SpringBoot整合邮件服务配置选择账户点击开启SMTP服务&#xff1a;发送短信&#xff1a;发送完&#xff0c;点击我已发送&#xff0c;然后得到密码&#xff1a;POM依赖&#xff1a;application.ymlJava集成EmailService在controller里定义接口&#xff1a;在业务实现层…

继承——C++第二大特性

目录 一、概念及定义 1、概念 2、定义 &#xff08;2&#xff09;方式 &#xff08;3&#xff09;继承基类成员访问方式的变化 二、父类子类赋值转换 三、继承中的作用域 四、派生类的默认成员函数 六、继承与静态成员 七、复杂的菱形继承及菱形虚拟继承 八、归纳 一、…

C语言——每周刷题题集(第一周)

前言 做题可以更好地巩固所学知识&#xff0c;并加深对于知识点的理解。下面题目均来自牛客网入门编程练习题。 第一题: BC8 十六进制转十进制 描述&#xff1a; BoBo写了一个十六进制整数ABCDEF&#xff0c;他问KiKi对应的十进制整数是多少。 输入描述&#xff1a; 无 …

基于自注意力的生成对抗归因网络的交通流缺失数据修复

文章信息《Missing Data Repairs for Traffic Flow With Self-Attention Generative Adversarial Imputation Net》是2022年7月发表在期刊IEEE TRANSACTIONS ON INTELLIGENT TRANSPORTA TION SYSTEMS上的一篇文章。摘要随着传感器技术的快速发展&#xff0c;由多个空间分布的传…

2023我为什么建议你学Python?

前言 最近有一位读者准备实习开始找工作&#xff0c;来跟我交流他目前找工作遇到的一些情况&#xff1a; “我被找工作弄得满头包&#xff0c;觉得好像自己学的专业很没有市场&#xff0c;也没有很好的大公司背书&#xff0c;根本没有和 HR 谈薪资的底气。 他最近撒简历发现…

Java IO流

一、IO的概念 Java IO&#xff1a;Java IO即Java 输入输出系统。不管我们编写何种应用&#xff0c;都难免和各种输入输出相关的媒介打交道&#xff0c;其实和媒介进行IO的过程是十分复杂的&#xff0c;这要考虑的因素特别多&#xff0c;比如我们要考虑和哪种媒介进行IO&#x…

react进阶用法完全指南

React调用回调函数&#xff0c;正确设置this指向的三种方法 通过bind this.increment this.increment.bind(this);通过箭头函数 <button onClick{this.multi}>点我*10</button> multi () > {this.setState({count: this.state.count * 10}) }箭头函数包裹 …

[附源码]Python计算机毕业设计大学生学科竞赛管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

【特征选择】时变正弦和 V 形传递函数 (BMPA-TVSinV) 的新型二元海洋捕食者算法附matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;修心和技术同步精进&#xff0c;matlab项目合作可私信。 &#x1f34e;个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知。 更多Matlab仿真内容点击&#x1f447; 智能优化算法 …

CSC7136B

CSC7136B是一款高效率低待机功耗原边反馈小功率 电源 AC/DC 驱动 电路&#xff0c;无 需光耦、TL431 及相关器件。CSC7136B采用开关频率调制和初级电流峰值振幅&#xff08; FM 和 AM &#xff09;多模式工作技术&#xff0c;保证了全负载和线性范围内的较高的转换效率。恒压模…

无法安装人脸检测dlib库的解决方法

1. 引言 dlib 库是一个用来人脸关键点检测的 Python 库&#xff0c;但因为其是 C 编写&#xff08;或需要 C编译&#xff1f;&#xff09;&#xff0c;使得在安装时可能会遇到各种各样问题。笔者在安装时遇到问题后&#xff0c;搜索了一些博客&#xff0c;看到了一些解决方法&…

基于Python+Mysql实现(WinForm)书店销售管理管理子系统【100010028】

书店销售管理管理子系统 一、设 计 总 说 明 现在社会随着计算机技术迅速发展与技术的逐渐成熟&#xff0c;信息技术已经使人们的生活发生深刻的变化。生活中的各种服务系统也使人们在生活中的联系日常销售活动方式发生了很大的变化&#xff0c;让效率较低的手工操作成为过去…

年网络安全观察报告 地域分布

执行摘要 从 1987 年 9 月 14 日&#xff0c;中国向世界发出第一封电子邮件 到如今&#xff0c;中国的互联网发展已过去整整 31 个年头。从消费互联、产业互联到万物互联&#xff0c;互联网正在加速改变我们的交流方式和交易方式&#xff0c;一次次 004.重塑了国家的经济形态和…

Java单例模式的写法及作用介绍

在创建型设计模式中&#xff0c;我们第一个学习的是单例模式&#xff08;Singleton Pattern&#xff09;&#xff0c;这是设计模式中最简单的模式之一。 单例是什么意思呢&#xff1f; 单例就是单实例的意思&#xff0c;即在系统全局&#xff0c;一个类只创建一个对象&#x…

友嘉银行坎坷的云原生之路

随着数字化浪潮的来临&#xff0c;云原生技术越来越火。云原生技术的持续更新&#xff0c;无一不在催促传统行业重塑业务体系以及产业生态的转型升级。说到云原生&#xff0c;目前已被认为是云计算最重要的发展方向&#xff0c;它拥有更优雅的架构、更灵活的调度、更完善的治理…