将 Google json 地图标记限制为可查看的地图

Posted

技术标签:

【中文标题】将 Google json 地图标记限制为可查看的地图【英文标题】:Limit Google json map markers to viewable map 【发布时间】:2020-12-31 15:04:31 【问题描述】:

我有一种情况,我想限制来自在地图上显示 Google 地图标记的数据库的搜索结果。目前没有限制这一点的标准,但是可能存在有很多标记的情况,我想包含它。我收到 JSON 格式的标记 - 将这些标记过滤为用户当前位置 2 公里的最佳做法是什么?

我的预感是在生成时使用实际的 JSON 数据来执行此操作 - 但这里的最佳实践想法将不胜感激,因为在 SO 方面没有太多指导。

谢谢!

代码如下:

function showMarkers(str) 
        if (str == "") 
            document.getElementById("products").innerhtml = "";
            return;
        
        if (window.XMLHttpRequest) 
            // code for IE7+, Firefox, Chrome, Opera, Safari
            xmlhttp = new XMLHttpRequest();
         else  // code for IE6, IE5
            xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
        
        xmlhttp.onreadystatechange = function() 
            if (this.readyState == 4 && this.status == 200) 
                //$('#mapMarkerPositions').html(this.responseText);

                let data = JSON.parse(this.responseText);
                merchantMarkers = [];
                for (let i = 0; i < data.length; i++) 
                    merchantMarkers[i] = data[i];
                
                resetMarker();
                reloadMarkers();


            
        
        xmlhttp.open("GET", "filterMarkers.php?s=" + str, true);
        xmlhttp.send();
    

那么对于实际的地图:

<div id="merchantLocations">
    <script>
        var map;
        var markers = [];
        var merchantMarkers = [];

    </script>
</div>

(这之间的附加代码)

setMarkers(merchantMarkers);

        var infowindow = new google.maps.InfoWindow()

        if (navigator.geolocation) 
            navigator.geolocation.getCurrentPosition(function(position) 
                initialLocation = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
                map.setCenter(initialLocation);
            );
        

    

    function setMarkers(locations) 

        var infowindow = new google.maps.InfoWindow();
        for (var i = 0; i < locations.length; i++) 
            var merchant = locations[i];
            var myLatLng = new google.maps.LatLng(merchant[1], merchant[2]);
            var marker = new google.maps.Marker(
                position: myLatLng,
                map: map,
                icon: icons.icon,
                label: merchant[4]
            );


            /* ****************** */
            map.panTo(myLatLng);
            /* ****************** */

            google.maps.event.addListener(
                marker,
                'click',
                (function(marker, i) 
                    return function() 
                        infowindow.setContent(locations[i][0]);
                        infowindow.open(map, marker)
                    
                )(marker, i));
            markers.push(marker);
        
    

    function resetMarker() 
        for (var i = 0; i < markers.length; i++) 
            markers[i].setMap(null);
        
        markers = [];
    

    function reloadMarkers() 
        setMarkers(merchantMarkers);
    

【问题讨论】:

【参考方案1】:

由于您已经有一组标记及其位置(纬度/经度)以及使用地理定位的设备位置,并且您只想将标记放置在距设备原点一定半径范围内,那么您可以做的是比较标记和设备位置之间的距离。您可以为此使用距离矩阵 API。 DM API 可以接收 X 号。以地址、纬度/经度坐标或地点 ID 的形式显示起点和终点。因此,例如,您有 1 个起点(设备的位置)和多个目的地(标记)。这将为您提供您的起点和每个目的地之间的距离结果。例如:

https://maps.googleapis.com/maps/api/distancematrix/json?origins=40.6655101,-73.89188969999998&destinations=40.6905615%2C-73.9976592%7C40.6905615%2C-73.9976592%7C40.6905615%2C-73.9976592%7C40.6905615%2C-73.9976592%7C40.6905615%2C-73.9976592%7C40.6905615%2C-73.9976592%7C40.659569%2C-73.933783%7C40.729029%2C-73.851524%7C40.6860072%2C-73.6334271%7C40.598566%2C-73.7527626%7C40.659569%2C-73.933783%7C40.729029%2C-73.851524%7C40.6860072%2C-73.6334271%7C40.598566%2C-73.7527626&key=YOUR_API_KEY

得到它们之间的距离后,您可以添加一个简单的 if 语句:

let result = JSON.parse(this.responseText);
//iterate through all the markers
for(i = 0 ; i <= no_of_markers ; i++ )
    //only show markers that are <= to 2km 
    if (result.rows[0].elements[i].distance.value <= 20000)
        //Show Marker
    

您可以在此处了解有关Distance Matrix API 的更多信息。请注意,仅当您超过每月提供的 200 美元免费信用额度时,您才可能需要为此付费。这是pricing sheet供您参考。

【讨论】:

以上是关于将 Google json 地图标记限制为可查看的地图的主要内容,如果未能解决你的问题,请参考以下文章

来自 JSON 的 Google 地图上的标记

使用 Google 地图避免地理编码限制的替代方法

使用 MySQL、JSON 和 jQuery 插件 Gmap3 填充 Google 地图标记

将 Google Maps V3 标记的拖动限制到折线

移动地图时,在谷歌地图中更新Ajax Json数组中的标记

Google 静态地图 URL 长度限制