2014-01-27 31 views
1

我需要一些帮助,我已经尝试了几个例子,并且我无法让他们中的任何一个人工作。根据Lat/Lon在表X中选择MSSQL记录

我有一个名称,经纬度,表中的表,我有一个搜索页面,允许用户选择多少“英里”,他们想显示基于这个用户在数据库中的其他用户特定的纬度/经度,所以我需要一个SQL语句,将返回结果说2500英里完全基于纬度/经度。

这里的关键是我的数据库是MSSQL而不是MySQL,我还没有能够获得任何MySQL示例来跨越到MSSQL。我不认为它很重要,但我在服务器端使用PHP来收集表单数据并发布到MSSQL并返回一个函数的结果。

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

DB数据: 名称列威廉, 纬度列32.7827000, 经度列-96.7758000

输出: 名称,距离输入纬度/经度英里数

+1

这是一个相当复杂的过程,但可以做到的,看看这个链接(http://www.mssqltips.com/sqlservertip/2690 /计算最地理距离,二,城市 - 在-SQL服务器之间-/)。 –

回答

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 
    ";