首页 > 解决方案 > 当标记超出指定区域时收到警报(Google Maps API)

问题描述

我是谷歌地图的新手,当标记移出圆圈时我需要收到警报,我已经创建了地图并添加了一些圆圈来表示标记可以停留的区域,在它们之外我需要显示一个警告宣布这不是覆盖区域。

我的代码如下:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Documento sin título</title>
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyCA3CvqkU5D5dLfADaABJi3OxjoWL64keA&callback=initMap&libraries=places&v=weekly" defer></script> 
<script type="text/javascript">
    const citymap = {
           escalon: {
             center: { lat: 13.701984532461921, lng: -89.23395010808454 },
           },
         };
         const citymap1 = {
           matriz: {
             center: { lat: 13.699526, lng: -89.196691 },
           },
         };
         const citymap2 = {
           plaza: {
             center: { lat: 13.699581, lng: -89.189770 },
           },
         };
         const citymap3 = {
           ahuachapan: {
             center: { lat: 13.920266, lng: -89.847658 },
           },
         };
         const citymap4 = {
           sanMiguel: {
             center: { lat: 13.484937, lng: -88.177339 },
           },
         };
         const citymap5 = {
           santaAna: {
             center: { lat: 13.993704, lng: -89.556913 },
           },
         };
         const citymap6 = {
           sonsonate: {
             center: { lat: 13.720177, lng: -89.727801 },
           },
         };
        function initialize() {
            // Creating map object
            var map = new google.maps.Map(document.getElementById('map_canvas'), {
                zoom: 12,
                center: new google.maps.LatLng(13.701277, -89.224468),
                mapTypeId: google.maps.MapTypeId.ROADMAP
            });
            var vMarker = new google.maps.Marker({
                position: new google.maps.LatLng(13.701277, -89.224468),
                draggable: true
            });
            google.maps.event.addListener(vMarker, 'dragend', function (evt) {
                $("#txtLat").val("https://www.google.es/maps/dir/" + evt.latLng.lat().toFixed(6) + ", " +  evt.latLng.lng().toFixed(6));

                map.panTo(evt.latLng);
            });
            
            for (const city in citymap) {
             // Add the circle for this city to the map.
             const vMarker = new google.maps.Marker({
                position: new google.maps.LatLng(13.701277, -89.224468),
                draggable: true
            });
           }
           for (const city in citymap) {
             // Add the circle for this city to the map.
             const cityCircle = new google.maps.Circle({
               strokeColor: "#0066cc",
               strokeOpacity: 0.8,
               strokeWeight: 2,
               fillColor: "#0066cc",
               fillOpacity: 0.35,
               map,
               center: citymap[city].center,
               radius: 8000,
             });
           }
            for (const city in citymap1) {
             // Add the circle for this city to the map.
             const cityCircle = new google.maps.Circle({
               strokeColor: "#0066cc",
               strokeOpacity: 0.8,
               strokeWeight: 2,
               fillColor: "#0066cc",
               fillOpacity: 0.35,
               map,
               center: citymap1[city].center,
               radius: 5000,
             });
           }
            for (const city in citymap2) {
             // Add the circle for this city to the map.
             const cityCircle = new google.maps.Circle({
               strokeColor: "#0066cc",
               strokeOpacity: 0.8,
               strokeWeight: 2,
               fillColor: "#0066cc",
               fillOpacity: 0.35,
               map,
               center: citymap2[city].center,
               radius: 5000,
             });
           }
           for (const city in citymap3) {
             // Add the circle for this city to the map.
             const cityCircle = new google.maps.Circle({
               strokeColor: "#0066cc",
               strokeOpacity: 0.8,
               strokeWeight: 2,
               fillColor: "#0066cc",
               fillOpacity: 0.35,
               map,
               center: citymap3[city].center,
               radius: 7000,
             });
           }
           for (const city in citymap4) {
             // Add the circle for this city to the map.
             const cityCircle = new google.maps.Circle({
               strokeColor: "#0066cc",
               strokeOpacity: 0.8,
               strokeWeight: 2,
               fillColor: "#0066cc",
               fillOpacity: 0.35,
               map,
               center: citymap4[city].center,
               radius: 7000,
             });
           }
           for (const city in citymap5) {
             // Add the circle for this city to the map.
             const cityCircle = new google.maps.Circle({
               strokeColor: "#0066cc",
               strokeOpacity: 0.8,
               strokeWeight: 2,
               fillColor: "#0066cc",
               fillOpacity: 0.35,
               map,
               center: citymap5[city].center,
               radius: 7000,
             });
           }
           for (const city in citymap6) {
             // Add the circle for this city to the map.
             const cityCircle = new google.maps.Circle({
               strokeColor: "#0066cc",
               strokeOpacity: 0.8,
               strokeWeight: 2,
               fillColor: "#0066cc",
               fillOpacity: 0.35,
               map,
               center: citymap6[city].center,
               radius: 7000,
             });
           }
            
            

            // centers the map on markers coords
            map.setCenter(vMarker.position);

            // adds the marker on the map
            vMarker.setMap(map);
        }
        
    </script>
</head>

<body  onload="initialize();">
<div id='map_canvas' style='width: auto; height: 500px;'></div>
</body>
</html>

我给你留下了这个示例代码,以便更广泛地了解我的问题,因为我正在尝试做的是一种送货上门服务,地图上标记为蓝色的区域是如果有覆盖的区域我的送货上门,但如果标记位于它们之外,或者如果客户将它们移到它们之外,我需要显示警报以警告它不可能,我感谢所有的支持,问候。

标签: javascripthtmlapigoogle-maps

解决方案


您可以通过获取getBounds()圆圈的边界并检查标记的位置是否在这些边界内来做到这一点,如下所示:

function init() {
    var
        contentCenter = '<span class="infowin">Center Marker (draggable)</span>',
        contentA = '<span class="infowin">Marker A (draggable)</span>',
        contentB = '<span class="infowin">Marker B (draggable)</span>';
    var
        latLngCenter = new google.maps.LatLng(37.081476, -94.510574),
        latLngCMarker = new google.maps.LatLng(37.0814, -94.5105),
        latLngA = new google.maps.LatLng(37.2, -94.1),
        latLngB = new google.maps.LatLng(38, -93),
        map = new google.maps.Map(document.getElementById('map'), {
            zoom: 7,
            center: latLngCenter,
            mapTypeId: google.maps.MapTypeId.ROADMAP,
            mapTypeControl: false
        }),
        markerCenter = new google.maps.Marker({
            position: latLngCMarker,
            title: 'Location',
            map: map,
            draggable: true
        }),
        infoCenter = new google.maps.InfoWindow({
            content: contentCenter
        }),
        markerA = new google.maps.Marker({
            position: latLngA,
            title: 'Location',
            map: map,
            draggable: true
        }),
        infoA = new google.maps.InfoWindow({
            content: contentA
        }),
        markerB = new google.maps.Marker({
            position: latLngB,
            title: 'Location',
            map: map,
            draggable: true
        }),
        infoB = new google.maps.InfoWindow({
            content: contentB
        })
        // exemplary setup: 
        // Assumes that your map is signed to the var "map"
        // Also assumes that your marker is named "marker"
        ,
        circle = new google.maps.Circle({
            map: map,
            clickable: false,
            // metres
            radius: 100000,
            fillColor: '#fff',
            fillOpacity: .6,
            strokeColor: '#313131',
            strokeOpacity: .4,
            strokeWeight: .8
        });
    // attach circle to marker
    circle.bindTo('center', markerCenter, 'position');

    var
    // get the Bounds of the circle
    bounds = circle.getBounds()
    // Note spans
    ,
        noteA = jQuery('.bool#a'),
        noteB = jQuery('.bool#b');

    noteA.text(bounds.contains(latLngA));
    noteB.text(bounds.contains(latLngB));

    // get some latLng object and Question if it's contained in the circle:
    google.maps.event.addListener(markerCenter, 'dragend', function() {
        latLngCenter = new google.maps.LatLng(markerCenter.position.lat(), markerCenter.position.lng());
        bounds = circle.getBounds();
        noteA.text(bounds.contains(latLngA));
        noteB.text(bounds.contains(latLngB));
    });

    google.maps.event.addListener(markerA, 'dragend', function() {
        latLngA = new google.maps.LatLng(markerA.position.lat(), markerA.position.lng());
        noteA.text(bounds.contains(latLngA));
    });

    google.maps.event.addListener(markerB, 'dragend', function() {
        latLngB = new google.maps.LatLng(markerB.position.lat(), markerB.position.lng());
        noteB.text(bounds.contains(latLngB));
    });

    google.maps.event.addListener(markerCenter, 'click', function() {
        infoCenter.open(map, markerCenter);
    });

    google.maps.event.addListener(markerA, 'click', function() {
        infoA.open(map, markerA);
    });

    google.maps.event.addListener(markerB, 'click', function() {
        infoB.open(map, markerB);
    });

    google.maps.event.addListener(markerCenter, 'drag', function() {
        infoCenter.close();
        noteA.html("draggin&hellip;");
        noteB.html("draggin&hellip;");
    });

    google.maps.event.addListener(markerA, 'drag', function() {
        infoA.close();
        noteA.html("draggin&hellip;");
    });

    google.maps.event.addListener(markerB, 'drag', function() {
        infoB.close();
        noteB.html("draggin&hellip;");
    });
};
body {
    margin: 0; 
    padding: 0
}
html, 
body, 
#map {
    height: 100%; 
    font-family: Arial, sans-serif; 
    font-size: .9em; 
    color: #fff;
}
#note { 
    text-align: center;
    padding: .3em; 10px; 
    background: #009ee0; 
}
.bool {
    font-style: italic;
    color: #313131;
}
.info {
    display: inline-block;
    width: 40%;
    text-align: center;
}
.infowin {
    color: #313131;
}
#title,
.bool{
    font-weight: bold;
}
<div id="note">
  <span id="title">&raquo;Inside the circle?&laquo;</span>
  <hr />
  <span class="info">Marker <strong>A</strong>:
    <span id="a" class="bool"></span>
  </span> &larr;&diams;&rarr;
  <span class="info">Marker <strong>B</strong>:
    <span id="b" class="bool"></span>
  </span>
</div>
<div id="map">test</div>
<script src="https://maps.googleapis.com/maps/api/js?callback=init&libraries=&v=weekly&key=YOUR_API_KEY" async></script>


推荐阅读