我陷入了这个问题中,主要要求是从数据库中查找距离给定纬度和经度500英里以内的所有结果。我已经将纬度和经度以及这些纬度和经度的邮政编码存储到post\\u meta中,现在的想法是,当用户搜索任何邮政编码并从下拉列表中选择英里数时,所有匹配该查询的结果都应该出现。
用户进行如下查询
51310的500英里
查询应返回距离邮政编码51310 500英里以内的所有结果。
以下是我到目前为止所做的。这是实际对数据库进行查询的主要功能。
if (isset($_GET[\'s\']) && !empty($_GET[\'s\'])) {
$searchterm = isset($q->query_vars[\'s\']) ? sanitize_text_field($q->query_vars[\'s\']) : \'\';
// we have to remove the "s" parameter from the query, because it will prevent the posts from being found
$q->query_vars[\'s\'] = \'\';
if ($searchterm != \'\') {
$search_radius = $this->geocode($searchterm);
if (!$search_radius) {
return false;
}
$lat = $search_radius[\'lat\']; // get the lat of the requested address
$lng = $search_radius[\'lng\']; // get the lng of the requested address
// we\'ll want everything within, say, 30km distance
$distance = isset($_GET[\'within\']) && !empty($_GET[\'within\']) ? floatval($_GET[\'within\']) : 50;
// earth\'s radius in km = ~6371
$radius = auto_listings_metric() == \'yes\' ? 6371 : 3950;
// latitude boundaries
$maxlat = $lat + rad2deg($distance / $radius);
$minlat = $lat - rad2deg($distance / $radius);
// longitude boundaries (longitude gets smaller when latitude increases)
$maxlng = $lng + rad2deg($distance / $radius / cos(deg2rad($lat)));
$minlng = $lng - rad2deg($distance / $radius / cos(deg2rad($lat)));
// build the meta query array
$radius_array = array(
\'relation\' => \'AND\',
);
$radius_array[] = array(
\'key\' => \'_al_listing_lat\',
\'value\' => array($minlat, $maxlat),
\'type\' => \'DECIMAL(10,5)\',
\'compare\' => \'BETWEEN\',
);
$radius_array[] = array(
\'key\' => \'_al_listing_lng\',
\'value\' => array($minlng, $maxlng),
\'type\' => \'DECIMAL(10,5)\',
\'compare\' => \'BETWEEN\',
);
return apply_filters(\'auto_listings_search_radius_args\', $radius_array);
为了找到地理编码,我编写了这个函数。$address = urlencode(esc_html($address));
// google map geocode api url
$url = auto_listings_google_geocode_maps_url($address);
$arrContextOptions = array(
"ssl" => array(
"verify_peer" => false,
"verify_peer_name" => false,
),
);
// get the json response
$resp_json = file_get_contents($url, false, stream_context_create($arrContextOptions));
// decode the json
$resp = json_decode($resp_json, true);
//pp( $resp );
// response status will be \'OK\', if able to geocode given address
if ($resp[\'status\'] == \'OK\') {
// get the lat and lng
$lat = $resp[\'results\'][0][\'geometry\'][\'location\'][\'lat\'];
$lng = $resp[\'results\'][0][\'geometry\'][\'location\'][\'lng\'];
// verify if data is complete
if ($lat && $lng) {
return array(
\'lat\' => $lat,
\'lng\' => $lng,
);
} else {
return false;
}
} else {
return false;
}
如果我没有选择“内”字段,此代码将返回特定邮政编码的准确结果,这很好,但当我选择“内”字段时,它将不显示任何内容。有人能告诉我在这段代码中我做错了什么吗。