返回结果取决于半径纬度和经度

时间:2015-04-27 08:59:51

标签: c# search asp.net-mvc-5.2

在我的数据库中,我目前拥有所有国家/地区和州/城市,每个城市都有自己的纬度和经度,我设法通过谷歌使用reverse geocoding

当某个特定用户来到该网站并说“好的向我展示在澳大利亚的所有人,在维多利亚州内,住在菲茨罗伊市”,在半径20公里范围内,我有菲茨罗伊的经纬度但我不确定如何让其他目前不在菲茨罗伊的用户,但确实落到了20公里半径。

我确实遇到过这个线程,对我来说看起来很有希望Calculating Distance between two Latitude and Longitude,不同的是我会过滤很多记录,如果不是更多,可能是10k,具体取决于半径和位置。我正在寻求实施一个解决方案,它不仅能给我想要的结果,还会考虑性能。无论是在MVC控制器中还是在存储过程中完成。

我想知道有没有人做过类似的事情?他们可以与我分享他们的知识。我是这种搜索的新手,所以任何信息/链接都是有益的。

请注意我不希望你为我编写代码,我自己也能做到这一点。

2 个答案:

答案 0 :(得分:1)

我认为,可能的解决方案是计算所需城市和半径的纬度和经度范围。在这种情况下,您将能够使用简单的WHERE sql查询获取此范围内的所有用户。

例如,您必须找到城市周围N km范围内的所有用户,纬度= X且经度= Y.我的想法是您应该计算满足此条件的纬度和经度的最小值和最大值。

一度纬度等于111.3 km。因此,纬度的最小值和最大值可以这样计算:

minX = X - N / 111.3

maxX = X + N / 111.3

一度经度等于111.3 * cos(X),所以:

mixY = Y - N /(111.3 * cos(X))

maxY = Y + N /(111.3 * cos(X))

在计算纬度和经度的最小值和最大值之后,您将能够撰写对数据库的查询。它将类似于:

" SELECT FROM ... WHERE(纬度< = maxX&纬度> = minX)& (经度< = maxY&经度> = minY)"

答案 1 :(得分:0)

我假设您正在使用MVC,因为您正在使用SQL Server数据库。如果是这种情况,那么您可以尝试使用此实体框架中提供的空间数据支持,而不是尝试自己完成所有工作。

试试这篇展示基础知识的博文:http://weblog.west-wind.com/posts/2012/Jun/21/Basic-Spatial-Data-with-SQL-Server-and-Entity-Framework-50