Vb.net 我需要SQL Server的空间查询来返回十个最近的位置

Vb.net 我需要SQL Server的空间查询来返回十个最近的位置,vb.net,visual-studio-2010,sql-server-2008,Vb.net,Visual Studio 2010,Sql Server 2008,我正在使用Visual Studio 2010和vb.net创建.asmx webservice,并使用SQL Server 2008,但下面的查询提供了数据库中的所有地址。我需要的是将下面的查询修改为一个返回十个最近位置的空间查询。Lat和Long是小数,但数据库中有一个名为[Location]的地理列。救命啊 <WebMethod()> _ Public Function GetFuelStops(ByVal Lat as Double, ByVal Long as Double

我正在使用Visual Studio 2010和vb.net创建.asmx webservice,并使用SQL Server 2008,但下面的查询提供了数据库中的所有地址。我需要的是将下面的查询修改为一个返回十个最近位置的空间查询。Lat和Long是小数,但数据库中有一个名为[Location]的地理列。救命啊

<WebMethod()> _
Public Function GetFuelStops(ByVal Lat as Double, ByVal Long as Double) As FuelStop()
    Dim resultList = New List(Of FuelStop)()

    Using sqlCon As New SqlConnection()
    sqlCon.ConnectionString = "Data Source=(local);Initial Catalog=Example_DB;User ID=Turd;Password=Fergison"
    Dim sql = <sql>
        SELECT
            [Physical_Address_Street]
            , [Physical_Address_Local]
            , [Physical_Address_State]
            , [Physical_Address_Zip]
            , [Lat]
            , [Long]
            , [Phone_Number]
        FROM Gas_Stations
        WHERE Location_Type = 1
        </sql>

    Dim command As New SqlCommand()
    command.CommandText = CStr(sql)
    command.Connection = sqlCon
    sqlCon.Open()

    Using reader = command.ExecuteReader()
        While reader.Read()
            Dim fuelStop = New FuelStop()
            fuelStop.Physical_Address_Street = reader.GetString(0)
            fuelStop.Physical_Address_Local = reader.GetString(1)
            fuelStop.Physical_Address_State = reader.GetString(2)
            fuelStop.Physical_Address_Zip = reader.GetString(3)
            fuelStop.Phone_Number = reader.GetString(4)

            resultList.Add(fuelStop)
        End While
       End Using
    End Using
Return resultList.Skip(skip).Take(take).ToArray()

End Function
_
公共函数GetFuelStops(ByVal Lat为双精度,ByVal Long为双精度)为FuelStop()
Dim resultList=新列表(燃油停止)()
将sqlCon用作新的SqlConnection()
sqlCon.ConnectionString=“数据源=(本地);初始目录=示例\u DB;用户ID=Turd;密码=Fergison”
Dim sql=
挑选
[实际地址/街道]
,[物理地址\本地]
,[物理地址状态]
,[物理地址]
,[Lat]
,[长]
,[电话号码]
从加油站
其中位置\类型=1
Dim命令作为新的SqlCommand()
command.CommandText=CStr(sql)
command.Connection=sqlCon
sqlCon.Open()
使用reader=command.ExecuteReader()
而reader.Read()
变暗燃油停止=新燃油停止()
fuelStop.Physical\u Address\u Street=reader.GetString(0)
fuelStop.Physical\u Address\u Local=reader.GetString(1)
fuelStop.Physical\u Address\u State=reader.GetString(2)
fuelStop.Physical\u Address\u Zip=reader.GetString(3)
fuelStop.Phone_Number=reader.GetString(4)
结果列表.添加(fuelStop)
结束时
终端使用
终端使用
返回resultList.Skip(Skip).Take(Take).ToArray()
端函数

我强烈建议您仔细查看SQL Server中的地理空间功能,而不是询问实际的解决方案。这是一个强大的功能,但如果使用错误,可能会降低性能

以下查询应执行您想要的操作:

DECLARE @center GEOGRAPHY

SET @center = geography::Point(46.969345, 8.592703, 4326)

SELECT TOP 10
    [Physical_Address_Street]
    , [Physical_Address_Local]
    , [Physical_Address_State]
    , [Physical_Address_Zip]
    , [Lat]
    , [Long]
    , [Phone_Number]
FROM Gas_Stations
WHERE Location_Type = 1
ORDER BY @center.STDistance(Location) ASC

你试过什么?只要一次谷歌搜索,就有大量的资源。搜索“STDistance”…我曾尝试在谷歌上搜索它,但我对它的了解还不够,甚至没有尝试过。我对数据库编程相当陌生。我没有使用这些内置功能,但一直在用一个自制的R树替代品进行类似的查询。上面的查询会选择所有行,计算每行到@center的距离,按计算出的距离排序,将结果限制在前10位吗?如果表中有一百万个加油站呢?地理空间功能是否采用了任何类型的预处理,以便将计算范围缩小到更小的行子集?@Tim:对不起,我不能告诉您有关SQL Server所做优化的更多信息。我在一个行数不断增长的表上使用了类似的查询。到目前为止,它的表现相当不错。也许我可以告诉你更多,一旦我找到了数百万条记录,或者找到时间仔细查看地理空间功能……在没有预处理的情况下,我遇到了性能问题,只有60000行进行了提供者邻近搜索。我们得到一组10000个地址,这些地址用lat/lon进行地理编码,然后对于每个地址,我们必须计算到三个最近的医生的平均距离(该表中有60K行)。如果你需要查询60000行10000次,你会喜欢一个小小的优化:-)僵尸,我只是想说谢谢你展示这个。它就像一个符咒。我做编程已经有几年了,但我对数据库真的很陌生。再次感谢你们。我确实研究了地理空间特征,并将继续这样做并学习它们。