У меня есть 100 объявлений о недвижимости в виде сообщений WordPress, и к каждому сообщению прикреплены два пользовательских поля с координатами свойств;property_address_lat и property_address_lng.
Я предоставляю посетителям нашего сайта возможность ввести адрес или местоположение по своему выбору, где возвращаются координаты, а также они могут ввести радиус в милях.И то, что должно произойти, - это возвращаемые свойства в этих параметрах.Вот код, который я использую:
// Work out square radius
if(!empty($_SESSION['s_property_radius'])) {$dist = $_SESSION['s_property_radius'];}else{$dist = 50;}
$orig_lat = $_SESSION['s_property_address_lat'];
$orig_lon = $_SESSION['s_property_address_lng'];
$lon1 = $orig_lon - $dist / abs( cos( deg2rad( $orig_lat ) ) * 69 );
$lon2 = $orig_lon + $dist / abs( cos( deg2rad( $orig_lat ) ) * 69 );
$lat1 = $orig_lat - ( $dist / 69 );
$lat2 = $orig_lat + ( $dist / 69 );
// Compile a map search query to get all property ID's.
$mapsearchquery = "
SELECT `t`.`ID`
, 3956 * 2 * ASIN( SQRT( POWER( SIN( ( ".$orig_lat." - `t`.`property_address_lat` ) * pi() / 180 / 2), 2 ) + COS( ".$orig_lat." * pi() / 180) * COS( `t`.`property_address_lat` * pi() / 180 ) * POWER( SIN( ( ".$orig_lon." - `t`.`property_address_lng` ) * pi() / 180 / 2 ), 2 ) ) ) AS `distance`
FROM (
SELECT `$wpdb->posts`.`ID`
, MAX(CASE WHEN `$wpdb->postmeta`.`meta_key` = 'property_address_lng' THEN `$wpdb->postmeta`.`meta_value` END ) AS `property_address_lng`
, MAX(CASE WHEN `$wpdb->postmeta`.`meta_key` = 'property_address_lat' THEN `$wpdb->postmeta`.`meta_value` END ) AS `property_address_lat`
FROM `$wpdb->posts`
LEFT JOIN `$wpdb->postmeta` ON ( `$wpdb->posts`.`ID` = `$wpdb->postmeta`.`post_id` )
WHERE `$wpdb->posts`.`post_status` = 'publish'
AND `$wpdb->posts`.`post_type` = 'property'
GROUP BY `$wpdb->posts`.`ID`
HAVING `property_address_lng` BETWEEN '".$lon1."' AND '".$lon2."' AND `property_address_lat` BETWEEN '".$lat1."' AND '".$lat2."'
) AS `t`
HAVING `distance` < ".$dist."
";
// Just get the ID's
$mapsearchresults = $wpdb->get_col($mapsearchquery);
Данные $_SESSION
содержат выбранные пользователем параметры.То, что я делаю в первую очередь, это проработка квадратной рамки вокруг выбранной области.Это делает начальный запрос к данным, чтобы убедиться, что сообщения находятся в этом поле.Затем, как только он запускается, я запускаю поверх результатов проверку расстояния, чтобы убедиться, что каждое свойство находится внутри радиуса круга.Я уверен, что мне не нужно объяснять, почему я делаю два шага, а не один.
Так что я пришел, чтобы проверить это.Я установил центральную точку на Лондон и установил радиус 50 миль.Мне возвращают около 16 свойств, которые кажутся правильными.Я проверил их все и да, они в радиусе.Так здорово, что я думаю, что это работает, но затем я устанавливаю радиус в 1000 миль, который должен охватывать все свойства, и я должен ожидать, что все свойства будут возвращены.Хорошо, когда я запускаю это, возвращается только около половины свойств ...
Итак, что заставило меня задуматься о том, что этот код просто не верен, и, похоже, он не работает, когда радиус увеличивается.Кто-нибудь из вас может увидеть, что я сделал что-то глупое с моим кодом?вся математика для этого должна быть сделана таким образом, работая в милях, а не в КМ.
Если кто-то сможет пролить на это свет, я действительно это ценю.