根据距离过滤谷歌地图标记

Posted

技术标签:

【中文标题】根据距离过滤谷歌地图标记【英文标题】:Filter Google Maps Markers based on Distance 【发布时间】:2021-03-29 00:59:50 【问题描述】:

我正在考虑根据与用户当前位置的距离过滤谷歌地图标记。我有这个设置从数据库中引入标记并显示在地图上,但我想将这些标记的显示限制为显示距离用户当前位置 3 英里的标记。 p>

我收到 JSON 格式的标记(带有纬度+经度详细信息),如下所示:

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();
        

收到的 JSON 样本:

0: [,…]
0: "<a style="margin-left: 8px; font-weight: bold; font-family: Courier, Arial, Helvetica, sans-serif;">TestMerchant1</a><br>
↵   <button class="seeMerchantButton" onclick="showMerchant('TestMerchant1');showProfile();" value="TestMerchant1">See merchant</button>"
1: "51.503366"
2: "-0.223477"
3: "info"
4: text: "£5", fontFamily: "Courier, Arial, Helvetica, sans-serif"
fontFamily: "Courier, Arial, Helvetica, sans-serif"
text: "£5"
1: [,…]
0: "<a style="margin-left: 8px; font-weight: bold; font-family: Courier, Arial, Helvetica, sans-serif;">TestMerchant2</a><br>
↵   <button class="seeMerchantButton" onclick="showMerchant('TestMerchant2');showProfile();" value="TestMerchant2">See merchant</button>"
1: "51.503393"
2: "-0.226599"
3: "info"
4: text: "£3", fontFamily: "Courier, Arial, Helvetica, sans-serif"
fontFamily: "Courier, Arial, Helvetica, sans-serif"
text: "£3"

我将地图以用户位置为中心,如下所示:

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

我认为处理此问题的最有效方法是过滤 JSON,但我什至不知道从哪里开始,因为我是 Google Maps API 的新手?我相信应用haversine公式方法可以在那里工作,但同样,不确定这将如何工作?

任何帮助表示赞赏,谢谢!

【问题讨论】:

我认为处理这个问题的最有效方法是过滤 JSON - 如果你这么说......你为什么不分享你的 JSON 样本?它是否已经包含距离?您必须提供允许重现问题的minimal reproducible example(或者了解您要处理的内容)。实施 Haversine 公式有什么问题?等等等等等等。你的问题,事实上,太宽泛、不清楚和离题了。 JSN 从何而来?如果它来自数据库(或允许将数据限制为与某个点的距离的服务),那将更有效。获得两组数据后,您可以在显示标记之前在浏览器中进行检查。 @MrUpsidown 感谢您的添加 - 我已经包含了上面的示例,我认为这是您正在寻找的,但我是新手,所以让我知道这是否可以接受?所有数据都存储在一个 SQL 数据库,所以技术上的过滤可以在数据库中的纬度/经度上完成,但是我需要传递用户的位置并在 PHP 中处理,现在我认为这有点太复杂了,不是吗? 如果您的 JSON 包含比方说 50 个不同的位置(坐标集),那么您将需要在客户端运行 50 次距离计算,或者通过您自己的计算方法,或者通过 API它具有相应的功能。相反,如果您将用户的坐标传递给您的 PHP 脚本,并使用 Haversine 公式检索位置列表,那么这一切都在您的数据库中的 1 个请求中完成。很可能更高效,更快(并且更清洁)。没那么复杂。您只需复制查询并使其适应您的需要。 有关于如何在数据库中按距离过滤数据的教程。如果启用 GIS,它会更简单。您可以在请求 JSON 数据时将用户位置(可能还有过滤距离)传回您的服务器。 【参考方案1】:

这个问题的答案很简单,并且符合 cmets 中的建议。

为当前用户拉取位置是这样完成的

function showPosition(position) 
  y.innerHTML = position.coords.latitude + "latlong" + position.coords.longitude;

然后我将其传递给 PHP 脚本并使用脚本本身中的半正弦公式进行过滤,因为它的效率要高得多

【讨论】:

以上是关于根据距离过滤谷歌地图标记的主要内容,如果未能解决你的问题,请参考以下文章

如何根据标记位置设置谷歌地图的缩放级别

如何在谷歌地图中获取标记和中心之间的距离

谷歌地图多个标记映射到一个没有坐标的区域

如何在android中的谷歌地图上绘制路线并计算多个标记之间的距离

如何在android中根据谷歌地图不同的缩放级别调整谷歌地图标记的大小

谷歌距离地图,从给定地址/Lat,Lng 和自定义标记的最短路径,一个是默认选择当前位置,一个是自定义