SQL Server 2012地理位置 - 找到最少的多行

时间:2012-10-04 15:49:43

标签: sql sql-server geography

我试图找到距离最近的自行车架到犯罪地点的距离。我有一个包含500万个犯罪和5,000个自行车架的数据库表。我现在需要做的是找到最接近500万个犯罪的自行车架。我尝试使用geopy创建一个python脚本,但它在处理过程中过于耗费时间(至少需要数周时间)。我一直在网上搜索,我发现SQL Server 2012有一个地理数据类型,所以我创建了一个包含犯罪和自行车架的纬度和经度点的地理数据类型的列。

现在我正在尝试这样做:

update Crimes set distanceToNearestBikeRack = crimeGeo.STDistance((select geo from bike_racks))

不幸的是,这会导致子查询返回许多行并抛出:

  

Msg 512,Level 16,State 1,Line 1 Subquery返回的值超过1   值。子查询遵循=,!=,<,< =,>,> =时不允许这样做   或者当子查询用作表达式时。声明已经终止。

如何从多个点找到最近的点?

2 个答案:

答案 0 :(得分:1)

通常你会使用MIN来找到一组最小值,但它似乎不适合空间方法。但是这很有效:

UPDATE
   Crimes
SET
    distanceToNearestBikeRack = 
        (SELECT TOP 1 crimeGeo.STDistance(BR.geo)
        FROM bike_racks BR
        ORDER BY crimeGeo.STDistance(BR.geo) ASC)

当然,有500万个罪行和五千个自行车架,这可能需要一段时间。因此,您可能希望了解批量更新。

答案 1 :(得分:0)

您显然需要为每个犯罪地点执行一次此计算,子查询将需要有关犯罪地点的信息,以便找到最近的自行车架。

我没有考虑过SQL 2012,但在过去,人们会使用Haversine公式,这实际上非常快。 看到答案 Geolocation and Haversine formula,或者我几年前对How to calculate distance from a GPX file?的答案,用于UDF实施。