使用 Linq to Sql 查找半径距离内的邮编

3

我有一个包含邮政编码及其经纬度的数据库表。我正在尝试查找一些代码,用于查询给定的邮政编码和半径x英里内的所有邮政编码(精度不是非常重要,只要接近即可)。

这个查询可以使用Linq to SQL来完成吗?这样就不必使用存储过程了。


可能是查找最接近的经纬度位置的重复问题。 - StayOnTarget
如果我7年前问这个问题时有一台时间机器就好了!感谢你的踩票。=\ - RichC
1
我没有对这个问题进行负面评价,但如果有人这样做了,我很抱歉,因为我认为这是一个好问题。但是,即使它们已经存在一段时间,合并重复的问题似乎具有很大的价值。 - StayOnTarget
他们的问题不是我的问题的重复吗?因为我先问了这个问题。 - RichC
1
抱歉如果给你留下了那种印象,那不是我的意图。此外,“possible duplicate of...”这个措辞不是我自己的 - 当我将此标记为可能的重复项时,SO本身就使用了这个措辞。 - StayOnTarget
显示剩余4条评论
1个回答

1
我找到了解决方法,一旦我找到了方程式,其实并不难。
Public Function SearchStudents(ByVal SearchZip As String, ByVal Miles As Double) As IEnumerable(Of Student)
                Dim dc As New IMDataContext()

                Dim lat As Double
                Dim lng As Double
                Dim maxlat As Double
                Dim minlat As Double
                Dim maxlng As Double
                Dim minlng As Double

                Dim zip As ZipCode = (From z In dc.ZipCodes Where z.ZipCode = SearchZip).SingleOrDefault()

                lat = zip.Latitude
                lng = zip.Longitude

                maxlat = lat + Miles / 69.17
                minlat = lat - (maxlat - lat)
                maxlng = lng + Miles / (Math.Cos(minlat * Math.PI / 180) * 69.17)
                minlng = lng - (maxlng - lng)

                Dim ziplist = From z In dc.ZipCodes Where z.Latitude >= minlat _
                       And z.Latitude <= maxlat _
                       And z.Longitude >= minlng _
                       And z.Longitude <= maxlng Select z.ZipCode

                Return From i In dc.Students Where ziplist.Contains(i.Zip)
            End Function

1
这检查的是是否在正方形内,而不是半径。你需要比较纬度/经度对之间的距离来获取一个半径... - KristoferA
@KristoferA - 就我个人而言,只要它相当接近就行了,但如果你有更好的公式适用于这个函数,我肯定不介意提高准确性。 - RichC
这段代码仍然生成正方形,还是已经调整为半径了? - Sealer_05
我相信它仍然是一个正方形。 - RichC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接