zoukankan      html  css  js  c++  java
  • maptalk第一模块(地图显示,平移旋转,常用控件,同步地图,添加工具栏,获取地图信息)

    完整demo在底部,此部分为文字注释版本
    <!DOCTYPE html> <html> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>地图 - 限制地图区域</title> <style type="text/css"> html,body{margin:0px;height:100%;width:100%} .container{width:100%;height:100%} </style> <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/maptalks/dist/maptalks.css"> <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/maptalks/dist/maptalks.min.js"></script> <body> <div id="map" class="container"></div>

     <div id="map2" class="map2"></div>
            <!-- <canvas id="map" class="map"></canvas> -->
            <div class="text">
                <p>mapCenter:{{mapCenter}}</p>
                <p>zoom:{{zoom}}</p>
                <p>minZoom:{{minZoom}}</p>
                <p>maxZoom:{{maxZoom}}</p>
                <p>extent:{{extent}}</p>
                <p>bearing:{{bearing}}</p>
            </div>


    // 地图实例放在canvas里
    <canvas width=600 height=300 id="map" style="border:1px solid"> <script> var map = new maptalks.Map('map', { center: [-0.113049,51.498568], // 地图中心坐标 zoom: 14, // 缩放比例
         dragPitch : true, // 是否开始鼠标拖动偏移(左键)
            dragRotate : true, // 是否开启鼠标拖动旋转(右键或者ctrl+左键)
         zoomControl : true, // add zoom control // 添加缩放比例控件

        seamlessZoom: true,// 细微缩放,官方说由此控制是否使用无缝缩放模式(并未搞清楚有何区别)

    scaleControl : true, // add scale control // 比例尺控件 overviewControl : true, // add overview control // 缩略图控件
            centerCross : true, // 地图中心显示红色十字符号
            baseLayer: new maptalks.TileLayer('base', {
              urlTemplate: 'https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png',
              subdomains: ['a','b','c','d'],
              attribution: '&copy; <a href="http://osm.org">OpenStreetMap</a> contributors, &copy; <a href="https://carto.com/">CARTO</a>'
            }),
            layers : [
              new maptalks.VectorLayer('v')
            ]
          });
    
          var extent = map.getExtent();// 获取地图范围
    
          // set map's max extent to map's extent at zoom 14
          map.setMaxExtent(extent); // 限制最大地图范围
    
          map.setZoom(map.getZoom() - 2, { animation : false });// 更改缩放比例
    
          map.getLayer('v')
            .addGeometry( // 添加新的几何图形
              new maptalks.Polygon(extent.toArray(), { 新的多边形
                symbol : { 'polygonOpacity': 0, 'lineWidth': 5 }
              })
            );
     function up() {
            map.panBy([0, -200]);//设置偏移量[x,y]
          }
    
          function down() {
            map.panBy([0, 200]);
          }
    
          function left() {
            map.panBy([-200, 0]);
          }
    
          function right() {
            map.panBy([200, 0]);
          }
    
          function toCoordinate() {
            var symbol = {  // 添加的标志样式,等同于设置单个marker
              markerType : 'x', 
              markerLineColor : '#f00',
              markerLineWidth : 4,
              markerWidth : 20,
              markerHeight : 20
            };
            var coordinate = map.getCenter().add(0.008, 0.008); // 选择marker的位置
            map.getLayer('v')
              .clear()// 清空之前设置的marker
              .addGeometry(new maptalks.Marker(coordinate, { 'symbol' : symbol })); //添加新的坐标中心时的marker
            map.panTo(coordinate);
          }
     
          var toolbar = new maptalks.control.Toolbar({ // 添加自定义工具栏,item是工具栏显示的内容,click为触发的事件名
            items: [
              {
                item: '↑',
                click: up
              },
              {
                item: '↓',
                click: down
              },
              {
                item: '←',
                click: left
              },
              {
                item: '→',
                click: right
              },
              {
                item: 'pan to',
                click: toCoordinate
              }
            ]
          }).addTo(map);

    getStatus(); // 获取地图状态
    
          function getStatus() {
            var extent = map.getExtent(), // 获取地图范围
              ex = [
                '{',
                'xmin:' + extent.xmin.toFixed(5),
                ', ymin:' + extent.ymin.toFixed(5),
                ', xmax:' + extent.xmax.toFixed(5),
                ', ymax:' + extent.xmax.toFixed(5),
                '}'
              ].join('');
            var center = map.getCenter(); // 获取地图中心点
            var mapStatus = [
              'Center : [' + [center.x.toFixed(5), center.y.toFixed(5)].join() + ']',
              'Extent : ' + ex,
              'Size : ' + map.getSize().toArray().join(),// 获取地图的尺寸(即地图的长宽)
              'Zoom : '   + map.getZoom(),// 获取地图缩放比例
              'MinZoom : ' + map.getMinZoom(),// 获取地图最小缩放比例
              'MaxZoom : ' + map.getMaxZoom(), // 获取地图最大缩放比例
              'Projection : ' + map.getProjection().code
            ];
    var center = map.getCenter();
          var polygon = new maptalks.Polygon([
            center.add(-0.005, 0.005),
            center.add(0.005, 0.005),
            center.add(0.005, -0.005),
            center.add(-0.005, -0.005), // 绘制多边形需要从第三象限开始绘制
          ], {
            symbol : {
              polygonFill : '#fff',
              polygonOpacity : 0.5
            }
          }); //围绕地图中心点画一个多边形,四个角坐标以中心为基准
          map.getLayer('v').addGeometry(polygon);
    
          function fitExtent() {
            // fit map's extent to polygon's
            // 0 is the zoom offset
            map.fitExtent(polygon.getExtent(), 0); // 设置为适合给定范围,并使用可能的最大缩放级别,参数一为给定的范围,参数二为指定的缩放比例
          }
    // 限制缩放级别可直接在声明地图时添加maxzoom和minzoom或者使用以下方法:
     map.setMinZoom(14).setMaxZoom(14);

    // 地图实例放在canvas里

    // var res = (window.devicePixelRatio || (window.screen.deviceXDPI / window.screen.logicalXDPI)) > 1;
    // if (res) {
    // // retina, see https://developer.mozilla.org/en-US/docs/Web/API/Window/devicePixelRatio
    // var canvas = document.getElementById('map');
    // var r = 2;
    // canvas.width *= r;
    // canvas.height *= r;
    // canvas.style.cssText += '' + Math.round(canvas.width / r) + 'px;height:' + Math.round(canvas.height / r) + 'px';
    // }  // 这一部分为官方给的,感觉与canvas的绑定不太相关,即使删掉也没有什么影响,可能是为了解决未发现的bug?

    var map = new maptalks.Map('map', {
    center: [-0.113049, 51.498568],
    zoom: 14,
    zoomControl: true, // ignored in a canvas container
    scaleControl: true, // ignored in a canvas container
    baseLayer: new maptalks.TileLayer('base', {
    urlTemplate: 'https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png',
    subdomains: ['a', 'b', 'c', 'd'],
    attribution: '© <a href="http://osm.org">OpenStreetMap</a> contributors, © <a href="https://carto.com/">CARTO</a> '
    })
    }); // 这一段即可完成绑定,与div并无不同的样子

     // 监听点击事件
     map.on('click', function (param) {
            var infoDom = document.getElementById('info');
            infoDom.innerHTML = '<div>' + new Date().toLocaleTimeString() +
              ': click map on ' + param.coordinate.toFixed(5).toArray().join() + '</div>' +
              infoDom.innerHTML;
          });

     //  利用高德地图作为地图

    const map = new maptalks.Map('map', {
                center: [-0.113049, 51.498568],
                zoom: 14,
                minZoom: 2,
                maxZoom: 20,
                centerCross: true,
                dragPitch: true,
                dragRotate: true,
                zoomControl: true,
                // seamlessZoom: true,
                scaleControl: true,
                overviewControl: true,
                baseLayer: new maptalks.TileLayer('base', {
                    urlTemplate: 'http://wprd{s}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&style=7&z={z}&x={x}&y={y}&scl=1&ltype=11', // 这里的链接控制底图来源
                    subdomains: ['01', '02', '03', '04'], //  此处不能继续用abcd,否则底图会失效
                    // attribution: `'&copy; <a href="http://osm.org">OpenStreetMap</a> contributors, &copy;
                    //  <a href="https://carto.com/">CARTO</a>'`,
                }),
     
    // 这里是同步地图 (设置同步地图时需要设置绑定的元素的宽和高,不然不会显示。
     
    const map2 = new maptalks.Map('map2', {
                center: map.getCenter(),
                zoom: map.getZoom(),
                draggable : false,        // disable draggble
                scrollWheelZoom : false,  // disable scroll wheel zoom
                dblClickZoom : false,     // disable doubleclick
                baseLayer: new maptalks.TileLayer('base1', {
                urlTemplate: 'https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png',
                subdomains: ['a', 'b', 'c', 'd'],
                // attribution: '&copy; <a href="http://osm.org">OpenStreetMap</a> contributors, &copy; <a href="https://carto.com/">CARTO</a>'
                }),
            });
    </script> 

    </body>

    </html>

    第一部分的完整demo
    <template>
        <div class="app">
            <div id="map" class="map"></div>
            <div id="map2" class="map2"></div>
            <!-- <canvas id="map" class="map"></canvas> -->
            <div class="text">
                <p>mapCenter:{{mapCenter}}</p>
                <p>zoom:{{zoom}}</p>
                <p>minZoom:{{minZoom}}</p>
                <p>maxZoom:{{maxZoom}}</p>
                <p>extent:{{extent}}</p>
                <p>bearing:{{bearing}}</p>
            </div>
            <div>
            </div>
        </div>
    </template>
    <script lang="ts">
    import * as maptalks from 'maptalks';
    import {Component, Vue} from 'vue-property-decorator';
    import 'maptalks/dist/maptalks.css'
    @Component
    export default class App extends Vue {
        private mapCenter: any = '';
        private zoom: any = '';
        private minZoom: any = '';
        private maxZoom: any = '';
        private extent: any = '';
        private bearing: any = '';
        private newMap() {
            // const screen: any = window.screen;
            // const canvas: any = document.getElementById('map');
            // const res = (window.devicePixelRatio || (screen.deviceXDPI / screen.logicalXDPI)) > 1;
            // if (res) {
            //     // retina, see https://developer.mozilla.org/en-US/docs/Web/API/Window/devicePixelRatio
            //     const r: number = 2;
            //     console.log(canvas.width);
            //     canvas.width *= r;
            //     canvas.height *= r;
            //     canvas.style.cssText += '' + Math.round(canvas.width / r) + 'px;height:'
            //     + Math.round(canvas.height / r) + 'px';
            // }
            const map = new maptalks.Map('map', {
                center: [-0.113049, 51.498568],
                zoom: 14,
                minZoom: 2,
                maxZoom: 20,
                centerCross: true,
                dragPitch: true,
                dragRotate: true,
                zoomControl: true,
                // seamlessZoom: true,
                scaleControl: true,
                overviewControl: true,
                baseLayer: new maptalks.TileLayer('base', {
                    urlTemplate: 'http://wprd{s}.is.autonavi.com/appmaptile?lang=zh_cn&size=1&style=7&z={z}&x={x}&y={y}&scl=1&ltype=11',
                    subdomains: ['01', '02', '03', '04'],
                    // attribution: `'&copy; <a href="http://osm.org">OpenStreetMap</a> contributors, &copy;
                    //  <a href="https://carto.com/">CARTO</a>'`,
                }),
                layers : [
                    new maptalks.VectorLayer('v'),
                ],
            });
            const map2 = new maptalks.Map('map2', {
                center: map.getCenter(),
                zoom: map.getZoom(),
                draggable : false,        // disable draggble
                scrollWheelZoom : false,  // disable scroll wheel zoom
                dblClickZoom : false,     // disable doubleclick
                baseLayer: new maptalks.TileLayer('base1', {
                urlTemplate: 'https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}.png',
                subdomains: ['a', 'b', 'c', 'd'],
                // attribution: '&copy; <a href="http://osm.org">OpenStreetMap</a> contributors, &copy; <a href="https://carto.com/">CARTO</a>'
                }),
            });
    
            const toolbar = new maptalks.control.Toolbar({
                items: [{
                    item: '上移',
                    click: () => map.panBy([0, 200]),
                },
                {
                    item: '下移',
                    click: () => map.panBy([0, -200]),
                },
                {
                    item: '左移',
                    click: () => map.panBy([200, 0]),
                },
                {
                    item: '右移',
                    click: () => map.panBy([-200, 0]),
                },
                {
                    item: '适应窗口',
                    click: () => {
                        const center = map.getCenter();
                        const polygon = new maptalks.Polygon([
                        center.add(-0.004, -0.004),
                        center.add(-0.012, -0.004),
                        center.add(-0.008, 0),
                        center.add(-0.012, 0.004),
                        center.add(-0.004, 0.004),
                        center.add(0, 0.008),
                        center.add(0.004, 0.004),
                        center.add(0.012, 0.004),
                        center.add(0.008, 0),
                        center.add(0.012, -0.004),
                        center.add(0.004, -0.004),
                        center.add(0.00, -0.008), // 这里的多边形绘制似乎是由第三象限开始的,如果从第二象限开始则第三象限点位连线会乱
                        ], {
                            symbol: {
                                polygonFill: '#000',
                                polygonOpacity: 0.5,
                            },
                        });
                        map.getLayer('v').addGeometry(polygon);
                        map.fitExtent(polygon.getExtent(), 0);
                    },
                }],
            }).addTo(map);
            map.on('moving moveend', (e) => {
                map2.setCenter(e.target.getCenter());
            });
            map.on('rotate', (e) => {
                map2.setBearing(e.target.getBearing());
            });
            map.on('pitch', (e) => {
                map2.setPitch(e.target.getPitch());
            });
            map.on('zooming zoomend', (e) => {
                map2.setCenterAndZoom(e.target.getCenter(), e.target.getZoom());
            });
            map.on('moveend', () => {
                const center = map.getCenter();
                this.mapCenter = center.toFixed(5);
                this.zoom = map.getZoom();
                this.minZoom = map.getMinZoom();
                this.maxZoom = map.getMaxZoom();
                this.extent = map.getExtent();
                this.bearing = map.getBearing();
                const polygon = new maptalks.Polygon([
                    center.add(-0.005, 0.005), // 右下
                    center.add(0.005, 0.005), // 右上
                    center.add(0.008, -0.005), // 右下
                    center.add(-0.008, -0.005), // 左下
                ], {
                    symbol: {
                        polygonFill: '#fc0',
                        polygonOpacity: 0.1,
                    },
                });
                map.getLayer('v').addGeometry(polygon);
            });
            new maptalks.VectorLayer('v1', new maptalks.Marker(map.getCenter()))
          .addTo(map);
        };
        // private getMapInfo() {
        //     // const tooltip = new maptalks.MapTool
        // }
        private mounted() {
            this.newMap();
        }
    }
    </script>
    <style scoped lang="scss">
    .app{
         100%;
        height: 100%;
        font-size: 14px;
        display: flex;
        flex-direction: row;
        .map{
            flex: 1;
             100%;
            height: 100%;
        }
        .map2{
            flex: 1;
             100%;
            height: 100%;
        }
        .text{
            position: absolute;
            top:10px;
            left: 50px;
        }
    }
    
    </style>
     
  • 相关阅读:
    Delphi TStringList的用法
    Android Studio使用教程(一)
    如何在win7下安装和配置Android Studio
    python基础字符串单引号双引号和三引号
    同步和互斥
    posix多线程有感线程高级编程(条件变量)
    VMware网络配置详解
    posix多线程有感POSIX 线程间的内存可视性
    进程及相关API
    POSIX线程属性
  • 原文地址:https://www.cnblogs.com/wanghuanl/p/15394519.html
Copyright © 2011-2022 走看看