MapCanvasProjection 对象规范

覆盖物容器的相对像素坐标与经纬度坐标之间的转换。

方法

方法 返回值 说明
fromContainerPixelToLatLng() LatLng 根据地图外部容器左上角的相对像素坐标计算经纬度坐标。
fromDivPixelToLatLng() LatLng 根据地图内部容器左上角的相对像素坐标计算经纬度坐标。
fromLatLngToContainerPixel() Point 根据经纬度坐标计算相对于地图外部容器左上角的相对像素坐标。
fromLatLngToDivPixel() Point 根据经纬度坐标计算相对于地图内部容器左上角的相对像素坐标。

实例

本示例中,介绍创建简单的自定义覆盖物并设置覆盖物层级

JavaScript
function init() {
    var center = new qq.maps.LatLng(39.982163, 116.306070);
    var map = new qq.maps.Map(document.getElementById("container"), {
        center: center,
        zoom: 14
    });
    var Label = function(opts) {
        qq.maps.Overlay.call(this, opts);
    }

    //继承Overlay基类
    Label.prototype = new qq.maps.Overlay();
    //定义construct,实现这个接口来初始化自定义的Dom元素
    Label.prototype.construct = function() {
        this.dom = document.createElement('div');
        this.dom.style.cssText =
            'background:#0f0;color:white;position:absolute;' +
            'text-align:center;width:100px;height:30px';
        this.dom.innerHTML = 'Hello world';

        //将dom添加到覆盖物层,overlayLayer的顺序为容器 1,此容器中包含Polyline、Polygon、GroundOverlay等
        this.getPanes().overlayLayer.appendChild(this.dom);

    }
    //绘制和更新自定义的dom元素
    Label.prototype.draw = function() {
        //获取地理经纬度坐标
        var position = this.get('position');
        if (position) {
            //根据经纬度坐标计算相对于地图外部容器左上角的相对像素坐标
            //var pixel = this.getProjection().fromLatLngToContainerPixel(position);
            //根据经纬度坐标计算相对于地图内部容器原点的相对像素坐标
            var pixel = this.getProjection().fromLatLngToDivPixel(position);
            this.dom.style.left = pixel.getX() + 'px';
            this.dom.style.top = pixel.getY() + 'px';
        }
    }

    Label.prototype.destroy = function() {
        //移除dom
        this.dom.parentNode.removeChild(this.dom);
    }
    var label = new Label({
        map: map,
        position: center
    });
}
JavaScript+HTML

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" />
    <title>自定义Overlay</title>
    <style type="text/css">
        * {
            margin: 0px;
            padding: 0px;
        }
        body,
        button,
        input,
        select,
        textarea {
            font: 12px/16px Verdana, Helvetica, Arial, sans-serif;
        }
        #info {
            width: 603px;
            padding-top: 3px;
            overflow: hidden;
        }
        .btn {
            width: 190px;
        }
    </style>
    <script charset="utf-8" src="https://map.qq.com/api/js?v=2.exp&key=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77"></script>

</head>

<body onload="init()">
    <script>
        function init() {
            var center = new qq.maps.LatLng(39.982163, 116.306070);
            var map = new qq.maps.Map(document.getElementById("container"), {
                center: center,
                zoom: 14
            });
            var Label = function(opts) {
                qq.maps.Overlay.call(this, opts);
            }

            //继承Overlay基类
            Label.prototype = new qq.maps.Overlay();
            //定义construct,实现这个接口来初始化自定义的Dom元素
            Label.prototype.construct = function() {
                this.dom = document.createElement('div');
                this.dom.style.cssText =
                    'background:#0f0;color:white;position:absolute;' +
                    'text-align:center;width:100px;height:30px';
                this.dom.innerHTML = 'Hello world';

                //将dom添加到覆盖物层,overlayLayer的顺序为容器 1,此容器中包含Polyline、Polygon、GroundOverlay等
                this.getPanes().overlayLayer.appendChild(this.dom);

            }
            //绘制和更新自定义的dom元素
            Label.prototype.draw = function() {
                //获取地理经纬度坐标
                var position = this.get('position');
                if (position) {
                    //根据经纬度坐标计算相对于地图外部容器左上角的相对像素坐标
                    //var pixel = this.getProjection().fromLatLngToContainerPixel(position);
                    //根据经纬度坐标计算相对于地图内部容器原点的相对像素坐标
                    var pixel = this.getProjection().fromLatLngToDivPixel(position);
                    this.dom.style.left = pixel.getX() + 'px';
                    this.dom.style.top = pixel.getY() + 'px';
                }
            }

            Label.prototype.destroy = function() {
                //移除dom
                this.dom.parentNode.removeChild(this.dom);
            }
            var label = new Label({
                map: map,
                position: center
            });
        }
    </script>
    <div style="width:603px;height:300px" id="container"></div>
    <div id="info">通过继承Overlay实现一个自定义的文本标记,设置自定义覆盖物位置。</div>
</body>

</html>