Как показать маркеры на карте Google, радиус которых охватывает целевой маркер? - PullRequest
0 голосов
/ 05 марта 2019

Я ломаю голову над этой проблемой. У меня есть база данных местоположений магазинов, у каждого есть широта, долгота и радиус. После этого мне нужно отобразить карту с указанным центром (местоположение пользователя), и, если местоположение этого пользователя находится в пределах любого радиуса расположения магазина, показать эти магазины. Если радиус магазина не касается центра (местоположение пользователя), не показывать магазин.

В настоящее время я использую 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 с использованием только значений широты, долготы и радиуса)

Texas Shops

Наконец, если вы посмотрите на прикрепленный снимок экрана моей базы данных, вы увидите, что у меня есть координаты для севера, востока, запада и юга, сгенерированные с помощью приведенного выше сценария. Но что меня озадачивает, так это то, что широта и долгота целевого маркера (синего цвета) попадают в пределы севера и юга, востока и запада. Это заставляет меня задаться вопросом, является ли скрипт, генерирующий координаты для круга (ов) вокруг каждого маркера, неправильным.

Database Screen Shot

1 Ответ

0 голосов
/ 05 марта 2019

Если я правильно вас понимаю, вы пытаетесь найти все магазины, в которых есть местоположение пользователя в пределах их радиуса? Если да, пожалуйста, попробуйте этот запрос (не проверено).

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

Вам нужно будет соответственно заменить значения.

В запросе используется формула haversine , и я цитирую из Википедии:

Формула haversine определяет расстояние по большому кругу между двумя точками на сфере с учетом их долготы и широты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...