邮政编码公式的距离

时间:2014-12-25 22:31:52

标签: mysql math distance

我发现这个公式并且它有效,但我想要做的是提供按照他的邮政编码距离过滤的能力。

我找到了计算两个纬度和经度坐标之间距离的公式。

(3956 * ACOS(COS(RADIANS(start_lat)) * COS(RADIANS(end_lat)) * COS(RADIANS(end_lon) - RADIANS(start_lon)) + SIN(RADIANS(start_lat)) * SIN(RADIANS(end_lat))))

我在页面上有过滤器,可以发送以下信息

$_POST["start_latitude"] = 34.023179;
$_POST["start_longitude"] = -118.303965;
$_POST["max_distance"] = 50;

如果我这样做

SELECT (3956 * ACOS(COS(RADIANS({$_POST["start_latitude"]})) * COS(RADIANS(34.018626)) 
        * COS(RADIANS(-118.249978) - RADIANS({$_POST["start_longitude"]}))
         + SIN(RADIANS({$_POST["start_latitude"]})) * SIN(RADIANS(34.018626))))

在这种情况下输出距离为4英里的英里数。

如何将此公式转换为我的目标,找到距离输入的坐标不超过50英里的地方?我知道所有需要做的就是改变公式中的地方,但我对学校数学并不好。

SELECT place_name FROM places 
    WHERE place_latitude = ? AND place_longitude = ?

修改

我有place表格,其中我有1000条格式的记录

id place_name latitude longitude
 1  xxx        432423   -43432
 2  yyy        523452   -54353
 3  zzz        553453   -53422
etc.

所以公式必须做类似

的事情
SELECT place_name FROM places 
   (CALCULATE each place distance from 
    $_POST["start_latitude"] and $_POST["start_longitude"]
    and select only ones that) < 50

2 个答案:

答案 0 :(得分:1)

将距离公式放入WHERE子句:

SELECT place_name
FROM places
WHERE (3956 * ACOS(COS(RADIANS(:start_latitude)) * COS(RADIANS(latitude)) * COS(RADIANS(-longitude) - RADIANS(:start_longitude)) + SIN(RADIANS(:start_latitude)) * SIN(RADIANS(latitude))))
    < :max_distance

答案 1 :(得分:0)

此资源和Web服务很有用,请检查: http://www.codebump.com/services/PlaceLookup.asmx

function calc_distance($point1, $point2)
{
    $radius      = 3958;      // Earth's radius (miles)
    $deg_per_rad = 57.29578;  // Number of degrees/radian (for conversion)

    $distance = ($radius * pi() * sqrt(
                ($point1['lat'] - $point2['lat'])
                * ($point1['lat'] - $point2['lat'])
                + cos($point1['lat'] / $deg_per_rad)  // Convert these to
                * cos($point2['lat'] / $deg_per_rad)  // radians for cos()
                * ($point1['long'] - $point2['long'])
                * ($point1['long'] - $point2['long'])
        ) / 180);

    return $distance;  // Returned using the units used for $radius.
}

修改

检查页面: http://www.mssqltips.com/sqlservertip/2690/calculate-the-geographical-distance-between-two-cities-in-sql-server/

-

DECLARE @98001 GEOGRAPHY;
DECLARE @Patzip GEOGRAPHY;

SELECT @98001 = Coordinates  FROM         ZipCodeLKUP INNER JOIN
                      Facility ON ZipCodeLKUP.ZipCode = Facility.ZipCode
                      Where Facility.ZipCode=98001

SELECT @Patzip = Coordinates  FROM         ZipCodeLKUP INNER JOIN
                      HIDIMV_year ON ZipCodeLKUP.ZipCode = HIDIMV_year .Patzip
                      where PATZIP in ('98001', '98466','97202')

SELECT @98001.STDistance(@Patzip)/1000 AS [Distance in KM]