Я ломаю голову над этой проблемой. У меня есть база данных местоположений магазинов, у каждого есть широта, долгота и радиус. После этого мне нужно отобразить карту с указанным центром (местоположение пользователя), и, если местоположение этого пользователя находится в пределах любого радиуса расположения магазина, показать эти магазины. Если радиус магазина не касается центра (местоположение пользователя), не показывать магазин.
В настоящее время я использую 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 с использованием только значений широты, долготы и радиуса)
Наконец, если вы посмотрите на прикрепленный снимок экрана моей базы данных, вы увидите, что у меня есть координаты для севера, востока, запада и юга, сгенерированные с помощью приведенного выше сценария. Но что меня озадачивает, так это то, что широта и долгота целевого маркера (синего цвета) попадают в пределы севера и юга, востока и запада. Это заставляет меня задаться вопросом, является ли скрипт, генерирующий координаты для круга (ов) вокруг каждого маркера, неправильным.