首页 > 解决方案 > 如何显示半径包含目标标记的谷歌地图标记?

问题描述

我在这个问题上绞尽脑汁。我有一个商店位置数据库,每个都有纬度、经度和半径。我所追求的是显示具有给定中心(用户位置)的地图,并且如果该用户的位置在商店位置半径的任何半径范围内,则显示这些商店。如果商店半径不触及中心(用户的位置),则不显示商店。

我目前正在使用 IP GEO LOCATION 来获取访问者的 ip 地址,并返回纬度和经度。然后使用用户位置,我这样查询数据库:

select s.street, s.city, s.latitude, s.longitude, s.radius, sa.north, 
sa.east, sa.south, sa.west from shops as s inner join service_areas as sa on 
s.id = sa.shop_id where 32.931354 between sa.south and sa.north and 
-97.095583 between sa.west and sa.east

北、南、东、西的值是从我多年前有人做的这个 php 脚本生成的。

<?php

include "dbconnect.php";

$query="select id, latitude, longitude, radius from shops where state = 'Colorado';";
$rs=$mysqli->query($query);

while($r=$rs->fetch_object()) {
$sho_id=$r->id;
$lat=$r->latitude;
$lng=$r->longitude;
$radius=$r->radius;
$north=-90;
$east=-180;
$south=90;
$west=180;

$circlePolygon=createCirclePolygon($lat,$lng,$radius);

$polygon=array();

foreach($circlePolygon as $cPoint) {
if($cPoint['lat']<$south) $south=$cPoint['lat'];
if($cPoint['lat']>$north) $north=$cPoint['lat'];
if($cPoint['lng']>$east) $east=$cPoint['lng'];
if($cPoint['lng']<$west) $west=$cPoint['lng'];
$polygon[]=implode(",", $cPoint);
}
$polygon=implode(" ", $polygon);
$fields="shop_id=$sho_id, north=$north, south=$south, east=$east, west=$west, polygon='$polygon'";
$query="insert into service_areas set $fields on duplicate key update $fields;";
$mysqli->query($query);
if($mysqli->error) {
echo "ERROR: $mysqli->error\n";
}
echo "done<br/>";
}
echo "complete";

function createCirclePolygon($lat, $lng, $radius) {
$pointArray=array();
$d2r = pi() / 180;
$clat = ($radius / 3963.189) / $d2r; // miles
$clng = $clat / cos($lat * $d2r);
for($ang=0;$ang<=360;$ang+=10) {
$a=$ang*$d2r;
$plat=$lat+($clat*sin($a));
$plng=$lng+($clng*cos($a));
$point=array("lat"=>$plat,"lng"=>$plng);
array_push($pointArray,$point);
}
return $pointArray;
}
?>

在我运行上述查询之前,我一直认为这是可行的。如果您查看附加的图像,您将看到一个蓝色标记(用户),它不在红色标记的任何半径范围内。唯一应该显示红色标记的时间是它的半径是否触及蓝色标记。(红色标记周围的半径由 javascript 仅使用纬度、经度和半径值生成)

德州商店

最后,如果您查看我的数据库的附加屏幕截图,您会看到我有由上述脚本生成的北、东、西和南坐标。但令我困惑的是目标标记的(蓝色)纬度和经度确实落在南北、东、西值范围内。这让我想知道为每个标记周围的圆圈生成坐标的脚本是否不正确。

数据库屏幕截图

标签: javascriptphpmysqlgoogle-maps

解决方案


如果我对您的理解正确,您是在尝试查找在其半径范围内有用户位置的所有商店吗?如果是,请尝试此查询(未经测试)。

SELECT s.street, s.city, s.latitude, s.longitude, s.radius, sa.north, sa.east, sa.south, sa.west, ( 3959 * acos( cos( radians(32.931354) ) * cos( radians( s.latitude ) ) * cos( radians( s.longitude ) - radians(-97.095583) ) + sin( radians(32.931354) ) * sin( radians( s.latitude ) ) ) ) AS distance
FROM shops AS s
WHERE distance <= s.radius

您将需要相应地替换这些值。

该查询使用hasrsine 公式,我从 Wikipedia 引用:

在给定经度和纬度的情况下,Haversine 公式确定球体上两点之间的大圆距离。


推荐阅读