开源WebGIS开发——Map的视图管理(view)

1、坐标系统及投影简介

(1)坐标系统框架

        参心坐标系:以参考椭球几何中心为原点的地理坐标系。

①北京54坐标:是前苏联1942年坐标系延伸,坐标原点在前苏联的普尔科沃。

②西安80坐标:我国自主研发坐标系,相对于北京54精度更高,坐标原点在陕西省泾阳县永乐镇。

自然资源部宣布自201911日起,这两款坐标系就已经彻底退出历史舞台。但是我们目前很多单位,老旧资料和原始的地形图,仍然是这两款坐标系。

        地心坐标系:以地球质心为原点的地理坐标系

①WGS84坐标:美国国防部研制确定的,目前我们使用的GPS定位得到的坐标就是该坐标系。

大地2000坐标系:国产地心坐标系,与国际接轨,目前全国全面推广使用。

(2)坐标的表达方式

①地理坐标系

        通过经纬度对地球表面进行定位的坐标系。

        如: 东经E121°31′3.00″北纬N31°20′42.69″    或者  31.2013°,29.3821°

        本初子午线:英国伦敦格林尼治天文台。

        WGS84默认投影代号:EPSG4326

②投影坐标系

        使用X,Y值对地球表面进行定位的坐标系。

        如: 36594233米,2933249

         WGS84经过墨卡托投影后默认代号:EPSG3857(OSM) 墨卡托投影有变形 离地球越远误差越大。

2、View对象的主要组成部分

View对象的四个基本属性:center(展示中心)、resolution(分辨率)、rotation(旋转属性)、projection(投影)。

3、View对象的主要参数

参数

类型

默认值

描述

center

module:ol/coordinate~Coordinate

视图的初始中心。使用projection选项指定中心的坐标系。如果未设置图层源,则不会获取图层源,但可以稍后设置中心#setCenter

constrainRotation

boolean | number

TRUE

旋转约束。 false意味着有约束。true意味着没有约束,但在零附近捕捉零。数字将旋转约束为该数量的值。例如,4将旋转约束为0度,90度,180度和270度。

enableRotation

boolean

TRUE

启用旋转。默认为true。如果设置旋转约束为false,将会设置旋转的值为0。如果enableRotation设置为false,constrainRotation选项没有任何作用。

extent

module:ol/extent~Extent

限制中心的程度,换句话说,中心不能设置在这个范围之外。

maxResolution

number

用于确定分辨率约束的最大分辨率。它与minResolution(或maxZoom)和zoomFactor。一起使用。如果未指定,则以投影的有效范围适合256x256像素图块的方式计算。如果投影是Spherical Mercator(默认值),则maxResolution默认为40075016.68557849 / 256 = 156543.03392804097

minResolution

number

用于确定分辨率约束的最小分辨率。它与maxResolution(或minZoom)和zoomFactor。一起使用。如果未指定,则假设29个缩放级别(系数为2)进行计算。如果投影是Spherical Mercator(默认值),则minResolution默认为40075016.68557849 / 256 / Math.pow(2, 28) = 0.0005831682455839253

maxZoom

number

28

用于确定分辨率约束的最大缩放级别。它与minZoom(或maxResolution)和zoomFactor。一起使用。请注意,如果minResolution还提供了,则优先于maxZoom

minZoom

number

0

用于确定分辨率约束的最小缩放级别。它与maxZoom(或minResolution)和zoomFactor。一起使用。请注意,如果maxResolution还提供了,则优先于minZoom

projection

module:ol/proj~ProjectionLike

'EPSG:3857'

投影。默认为球形墨卡托。

resolution

number

视图的初始分辨率。单位是projection每像素的单位(例如,每像素米)。设置此选项的另一种方法是设置zoom。如果既未zoom定义也未定义,则不会获取图层源,但可以稍后使用#setZoom或设置它们#setResolution

resolutions

Array.<number>(double类型 实现对地图缩放的精细化控制)

决定解决方案约束的决议。如果设置了maxResolutionminResolutionminZoommaxZoom,和zoomFactor选项都将被忽略。

rotation

number

0

以弧度为单位的视图的初始旋转(顺时针正向旋转,0表示向北)。

zoom

number(int型)

仅在resolution未定义时使用。用于计算视图初始分辨率的缩放级别。使用该#constrainResolution方法确定初始分辨率。

zoomFactor

number

2

用于确定分辨率约束的缩放系数。

4、View对象的可观察属性

有三个可观察属性

姓名类型可设置ol/Object.ObjectEvent类型描述
center模块:ol/坐标~坐标 | 不明确的是的change:center

视图的中心。

resolution数量 | 不明确的是的change:resolution

视图的分辨率。

rotation数字是的change:rotation

以弧度为单位的视图旋转。

5、View对象的方法

6、示例:视图联动

        同一个视图可以展示多张地图,但是控件默认只能被其中一个视图使用,只能重新赋值

        示例:同一个视图加载天地图路网地图和遥感影像地图

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <link rel="stylesheet" href="ol.css">
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        .map {
            width: 50%;
            height: 100%;
            position: absolute;
        }
        .map1{
            width: 50%;
            height: 100%;
            position: absolute;
            margin-left: 50%;
        }
    </style>
</head>
<body>
    <div id="map" class="map"></div>
    <div class="map1" id="map1"></div>

    <script src="ol.js"></script>
    <script>
        //WGS84投影 天地图
        var tdtmap = new ol.layer.Tile({
            source: new ol.source.XYZ({
                url: "http://t4.tianditu.com/DataServer?T=vec_w&x={x}&y={y}&l={z}&tk=7ab767e38fe3d9c04f144a091cff214f"
            })
        })
        var zjmap = new ol.layer.Tile({
            source: new ol.source.XYZ({
                url: "http://t4.tianditu.com/DataServer?T=cva_w&x={x}&y={y}&l={z}&tk=7ab767e38fe3d9c04f144a091cff214f"
            })
        })

        //天地图卫星影像
        var weixingmap = new ol.layer.Tile({
            source: new ol.source.XYZ({
                url:"http://t3.tianditu.com/DataServer?T=img_w&x={x}&y={y}&l={z}&tk=7ab767e38fe3d9c04f144a091cff214f"
            })
        }) 

        //定义地图的中心
        // var beijing = ol.proj.transform([116.40,39.92],"EPSG:4326","EPSG:3857");
        //创建视图
        var projection = new ol.proj.Projection({
            code: "EPSG:4326",
            units: "degrees"
        })
        //103.8376235961914, 30.856132507324222
        //[104.29630279541016, 30.42423248291016]
        // [104.0628433227539, 30.66318511962891]
        var view = new ol.View({
            projection: projection,
            center: [104.0628433227539, 30.66318511962891],
            // zoom: 10,
            resolution:0.0002433670469288253,
            constrainRotation:4
            // enableRotation:false
            // rotation:1.5707964
            // maxResolution:0.0020433670469288253,
            // minResolution:0.0001433670469288253
            // 0.00017166514526367188
            // extent:[103.8376235961914,30.42423248291016,104.29630279541016,30.856132507324222]
        })
        //创建地图控件
        var controls = new ol.control.defaults().extend([new ol.control.FullScreen()]);
        //创建一个互动控件
        var interactions = new ol.interaction.defaults().extend([new ol.interaction.DragRotateAndZoom()]);
        var map = new ol.Map({
            target: "map",
            controls: controls,
            interactions: interactions,
            layers: [tdtmap, zjmap],
            view: view
        })
        var map1 = new ol.Map({
            target: "map1",
            controls: new ol.control.defaults().extend([new ol.control.FullScreen()]),
            interactions: new ol.interaction.defaults().extend([new ol.interaction.DragRotateAndZoom()]),
            layers: [weixingmap, zjmap],
            view: view
        })


        view.on("change:resolution",function(e){
            console.log(e)
        })

        map.on("click",function(e){
            console.log(e)
        })

        view.rotate(1.5707964,[104.0628433227539, 30.66318511962891])
        
    </script>
</body>
</html>

        

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值