【问题标题】:Select MSSQL records within X miles based on Lat/Lon in table根据表中的纬度/经度选择 X 英里内的 MSSQL 记录
【发布时间】:2014-02-18 18:52:17
【问题描述】:

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

我有一个表格,其中包含名称、纬度、经度,我有一个搜索页面,允许用户根据特定用户选择在多少“英里”范围内向数据库中的其他用户显示纬度/经度,所以我需要一个 SQL 语句,它会在 2500 英里内仅根据纬度/经度返回结果。

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

输入: 纬度(26.631903),经度(-80.133376),距离(2500)

数据库数据: 姓名列威廉, 纬度列 32.7827000, 经度列-96.7758000

输出: 名称,与输入纬度/经度的距离(以英里为单位)

【问题讨论】:

标签: php sql-server latitude-longitude


【解决方案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
    ";

【讨论】:

    猜你喜欢
    • 2011-10-18
    • 2014-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 2012-06-12
    相关资源
    最近更新 更多