【问题标题】:I need a spatial query for SQL Server to return the ten closest locations我需要 SQL Server 的空间查询以返回最近的十个位置
【发布时间】:2013-04-24 21:57:49
【问题描述】:

我正在使用 Visual Studio 2010 和 vb.net 创建一个 .asmx 网络服务,并使用 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

【问题讨论】:

  • 你试过什么?只需 google 一次搜索,就有大量资源。搜索“STDistance”...
  • 我试过用谷歌搜索它,但我对它的了解还不够,甚至无法尝试。我对数据库编程相当陌生。

标签: vb.net visual-studio-2010 sql-server-2008


【解决方案1】:

我强烈建议您仔细研究 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

【讨论】:

  • 我没有使用这些内置功能,但一直在使用 R-TREES 的本土替代品进行类似的查询。上面的查询是否会选择所有行,计算每行与@center 的距离,按计算出的距离排序,将结果限制在前 10 位?如果表中有一百万个加油站怎么办?地理空间特征是否采用任何类型的预处理,以便将计算范围缩小到更小的行子集?
  • @Tim:对不起,我不能告诉你更多关于 SQL Server 所做的优化。我在行数不断增长的表上使用与此类似的查询。到目前为止,它的表现还不错。当我达到数百万条记录或有时间仔细研究地理空间特征时,也许我可以告诉你更多信息......
  • 在没有预处理的情况下,我遇到了性能问题,只有 60,000 行进行提供者邻近搜索。我们得到一组 10,000 个地址,这些地址使用 lat/lon 进行地理编码,然后对于每个地址,我们必须计算到三个最近的医疗从业者的平均距离(该表中的 60K 行)。如果您必须查询 60,000 行 10,000 次,您会喜欢一点优化 :-)
  • 僵尸 我只是想说谢谢你展示这个。它就像一个魅力。我已经做了几年编程,但我对数据库真的很陌生。再次感谢您。
  • 我确实研究了地理空间功能,并将继续这样做并学习它们。
猜你喜欢
  • 1970-01-01
  • 2018-03-18
  • 2011-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多