2012-10-04 46 views
2

我试图找到到最近的自行车架到犯罪地点的距离。我有一个有500万个犯罪和5000个自行车架的数据库表。我现在需要做的是为500万件犯罪案件中的每一件寻找最近的自行车架。我尝试使用geopy创建一个python脚本,但它在处理过程中太耗时(至少需要几周)。我一直在网上广泛搜索,我发现SQL Server 2012有一个地理数据类型,所以我创建了一个包含经度和纬度点的犯罪和自行车架的地理数据类型的列。SQL Server 2012地理位置 - 查找多个行的最小值

现在我试图做这样的事情:

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

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

消息512,级别16,状态1 ,第1行子查询返回的值超过1 。当子查询遵循=,!=,<,< =,>,> = 或子查询用作表达式时,这是不允许的。该语句已终止。

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

回答

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万周的罪行五千自行车架,这可能需要......一段时间。所以你可能想看看批量更新。

+0

这是完美的!正是我在找什么。谢谢!我向更新添加了批处理。 –

0

显然,你需要为每一个作案地点,一旦做到这一点计算,子查询会需要与犯罪的位置信息,以便找到最近的自行车架。

我还没有看过SQL 2012,但在过去的日子里,人们会使用Haversine公式,这实际上非常快。 请参阅 Geolocation and Haversine formula的回答,或者我回答几年前的How to calculate distance from a GPX file?以获得UDF实现。