根据表中的Lat / Lon选择X英里内的SQL记录

时间:2014-01-27 18:55:15

标签: php sql-server latitude-longitude

我需要一些帮助,我已经尝试了几个例子,我无法让它们中的任何一个工作。

我有一个名为Lat,Lon的桌子,我有一个搜索页面,允许用户根据这些用户特定的数量选择他们希望显示在数据库中的其他用户的“里程数” Lat / Lon,所以我需要一个SQL语句,它将在2500英里的范围内返回结果,完全基于Lat / Lon。

这里的关键是我的数据库是MSSQL而不是MySQL,我无法将任何MySQL示例交叉到MSSQL。我认为这不重要,但我在服务器端使用PHP来收集表单数据并发布到MSSQL并从函数返回结果。

输入 Lat(26.631903),Lon(-80.133376),距离(2500)

数据库数据 名称列威廉, 纬度列32.7827000, 经度栏-96.7758000

输出: 名称,距输入Lat / Lon的距离(英里)

1 个答案:

答案 0 :(得分:1)

好的想通了,这确实有效,而且速度不是很慢

    //users latitude
    $lat = $_POST['lat'];

    //users longitude
    $lon = $_POST['lon'];

    //search distance
    $rad = $_POST['distance'];

    //earth radius in miles use 6371 for km
    $earth = 3959;

    $SqlStr = "
        SELECT Name, (".$earth." * ACOS(SIN(".$lat."/ CAST(57.2958 AS NUMERIC(10,4)))*SIN(lat / CAST(57.2958 AS NUMERIC(10,4)))+COS(".$lat."/ CAST(57.2958 AS NUMERIC(10,4)))*
        COS(lat / CAST(57.2958 AS NUMERIC(10,4)))*COS(lon / CAST(57.2958 AS NUMERIC(10,4)) - CAST(".$lon." AS NUMERIC(10,4)) / CAST(57.2958 AS NUMERIC(10,4))))) as distance
        FROM DB TABLE NAME
        WHERE (".$earth." * ACOS(SIN(".$lat."/ CAST(57.2958 AS NUMERIC(10,4)))*SIN(lat / CAST(57.2958 AS NUMERIC(10,4)))+COS(".$lat."/ CAST(57.2958 AS NUMERIC(10,4)))*COS(lat / CAST(57.2958 AS NUMERIC(10,4)))*
        COS(lon / CAST(57.2958 AS NUMERIC(10,4)) - CAST(".$lon." AS NUMERIC(10,4)) / CAST(57.2958 AS NUMERIC(10,4))))) <= ".$rad." ORDER BY distance
    ";