2009-10-30 51 views
2

我有一個郵政編碼與他們的緯度/長度的數據庫表。我試圖找到一些代碼,顯示一個查詢需要一個zipcode和x英里,然後返回包含該半徑內的所有zipcode的結果集(精度不是很重要 - 只要關閉)。使用Linq to Sql在半徑距離內查找郵政編碼

這可以用Linq to SQL查詢來完成,所以我不必使用存儲過程?

+0

[查找與經度和緯度最接近的位置(http://stackoverflow.com/questions/12835851/find-closest-location-with-longitude-and-latitude) – DaveInCaz 2017-05-18 18:51:31

+0

@DaveInCaz的可能的複製如果只7年前,當我問這個問題時,我有一臺時間機器!感謝您的反對票。 = \ – EdenMachine 2017-05-18 23:34:42

+1

我沒有低估這個問題,但是如果有人這樣做,我很抱歉,因爲我認爲這是一個很好的問題。但是,重複合併似乎具有很大的價值,即使它們已經存在了一段時間。 – DaveInCaz 2017-05-18 23:55:10

回答

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 2009-11-01 10:57:50

+0

@KristoferA - 我個人並不在乎,只要它非常接近,但如果你有一個更好的公式,適合這個功能,我當然不介意提高準確性。 – EdenMachine 2009-11-02 13:30:05

+0

那麼這個代碼仍然是一個正方形或被調整爲一個半徑? – 2013-02-19 20:10:56

相關問題