Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 半径/最近结果-谷歌地图API_Php_Javascript_Mysql_Google Maps_Google Maps Api 3 - Fatal编程技术网

Php 半径/最近结果-谷歌地图API

Php 半径/最近结果-谷歌地图API,php,javascript,mysql,google-maps,google-maps-api-3,Php,Javascript,Mysql,Google Maps,Google Maps Api 3,首先,我使用的是谷歌地图API v3。我有一个大地图,显示了从数据库中提取的所有结果,现在我想实现一个功能,显示距离当前位置X公里范围内的最近结果半径(由HTML5 geolocation提供服务) 由于地图包含所有结果,我希望能够添加X公里,然后它将被提交,结果将根据用户的当前位置返回最近的结果。然后,整个地图应删除所有超出半径的标记,留下半径在X公里以内的标记 我需要一个有效的代码、教程或一篇关于如何做到这一点的文章。这里是 我想这是一种方法。可以使用从中心点或当前位置创建边界。您可以使用s

首先,我使用的是谷歌地图API v3。我有一个大地图,显示了从数据库中提取的所有结果,现在我想实现一个功能,显示距离当前位置X公里范围内的最近结果半径(由HTML5 geolocation提供服务)

由于地图包含所有结果,我希望能够添加X公里,然后它将被提交,结果将根据用户的当前位置返回最近的结果。然后,整个地图应删除所有超出半径的标记,留下半径在X公里以内的标记

我需要一个有效的代码、教程或一篇关于如何做到这一点的文章。

这里是

我想这是一种方法。可以使用从中心点或当前位置创建边界。您可以使用
setRadius(radius:number)
以米为单位指定圆的半径。使用创建的圆,您可以循环使用标记,查看它们是否在圆的边界内,并检查标记是否在边界内

我继续创建了一个在地图上有五个点的小演示,当您单击“创建圆”按钮时,它将使第一个标记成为中心点,并绘制一个半径为5000的圆,并使用上述方法过滤掉不在边界内的标记:

function createRadius(dist) {
    var myCircle = new google.maps.Circle({
        center: markerArray[markerArray.length - 1].getPosition(),
        map: map,
        radius: dist,
        strokeColor: "#FF0000",
        strokeOpacity: 0.8,
        strokeWeight: 2,
        fillColor: "#FF0000",
        fillOpacity: 0.35
    });
    var myBounds = myCircle.getBounds();

    //filters markers
    for(var i=markerArray.length;i--;){
         if(!myBounds.contains(markerArray[i].getPosition()))
             markerArray[i].setMap(null);
    }
    map.setCenter(markerArray[markerArray.length - 1].getPosition());
    map.setZoom(map.getZoom()+1);
}

这个解决方案只有一个主要缺陷——它在矩形中获取数据,而不是在圆形中

如果您不想查询比所需数据更多的数据,请在SQL中使用:

选择
身份证件
(3959 *
acos(
cos(弧度(37))*
cos(弧度(纬度))*
cos(弧度(lng)-弧度(-122))+
sin(弧度(37))*
正弦(弧度(纬度))
)
)作为距离
从标记
距离小于25的
按距离排序
限值0,20;

另外,在您的示例@JSFiddleDemo上签出

Sidenote:每次单击按钮,您都会再次放大并删除不透明度。
SELECT
    id,
    (3959 *
        acos(
            cos(radians(37)) *
            cos(radians(lat)) *
            cos(radians(lng) - radians(-122)) +
            sin(radians(37)) *
            sin(radians(lat))
        )
    ) AS distance
FROM markers
HAVING distance < 25
ORDER BY distance
LIMIT 0 , 20;