JS自定义地图标注

作者:翅膀的初衷 来源:本站原创 发布时间:2014-08-20 查看数:45107

前面写过一个在百度地图上面做标记的文章,今天再来讲讲怎么在自定义地图(也不一定是地图)上做标记。

比如像一人员定位系统之类的软件,就需要用到类似的功能,不过以前大多都是在桌面软件上实现,今天我在这里演示如何在web平台实本功能。

首先我们需要用到一张地图素材,我在这里随便在网上搜了一张某某矿井的地图:

{width="600"}

原理其实很简单,我们只要监视容器的click事件,然后计算出点击位置的相对坐标保存即可:\

            $("#allmap").click(function (e) {
                if (e.target == document.getElementById("allmap")) {
                    addMarker(0, '', e.offsetX, e.offsetY);
                    return false;
                }
            });

完整代码如下:

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>地图标记</title>
    <script src="http://www.jiniannet.com/Scripts/json2.js"></script>
    <script src="http://www.jiniannet.com/resources/Script/JQuery.js"></script>
    <style type="text/css">
        body, html, #allmap { margin: 0; padding: 0; width: 100%; height: 100%; overflow: hidden; }
        .hidden { display: none; }
        #allmap { background: #ffffff no-repeat center center; position: relative; overflow: hidden; *zoom: 1; -moz-user-select: none; /*火狐*/ -webkit-user-select: none; /*webkit浏览器*/ -ms-user-select: none; /*IE10*/ -khtml-user-select: none; /*早期浏览器*/ user-select: none; }
        #box { height: 100%; position: relative; overflow: auto; *zoom: 1; border: solid 1px #ccc; }
        #bar { width: 220px; position: absolute; background: #000000; right: 5px; border: solid 1px #808080; top: 20px; background: #f5f5f5; padding: 10px; font-size: 12px; }
            #bar .row { padding: 5px 0; }
            #bar ul { margin: 0; padding: 0; overflow: auto; }
                #bar ul li { margin: 0; padding: 0; list-style: none; }
                    #bar ul li input { width: 80px; }
        .marker, .marker-hover { height: 36px; overflow: hidden; position: absolute; vertical-align: middle; font-size: 12px; width: 100px; overflow: hidden; z-index: 9999; }
            .marker i { display: block; overflow: hidden; border-radius: 5px; vertical-align: middle; border: solid 1px #46a47e; background-color: #8df5cb; margin: auto; height: 14px; width: 50px; filter: alpha(Opacity=80); -moz-opacity: 0.5; opacity: 0.5; }
            .marker em { display: block; background-color: #46a47e; width: 10px; height: 10px; overflow: hidden; border-radius: 100%; vertical-align: middle; position: absolute; top: 3px; left: 45px; }
            .marker span, .marker-hover span { color: #000; font-size: 12px; line-height: 20px; display: block; vertical-align: middle; width: 100%; height: 20px; text-align: center; overflow: hidden; text-shadow: 1px 1px 5px #fff; color: #10896b; }
            .marker-hover i { display: block; overflow: hidden; border-radius: 5px; vertical-align: middle; border: solid 1px #980808; background-color: #f7987e; margin: auto; height: 14px; width: 50px; filter: alpha(Opacity=80); -moz-opacity: 0.5; opacity: 0.5; }
            .marker-hover em { display: block; background-color: #f00; width: 10px; height: 10px; overflow: hidden; border-radius: 100%; vertical-align: middle; position: absolute; top: 3px; left: 45px; }
    </style>
    <script type="text/javascript">
        var config = {
            index: 0
        };
        function load(callback) {
            var src = $("#url").val();
            if (!src) {
                alert('请填写图片地址');
                return;
            }

            $("#allmap").css({
                backgroundImage: ''
            }).html('加载中……');

            var img = new Image();
            img.onerror = function () {
                alert("图片加载失败");
            };
            img.onload = function () {

                $("#allmap").css({
                    width: img.width + "px",
                    height: img.height + "px",
                    backgroundImage: 'url(' + src + ')'
                }).html('');

                if (callback) {
                    callback();
                }
            };
            img.src = src;
            $("#items li").remove();
            config.index = 0;
        }

        function addMarker(id, name, x, y) {
            if (!name) {
                name = "未命名 " + (config.index + 1);
            }

            $('<div class="marker" onclick="return false" id="marker' + config.index + '" data-id="' + config.index + '" title="' + name + '" style="left:' + (x - 50) + 'px;top:' + (y - 8) + 'px"><i></i><span>' + name + '</span><em></em></div>').appendTo($("#allmap"));
            $("#items").append('<li id="li' + config.index + '" data-option="x:' + x + ',y:' + y + ',id:' + id + '"><input type="text" onchange="setMarkerValue(' + config.index + ',this.value)" id="markername' + config.index + '"  value="' + name + '" /> <span id="sp' + config.index + '">X:' + x + ' Y: ' + y + '</span> <a href="javascript:del(' + config.index + ')">删除</a></li>');
            config.index++;
        }
        //onchange
        function del(i) {
            var j = eval("({" + $('#li' + i).attr("data-option") + "})");
            if (parseInt(j.id) > 0) {
                $.ajax({
                    url: 'DEMMARKER.aspx',
                    type: "post",
                    data: "id=" + j.id,
                    success: function (r) {
                        if (r == "ok") {
                            $('#li' + i + ',#marker' + i).remove();
                        } else {
                            alert(r);
                        }
                    }
                });

            } else {
                $('#li' + i + ',#marker' + i).remove();
            }
        }

        function setMarkerValue(i, value) {
            $("#marker" + i).attr("title", value);
            $("#marker" + i + " span").html(value);
        }

        function save() {
            var data = [];
            var html = '';
            var list = $("#items li");
            for (var i = 0; i < list.length; i++) {
                var j = eval("({" + $(list[i]).attr("data-option") + "})");
                j.title = list[i].getElementsByTagName("input").item(0).value;
                data.push(j);
            }


            alert('此处进行AJAX保存:' + JSON.stringify(data));
            alert('保存成功');
        }

        $(function () {
            var id = '';

            $("#allmap").click(function (e) {
                if (e.target == document.getElementById("allmap")) {
                    addMarker(0, '', e.offsetX, e.offsetY);
                    return false;
                }
            });
            var h = $(window).height();
            var w = $(window).width();
            $("#bar").height(h - 70);
            $("#items").height(h - 150);
            $("#box").width(w - 260)

            $(".marker").live("mousemove", function (e) {
                $(this).css("cursor", "move");
            });
            $(".marker").live("mouseout", function (e) {
                $(this).css("cursor", "normal");
            });
            $(".marker").live("mousedown", function (e) {
                var s = $(this)[0];
                var d = document;
                var x = e.clientX + d.body.scrollLeft - s.offsetLeft;//offsetX
                var y = e.clientY + d.body.scrollTop - s.offsetTop;
                var l = 0, t = 0;

                d.ondragstart = "return false;";
                d.onselectstart = "return false;";
                d.onselect = "document.selection.empty();";
                if (s.setCapture) {
                    s.setCapture();
                } else if (window.captureEvents) {
                    window.captureEvents(Event.MOUSEMOVE | Event.MOUSEUP);
                } else { }
                d.onmousemove = function (e1) {
                    if (!e1) {
                        e1 = window.event;
                    }
                    l = e1.clientX + document.body.scrollLeft - x;
                    t = e1.clientY + document.body.scrollTop - y;


                    s.style.left = l + "px";
                    s.style.top = t + "px";
                    var dataId = $(s).attr("data-id");
                    $("#li" + dataId).attr("data-option", 'x:' + (l + 50) + ',y:' + (t + 8) + ',id:' + dataId);
                    $("#sp" + dataId).html('X:' + (l + 50) + ' Y: ' + (t + 8));
                    //$('<div class="marker" onclick="return false" id="marker' + config.index + '" title="' + name + '" style="left:' + (x - 50) + 'px;top:' + (y - 8) + 'px"><i></i><span>' + name + '</span><em></em></div>').appendTo($("#allmap"));
                    //$("#items").append('<li id="li' + config.index + '" data-option="x:' + x + ',y:' + y + ',id:' + id + '"><input type="text" onchange="setMarkerValue(' + config.index + ',this.value)" id="markername' + config.index + '"  value="' + name + '" /> <span>X:' + x + ' Y: ' + y + ' <a href="javascript:del(' + config.index + ')">删除</a></li>');
                };
                d.onmouseup = function () {
                    if (s.releaseCapture) {
                        s.releaseCapture();
                    } else if (window.captureEvents) {
                        window.captureEvents(Event.MOUSEMOVE | Event.MOUSEUP);
                    } else { }
                    d.onmousemove = null;
                    d.onmouseup = null;
                    d.ondragstart = null;
                    d.onselectstart = null;
                    d.onselect = null;
                };
            });

            if (id) {
                $.ajax({
                    url: 'Marker.json?id=' + id,
                    dataType: "jsonp",
                    jsonp: "callback",
                    success: function (json) {
                        $("#url").val(json.url);
                        if (json.url) {
                            load(function () {
                                for (var i = 0; i < json.list.length; i++) {
                                    addMarker(json.list[i].id, json.list[i].title, json.list[i].x, json.list[i].y);
                                }
                            });
                        }
                    }, error: function (a, b) { alert(a.responseText); alert(b) }
                });
            } else {
                if ($("#url").val()) {
                    load();
                }
            }


        });

        function uploadfile() {
            $("#btnUpload").click();
        }
    </script>
</head>
<body>
    <div id="box">
        <div id="allmap">
        </div>
    </div>
    <div id="bar">
        <form id="form1" runat="server">
            <div class="row">图片地址:<input type="text" id="url" runat="server" value="http://www.jiniannet.com/Attachment/20191" /> </div>
            <div class="row">
                <asp:FileUpload ID="files" onchange="uploadfile()" runat="server" CssClass="hidden" />
                <input type="button" onclick="$('#files').click()" value="浏览" />
                <asp:Button ID="btnUpload" runat="server" CssClass="hidden" Text="上传" OnClick="btnUpload_Click" />
                <input type="button" onclick="load()" value="加载" />
                <input type="button" value="保存" onclick="save()" />
            </div>
            <div class="item">
                <ul id="items"></ul>
            </div>
        </form>
    </div>

</body>
</html>

实现效果

{width="600"}