1. 程式人生 > >谷歌地圖,標記、多邊形繪製、地址搜尋、自定義右鍵選單

谷歌地圖,標記、多邊形繪製、地址搜尋、自定義右鍵選單

<!DOCTYPE HTML>
<html>
<head>
    <meta charset="UTF-8">
    <title>谷歌地圖測試</title>
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
    <meta name="renderer" content="webkit" />
    <meta content="initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no" name="viewport">
    <meta content="chrome=1" http-equiv="X-UA-Compatible">
    <link rel="icon" href="maps_32dp.ico" mce_href="maps_32dp.ico" type="image/x-icon" />

    <style>
        #map { width: 961px; height: 591px; margin: 0 auto; }
        html, body { height: 100%; margin: 0; padding: 0; }
        .itemDiv { margin-bottom: 20px; }
        .mytool { text-align: center; width: 40px; border: 1px solid #ccc; padding-top: 5px; padding-bottom: 5px; font-size: 10px; background: #ffffff; }
        .mytool > a { text-decoration: none; display: block; display: inline-block; padding: 4px 6px; }
        .mytool > a:hover { background-color: #b6ff00; }
    </style>
</head>
<body>
    <div id="map"></div>
    <div style="position:absolute;left:700px;bottom:128px;width:348px;height:50px;">
        <div>滑鼠點選位置座標:</div>
        <div id="msg"></div>
    </div>

    <div style="padding:50px;">
        <div class="itemDiv">
            Mark定位切換:<select id="positionList" onchange="pageConfig.changePosition(this)">
                <option value="">--請選擇--</option>
            </select>
        </div>
        <div class="itemDiv">
            店鋪服務範圍:<select id="Store" onchange="pageConfig.storeChange(this, event)"></select>
        </div>
        <div class="itemDiv">
            <input type="text" id="serarchAddressTxt" placeholder="搜尋地址" />
            <input type="button" value="搜尋" onclick="pageConfig.searchAddress()" /><span id="tishiMsg"></span>
        </div>
    </div>

    <script type="text/javascript">

        var serviceList = [{ "NetworkSysNo": 413463191394193400, "NetworkName": "寬窄巷子", "FullAddress": "四川省成都市青羊區寬窄巷子長順上街127號", "Contacts": "魯智深", "ContactNumber": "53453333333333334", "SysNo": 414861680137211900, "NetworkBizAuthSysNo": 413838142236266500, "MapType": 0, "MapScope": "30.659634242460026,104.04793404161421;30.668198440652468,104.05171059190718;30.66074172460761,104.05861996232954" }, { "NetworkSysNo": 413463191394193400, "NetworkName": "天府麗都喜來登飯店", "FullAddress": "四川省成都市青羊區騾馬市人民中路一段15號", "Contacts": "範喜鳳", "ContactNumber": "53453333333333334", "SysNo": 414861680191737860, "NetworkBizAuthSysNo": 413838142236266500, "MapScope": "30.662255263019365,104.07338284074751;30.66435941118352,104.07389782487837;30.662107601778743,104.0750565391728;30.662144517110058,104.07788895189253;30.660630976963905,104.07570026933638;30.658711330976477,104.07668732225386;30.65959732616989,104.07441280900923;30.658083746133983,104.07295368730513;30.660335649293653,104.07316826402632;30.661516954560145,104.07080792009322" }, { "NetworkSysNo": 413463191394193400, "NetworkName": "青羊宮", "FullAddress": "成都市青羊區青羊宮商圈青羊區180號", "Contacts": "蘇三四", "ContactNumber": "53453333333333334", "SysNo": 414861680216903700, "NetworkBizAuthSysNo": 413838142236266500, "MapType": 0, "MapScope": "30.65860058100626,104.06243942796675;30.652139946479448,104.06201027452437;30.652103027327172,104.06909130632368;30.658379080685105,104.0695633751103" }, { "NetworkSysNo": 413463191394193400, "NetworkName": "騾馬市", "FullAddress": "四川省成都市武侯區武侯祠武侯祠大街231號", "Contacts": "狄仁傑", "ContactNumber": "53453333333333334", "SysNo": 414861680288206850, "NetworkBizAuthSysNo": 413838142236266500, "MapType": 0, "MapScope": "30.667386350984888,104.06273983537642;30.667312524313026,104.07042168199507;30.663030480831143,104.0703358513066;30.66336271513254,104.06252525865523" }, { "NetworkSysNo": 413463191394193400, "NetworkName": "蜀九香火鍋酒樓", "FullAddress": "四川省成都市青羊區青羊宮商圈百花西路5號", "Contacts": "閻錫山", "ContactNumber": "53453333333333334", "SysNo": 414861680372092900, "NetworkBizAuthSysNo": 413838142236266500, "MapScope": "30.65752999141844,104.05141018449751;30.650626249675994,104.05269764482466;30.65428123318884,104.05810497819868;30.656680894693064,104.05514381944624;30.65476117025514,104.05359886705367" }, { "NetworkSysNo": 413463191394193400, "NetworkName": "成都圖書館", "FullAddress": "四川省成都市青羊區人民公園文翁路98號", "Contacts": "范文程", "ContactNumber": "53453333333333334", "SysNo": 414861680405647360, "NetworkBizAuthSysNo": 413838142236266500, "MapScope": "30.65878516421945,104.04394291460005;30.65804682925163,104.0408530098149;30.654835006515416,104.0408530098149;30.653875130733244,104.0448870521733;30.6556841194549,104.04720448076216;30.658083746133983,104.04505871355025" }, { "NetworkSysNo": 413463191394193400, "NetworkName": "航天科技大廈", "FullAddress": "四川省成都市錦江區指揮街111號", "Contacts": "李世民", "ContactNumber": "53453333333333334", "SysNo": 414861680439201800, "NetworkBizAuthSysNo": 413838142236266500, "MapScope": "30.650356275834888,104.0625315210408;30.64193818902546,104.0582829019612;30.640055095637415,104.06905465336501;30.6472549606879,104.07613568516433;30.650245516292472,104.06283192845046" }, { "NetworkSysNo": 413463191394193400, "NetworkName": "成都拖板鞋青年旅舍", "FullAddress": "四川省成都市錦江區合江亭東昇街98號", "Contacts": "薛呂徵", "ContactNumber": "53453333333333334", "SysNo": 414861680481144800, "NetworkBizAuthSysNo": 413838142236266500, "MapScope": "30.656890864252322,104.08128552647293;30.650799312735753,104.07394700260818;30.646959592152832,104.08055596562087;30.64902715295193,104.08257298680007;30.6472549606879,104.08407502384841;30.644596611393837,104.08094220371902;30.64337817687897,104.0828304788655;30.644116623871977,104.08789448948562;30.643415099362535,104.09175687046707;30.64969171667721,104.09609132023513" }, { "NetworkSysNo": 413463191394193400, "NetworkName": "成都泰合索菲特大飯店", "FullAddress": "四川省成都市錦江區濱江中路15號", "Contacts": "歐陽修", "ContactNumber": "53453333333333334", "SysNo": 414861680514699260, "NetworkBizAuthSysNo": 413838142236266500, "MapScope": "30.66541839148557,104.08712201328933;30.660471779015555,104.08386044712722;30.653789758716457,104.09849457951248;30.657296954039,104.10059743138015;30.660545610913708,104.09441762180984;30.662391390037417,104.09574799748123;30.66316660675722,104.097507526595;30.664015646505653,104.09789376469314;30.664938507336572,104.09802251072585;30.6656767896556,104.09789376469314;30.670918431917208,104.09566216679275;30.673133124873793,104.09484677525222;30.674240452312073,104.09287266941726" }];

        var map;
        var drawingManager;
        var infoWindow;
        var polygonArr = [];
        var select_OldPolygon;
        //待刪除的多邊形服務範圍
        var waitRemovePolygon = null;

        var arrPosition = [
            [{ name: '四川科技館', address: "四川省成都市青羊區騾馬市人民中路一段16號" }, 30.659634242460026, 104.06582974016158],//四川科技館
            [{ name: '人民公園', address: "四川省成都市青羊區人民公園祠堂街9號" }, 30.65711866001459, 104.05755979623416],//人民公園
            [{ name: '航天科技大廈', address: '四川省成都市錦江區新光華街1號' }, 30.65245921769793, 104.06661987304688],//航天科技大廈
            [{ name: '陝西街', address: '四川省成都市青羊區陝西街195號' }, 30.654457224647835, 104.06189424600223],//陝西街
            [{ name: '金家壩街', address: '四川省成都市青羊區金家壩街' }, 30.659813581249217, 104.06193716134646],//金家壩街
            [{ name: '陽光大廈', address: '四川省成都市錦江區鹽市口商圈順城大街11號' }, 30.655829211946056, 104.07251889061115],
            [{ name: '青龍湖溼地公園', address: '十陵風景區內' }, 30.634983010145675, 104.18836222190498], //青龍湖溼地公園
            [{ name: '彭州園', address: '四川省成都市彭州市外西街' }, 30.98546577967493, 103.93127657158232]
        ];

        var result_mark;
        var pageConfig = {
            //右鍵選單
            createRightMenu: function (divDom, map) {
                var controlUI = document.createElement('div');
                var waiDiv = document.createElement('div');
                waiDiv.className = "mytool";

                var a1 = document.createElement('a');
                a1.href = "javascript:;";
                a1.innerText = "編輯";
                a1.addEventListener('click', function (source, event) {
                    waitRemovePolygon.setEditable(true);
                    document.getElementById('rightMenu').remove();
                });
                waiDiv.appendChild(a1);

                var a2 = document.createElement('a');
                a2.href = "javascript:;";
                a2.innerText = "完成";
                a2.addEventListener('click', function (source, event) {
                    waitRemovePolygon.setEditable(false);
                    document.getElementById('rightMenu').remove();

                    //記錄多邊形坐標點                  
                    console.log(waitRemovePolygon);
                    var array = waitRemovePolygon.getPath().getArray();
                    var pathStrArr = [];
                    for (var i = 0; i < array.length; i++) {
                        var item = array[i];
                        var txt = item.lat() + "," + item.lng();
                        pathStrArr.push(txt);
                        console.log(txt);
                    }             
                });
                waiDiv.appendChild(a2);

                var a3 = document.createElement('a');
                a3.href = "javascript:;";
                a3.innerText = "刪除";
                a3.addEventListener('click', function (source, event) {
                    waitRemovePolygon.setMap(null);
                    document.getElementById('rightMenu').remove();
                });
                waiDiv.appendChild(a3);

                divDom.appendChild(waiDiv);
            },

            //多邊形右鍵事件
            polygonRightClick: function (obj, event) {
                waitRemovePolygon = obj;
                //console.log(event);
                var txt = event.Ha.clientX + ',' + event.Ha.clientY;
                //測試demo沒有全屏,水平方向與左側螢幕邊有距離,所以要減去
                var positionX = event.Ha.clientX-230;
                var positionY = event.Ha.clientY;
                console.log("右鍵坐標"+txt);
                //判斷是否存在此選單
                if (document.getElementById('rightMenu') != undefined) {
                    document.getElementById('rightMenu').remove();
                }
                var controlDiv = document.createElement('div');
                controlDiv.id = 'rightMenu';
                controlDiv.index = 1;
                controlDiv.style.position = "absolute";
                controlDiv.style.zIndex = "20000";
                controlDiv.style.left = positionX + 'px';
                controlDiv.style.top = positionY + 'px';
                controlDiv.style.display = "none";

                var rightMenu = new pageConfig.createRightMenu(controlDiv, map);
                map.controls[google.maps.ControlPosition.CENTER].push(controlDiv);
                setTimeout(function () {
                    controlDiv.style.left = positionX + 'px';
                    controlDiv.style.top = positionY + 'px';
                    controlDiv.style.display = "block";
                }, 10);
                //10秒不操作移除右鍵選單
                setTimeout(function () {
                    controlDiv.remove();
                }, 10000);
            },

            //載入多邊形,服務範圍
            loadPolygon: function (areaList) {

                for (var i = 0; i < areaList.length; i++) {
                    var item = areaList[i];

                    var postions = item.MapScope.split(';');
                    var triangleCoords = [];

                    for (var g = 0; g < postions.length; g++) {
                        var item_g = postions[g];
                        var lat = parseFloat(item_g.split(',')[0]);
                        var lng = parseFloat(item_g.split(',')[1]);
                        triangleCoords.push({ lat: lat, lng: lng });
                    }
                    //var triangleCoords = [
                    //    { lat: 30.664033294338832, lng: 104.07738823715908 },
                    //    { lat: 30.660710922980797, lng: 104.08755917374356 },
                    //    { lat: 30.65617016408385, lng: 104.08348221604092 },
                    //    { lat: 30.65908661097046, lng: 104.07468457047207 }
                    //];

                    //計算多邊形中心座標
                    var centerLatLng = pageConfig.getCenter(triangleCoords);

                    // Construct the polygon.
                    var _old_Polygon = new google.maps.Polygon({
                        paths: triangleCoords,
                        strokeColor: '#FF0000',
                        strokeOpacity: 0.8,
                        strokeWeight: 2,
                        fillColor: '#FF0000',
                        fillOpacity: 0.2,
                        //title:'測試服務範圍1'
                    });

                    //方便選中店鋪高亮顯示
                    _old_Polygon.SysNo = item.SysNo;
                    //中心座標
                    _old_Polygon.CenterLatLng = centerLatLng;
                    polygonArr.push(_old_Polygon);

                    _old_Polygon.setMap(map);
                    //清理集合
                    triangleCoords.length = 0;

                    _old_Polygon.info = {
                        id: item.NetworkSysNo,
                        name: item.NetworkName,
                        address: item.FullAddress,
                        contact: item.Contacts,
                        phone: item.ContactNumber
                    };

                    //服務範圍點選,資訊提示
                    _old_Polygon.addListener("click", function (event) {
                        var objInfo = this.info;

                        var msg = objInfo.name + "<br />" +
                            "地址:" + objInfo.address + "<br />" +
                            "聯絡人:" + objInfo.contact + "<br />" +
                            "電話:" + objInfo.phone;

                        pageConfig.markerTips(msg, event.latLng);
                    });

                    //註冊多邊形右鍵事件
                    _old_Polygon.addListener('rightclick', function (event) {
                        pageConfig.polygonRightClick(this, event);
                    });
                }
                //定位服務範圍第一個服務區
                if (polygonArr.length > 0) {
                    var firstOne = polygonArr[0];
                    map.panTo(firstOne.CenterLatLng);
                }
            },

            //改變位置定位
            changePosition: function (thisObj) {
                var position = new google.maps.LatLng(thisObj.value.split(',')[0], thisObj.value.split(',')[1]);
                if (result_mark != null) {
                    result_mark.setMap(null);
                }
                result_mark = new google.maps.Marker({ position: position });
                result_mark.setMap(map);
                map.panTo(position, 15);
            },

            //搜尋地址
            searchAddress: function () {
                var index = 0;
                var waitShow = setInterval(function () {
                    if (index == 4) {
                        index = 1;
                    }
                    var points = "。。。。。";
                    var shouPoints = points.substring(0, index);
                    document.getElementById('tishiMsg').innerHTML = "查詢中" + shouPoints;
                    index++;
                }, 200);

                var address = document.getElementById("serarchAddressTxt").value;
                var request = {
                    address: address
                };
                var geocoder = new google.maps.Geocoder();
                geocoder.geocode(request,
                    function (GeocoderResult, GeocoderStatus) {
                        //移除載入等待效果...
                        window.clearInterval(waitShow);
                        document.getElementById('tishiMsg').innerHTML = "";

                        console.log("GeocoderStatus:" + GeocoderStatus);
                        console.log(GeocoderResult);
                        //GeocoderResult.geometry.location
                        var location = GeocoderResult[0].geometry.location;
                        console.log(GeocoderResult[0].geometry.location);
                        if (result_mark != null) {
                            result_mark.setMap(null);
                        }
                        result_mark = new google.maps.Marker({ position: location });
                        result_mark.setMap(map);
                        //定位到搜尋結果
                        map.panTo(location);
                    });
            },

            //計算多邊形中心點
            getCenter: function (triangleCoords) {
                var x = 0.0;
                var y = 0.0;
                for (var i = 0; i < triangleCoords.length; i++) {
                    x = x + parseFloat(triangleCoords[i].lat);
                    y = y + parseFloat(triangleCoords[i].lng);
                }
                x = x / triangleCoords.length;
                y = y / triangleCoords.length;
                return new google.maps.LatLng(x, y);
            },

            //彈出訊息框
            markerTips: function (msg, position) {
                infoWindow.setContent(msg);
                infoWindow.setPosition(position);
                infoWindow.open(map);
            },

            //店鋪改變時
            storeChange: function (obj, event) {
                //失去焦點後還原填充色
                if (select_OldPolygon != undefined && select_OldPolygon != null) {
                    select_OldPolygon.setOptions({ fillColor: '#FF0000' });
                }
                //高亮定位到選擇的服務區
                var storeId = obj.value;
                //console.log("storeId=" + storeId);
                var polygonResult = polygonArr.find(w => w.SysNo == storeId);
                polygonResult.setOptions({ fillColor: '#33CC33' });
                //定位此圖
                map.panTo(polygonResult.CenterLatLng);
                //顯示出此中心
                //pageConfig.markerTips(polygonResult.CenterLatLng.toString(), polygonResult.CenterLatLng);
                //顯示服務區資訊
                //var objInfo = polygonResult.info;
                //var infoMsg = objInfo.name + "<br />" +
                //    "地址:" + objInfo.address + "<br />" +
                //    "聯絡人:" + objInfo.contact + "<br />" +
                //    "電話:" + objInfo.phone;
                //pageConfig.markerTips(infoMsg,polygonResult.CenterLatLng);
                select_OldPolygon = polygonResult;
                //console.log(polygonResult);
            }
        }

        //載入位置下拉框
        var arr_select = [];
        for (var i = 0; i < arrPosition.length; i++) {
            var item = arrPosition[i];
            var p = item[1] + "," + item[2];
            var option = '<option value="' + p + '">' + item[0].name + '</option>';
            arr_select.push(option);
        }
        document.getElementById('positionList').innerHTML += arr_select.join('');

        //地圖初始化
        function initMap() {
            map = new google.maps.Map(document.getElementById('map'), {
                center: new google.maps.LatLng(arrPosition[0][1], arrPosition[0][2]),
                zoom: 15,
                mapTypeId: google.maps.MapTypeId.ROADMAP,
				mapTypeControl: false,//地圖型別選擇,地形,衛星之類
				scaleControl: false,
				streetViewControl: false,//不顯示街景【按鈕】,地圖中右側的小人
				zoomControl: false,    //不顯示縮放【按鈕】+-號
				fullscreenControl:false //不顯示全屏【按鈕】
            });

            //訊息框初始化
            infoWindow = new google.maps.InfoWindow;

            //繪畫工具
            drawingManager = new google.maps.drawing.DrawingManager({
                //drawingMode: google.maps.drawing.OverlayType.POLYGON,
                drawingControl: true,
                drawingControlOptions: {
                    position: google.maps.ControlPosition.TOP_CENTER,
                    drawingModes: [
                        //多邊形
                        google.maps.drawing.OverlayType.POLYGON
                    ]
                },
                polygonOptions: {
                    strokeColor: "#000000",
                    strokeOpacity: 1,
                    strokeWeight: 2,
                    fillColor: "#FF0000",
                    fillOpacity: 0.2,
                    editable: true,
                    geodesic: true,
                }
            });
            //繪圖工具載入設定
            drawingManager.setMap(map);

            eventList();

            //載入多邊形
            pageConfig.loadPolygon(serviceList);

            //註冊 多邊形 繪製完成事件
            google.maps.event.addListener(drawingManager, 'polygoncomplete', function (polygon) {
                //退出繪圖模式
                drawingManager.setDrawingMode(null);

                //退出編輯模式
                polygon.setEditable(false);

                //console.log(polygon);
                console.log("-----------------");
                var array = polygon.getPath().getArray();
                var pathStrArr = [];
                for (var i = 0; i < array.length; i++) {
                    var item = array[i];
                    var txt = item.lat() + "," + item.lng();
                    pathStrArr.push(txt);
                    console.log(txt);
                }

                //註冊多邊形右鍵事件
                polygon.addListener('rightclick', function (event) {
                  pageConfig.polygonRightClick(this, event);
                });
            });
        }

        function eventList() {
            //google.maps.event.addListener(map, 'center_changed', function () {
            //    console.log(map.mapUrl);
            //});
            google.maps.event.addListener(map, 'click', function (event) {
                var html = event.latLng.lat() + "," + event.latLng.lng();
                //console.log(html);
                document.getElementById("msg").innerHTML = html;
            });
        }

        !function () {
            //enter事件
            document.onkeydown = function (e) {
                if (!e) {
                    e = window.event;
                }
                if ((e.keyCode || e.which) == 13) {
                    //搜尋地址
                    pageConfig.searchAddress();
                }
            }

            //載入店鋪 下拉框
            var store = document.getElementById("Store");
            var optionArr = [];
            for (var i = 0; i < serviceList.length; i++) {
                var item = serviceList[i];
                var html = '<option value="' + item.SysNo + '">' + item.NetworkName + '</option>';
                optionArr.push(html);
            }
            store.innerHTML = optionArr.join('');
        }();
    </script>
    <script src="http://maps.google.cn/maps/api/js?sensor=false&libraries=drawing&callback=initMap" async defer></script>
</body>
</html>