gpt4 book ai didi

php - 按邮政编码/经度/纬度选择结果

转载 作者:可可西里 更新时间:2023-11-01 08:23:05 27 4
gpt4 key购买 nike

我有 3 个表:1 包含人们及其城市(来自其他表)和他们想要找到的范围(int,1-20)(以英里为单位)1 包含城市和邮政编码的开头(即 BB2)1 包含城市及其经度/纬度

我想做的是根据某人输入的邮政编码选择人员。如果此邮政编码适用于他们范围内的城市,则应从数据库中选择此人。

我有这个 PHP 代码:

  // Latitude calculation
$limit = (1 / 69.1703234283616) * $radius;
$latitude_min = $latitude - $limit;
$latitude_max = $latitude + $limit;

// Longitude calculation
$limit = (1 / (69.1703234283616 * cos($userLat * (pi/180)))) * $radius;
$longitude_min = $longitude - $limit;
$longitude_max = $longitude + $limit;

现在是困难的部分。我不知道如何根据输入的邮政编码及其范围从数据库中选择人员。

有人可以帮我一下吗?

最佳答案

这是我刚才创建的 MySQL 存储函数 - 它返回两对纬度和经度之间的(近似)距离以米为单位。

DELIMITER $$

CREATE FUNCTION LAT_LNG_DISTANCE(lat1 FLOAT, lng1 FLOAT, lat2 FLOAT, lng2 FLOAT) RETURNS int(11)
BEGIN
DECLARE latD FLOAT;
DECLARE lngD FLOAT;
DECLARE latS FLOAT;
DECLARE lngS FLOAT;
DECLARE a FLOAT;
DECLARE c FLOAT;

SET lat1 = RADIANS(lat1);
SET lng1 = RADIANS(lng1);
SET lat2 = RADIANS(lat2);
SET lng2 = RADIANS(lng2);

SET latD = lat2 - lat1;
SET lngD = lng2 - lng1;

SET latS = SIN(latD / 2);
SET lngS = SIN(lngD / 2);

SET a = POW(latS, 2) + COS(lat1) * COS(lat2) * POW(lngS, 2);
SET c = 2 * ASIN(LEAST(1, SQRT(a)));

RETURN ROUND(c * 6378137);
END;
$$
DELIMITER ;

现在我们已经定义好了,我们需要根据用户给我们的邮政编码获取搜索的来源。由于我不知道你的数据库的确切结构,我将使用通用的连接和条件,希望它们与真实的东西足够相似,以便你轻松适应。我将使用 $var 暗示从 PHP 传递值;不用说,它需要以适当的方式转义。

SELECT l.lat, l.lng
FROM city_locations l
INNER JOIN city_postcodes c
ON l.city_id = c.city_id
WHERE c.postcode = $postcode;

现在我们可以将该查询的结果传递给下一个查询,它将使用我们之前定义的 LAT_LNG_DISTANCE 函数。

SELECT *
FROM people p
INNER JOIN city_locations l
ON p.city_id = l.city_id
WHERE LAT_LNG_DISTANCE(l.lat, l.lng, $search_lat, $search_lng) < p.range * 1609;

顺便说一下,1609 是一英里的米数。我希望我已经正确理解了这个问题!

关于php - 按邮政编码/经度/纬度选择结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1514194/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com