javascript - 如何显示半径包含目标标记的谷歌地图标记?
问题描述
我在这个问题上绞尽脑汁。我有一个商店位置数据库,每个都有纬度、经度和半径。我所追求的是显示具有给定中心(用户位置)的地图,并且如果该用户的位置在商店位置半径的任何半径范围内,则显示这些商店。如果商店半径不触及中心(用户的位置),则不显示商店。
我目前正在使用 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 仅使用纬度、经度和半径值生成)
最后,如果您查看我的数据库的附加屏幕截图,您会看到我有由上述脚本生成的北、东、西和南坐标。但令我困惑的是目标标记的(蓝色)纬度和经度确实落在南北、东、西值范围内。这让我想知道为每个标记周围的圆圈生成坐标的脚本是否不正确。
解决方案
如果我对您的理解正确,您是在尝试查找在其半径范围内有用户位置的所有商店吗?如果是,请尝试此查询(未经测试)。
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 公式确定球体上两点之间的大圆距离。
推荐阅读
- templates - 无法在新项目表单上公开现有控件
- assembly - 在包含正值和负值的数组中查找最大值
- javascript - compose/flow 和常规函数链接之间的区别
- javascript - 加载时修改模式窗口中的数据
- python - 将 args 和 kwargs 规范化为 kwarg 规范形式
- vba - 如何对过滤后的 ListBox 进行排序
- c++ - X3 和 MS VS2017 的问题
- git - Git rebase 的 --merge 选项有什么作用?
- android - Android Emulator 无法绑定到本地 8601、8600 进行调试
- python - 当 .dropna() 使它们的大小不同时,处理两个数据集的正确方法是什么?