【问题标题】:How to create Google Latitude like markers?如何创建类似谷歌纵横的标记?
【发布时间】:2011-08-13 03:32:06
【问题描述】:

在我的 HTML5 应用程序中,我使用 Google Map v3 并在地图上添加了几个标记。放置新标记和更改图标很容易,但我希望能够构建像谷歌纵横中使用的标记。这些标记设置有图标图像和漂亮的边框。
关于如何做到这一点的任何想法?

【问题讨论】:

  • 您在使用任何 JavaScript 框架还是愿意使用启用 JavaScript 框架的插件?

标签: javascript jquery google-maps google-maps-markers


【解决方案1】:

您可以在服务器端执行此操作,或者由于您使用的是 HTML 5,并且假设您有可用的画布,您可以在客户端执行此操作。下面是一种使用 HTML 5 画布在客户端执行此操作的方法。在服务器端执行此操作会因您使用的语言而异,但技术会相似。

下载这些图片并尝试一下。图像需要与页面位于同一域中以避免安全错误。除非您更新 HTML 中的位置,否则它们也应该位于同一目录中。

页面加载后,单击人脸,将使用提供的框架图像创建一个随机标记并将其添加到 Google 地图。

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; utf-8">
        <title>HTML 5 Canvas Image Processing</title>
    </head>
    <body>
        <img onclick="build(this)" id="face1" src="face1.png"/>
        <img onclick="build(this)" id="face2" src="face2.png"/>
        <img onclick="build(this)" id="face3" src="face3.png"/>
        <img id="frame" src="frame.png"/>
        <div id="map_canvas" style="width:640px;height:480px;">
        </div>
        <script type="text/javascript">

            function build(caller){
                var image = getMergedUrl(document.getElementById("frame"), caller);
                var myLatLng = getRndPos(map.getBounds());
                var myMarker = new google.maps.Marker({
                    position: myLatLng,
                    map: map,
                    icon: image
                });

            }

            function getRndPos(bounds) {
                var xDiff = Math.abs(bounds.getNorthEast().lng() - bounds.getSouthWest().lng());
                var yDiff = Math.abs(bounds.getNorthEast().lat() - bounds.getSouthWest().lat());
                var xMin = Math.min(bounds.getNorthEast().lng(),bounds.getSouthWest().lng());
                var yMin = Math.min(bounds.getNorthEast().lat(),bounds.getSouthWest().lat());
                var x = xMin + xDiff * Math.random();
                var y = yMin + yDiff * Math.random();
                var pos = new google.maps.LatLng(y,x);
                return pos;
            }

            function getMergedUrl(frame, pic){
                // Create an empty canvas element
                var canvas = document.createElement("canvas");
                canvas.width = frame.width;
                canvas.height = frame.height;

                // Copy the image contents to the canvas
                var ctx = canvas.getContext("2d");
                ctx.drawImage(frame, 0, 0);
                ctx.drawImage(pic, 4, 4);

                // Get the data-URL formatted image
                var dataURL = canvas.toDataURL("image/png");

                return dataURL;
            }

            function initialize(){
                var myLatlng = new google.maps.LatLng(-34.397, 150.644);
                var myOptions = {
                    zoom: 8,
                    center: myLatlng,
                    mapTypeId: google.maps.MapTypeId.ROADMAP
                }
                map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
            }

            function loadScript(){
                var script = document.createElement("script");
                script.type = "text/javascript";
                script.src = "http://maps.google.com/maps/api/js?sensor=false&callback=initialize";
                document.body.appendChild(script);
            }

            window.onload = loadScript;
        </script>
    </body>
</html>

感谢Matthew Crumley 提供来自here 的toDataUrl 代码。

【讨论】:

    猜你喜欢
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2016-10-31
    • 2011-05-25
    • 2018-09-26
    • 2013-05-14
    • 1970-01-01
    相关资源
    最近更新 更多