2010-11-09 36 views
0

我需要建立一個SQLite表將包括以下欄:如何使用緯度和經度變量作爲條件從SQLite表中檢索結果集?

  1. 名稱
  2. 地址
  3. ProvinceState
  4. PostalZipCode
  5. 國家
  6. ******中國
  7. 緯度
  8. 經度

我需要發送一個請求到該表中,在那裏我傳遞緯度和使用已經從用戶的位置,計算經度變量CLLocation,並檢索是最接近人的我行但我的問題是:

  1. 緯度和經度是什麼列類型,以便我可以拉相關的行?列應該是字符串還是其他?我通過的變量應該是什麼類型?他們應該是絃樂,雙打還是別的?目前,我在我的代碼中將它們作爲字符串,但我不確定這是否是最好的方法。這很重要,因爲在縱座標的情況下,這些值將是負值。當我進行sql調用時,我會如何考慮這一點?

  2. 目前,表格很小。然而,這個表格在將來一定會變得相當大,我不想從表格中檢索所有的值,而是過濾掉不相關的值,只檢索那些必要的值。我想我會這樣做的方式是檢索那些緯度/縱向對在數值上最接近我傳入的那些行。我將如何構建一個SQL查詢來適應Objective-C中的這個問題?

回答

1

除了將緯度和經度存儲爲雙倍值外,你一定要索引這些字段。但是,您應該意識到索引操作在整數字段的情況下效率最高 - 這對於大數據量而言是一個重要的考慮因素。

我想下面的算法可以幫助你:

  • 引入額外的列:
    • LatitudeIdx INT = ROUND(緯度*比例因子)
    • LongitudeIdx INT = ROUND(經度*比例因子)
  • 爲ScaleFactor定義值,它將滿足您的需求
  • 定義一個索引(LatitudeIdx,LongitudeIdx)
  • 查詢您的數據使用LatiduteIdx和LongitudeIdx值你* IDX列和比例因子達到什麼(這將是一個快速的索引查找操作)

實際上是破壞你的數據轉換成大小相同的細胞。單元格的大小實際上是1/ScaleFactor幾何度數,即大約111公里/ ScaleFactor。

所以,當你檢索與特定LatitudeIdx數據和LongitudeIdx值,你實際上得到的是落入那些值定義的細胞,即篩選數據點的所有點。之後,您計算到感興趣點的距離並選擇最接近的點(您可以直接在查詢中執行此操作,並按距離排序以獲得您需要的點數)。

+0

非常感謝您的及時答覆,我真的很感激。一個後續問題,ScaleFactor應該有多大?如果這是一個任意數字(例如5)?再次感謝您花時間回答我的問題。 – syedfa 2010-11-09 16:15:53

+0

一如往常這樣的事情的答案是「這取決於」 :-)比例因子定義你要在第一輪以用於過濾點的小單元的大小。例如:如果你想篩選出落在withing點說,目標點500米,你需要再次使用比例因子= 111 KM /(2 * 500米)= 111 – AlexS 2010-11-09 16:39:09

+0

感謝您的及時回覆。你的方法是非常獨特的,而不是我之前考慮過的,因爲我對iPhone編程和地理定位非常陌生。您是否有可能進一步澄清關於比例因子的理論?我希望我的iPhone應用程序向用戶展示他/她所在的最近的特色餐廳,並以最接近最遠的順序將它們呈現給用戶。我的SQLite表將包含每個位置的緯度/經度座標對。如果你可以進一步澄清你提出的概念,我會非常感激。再次感謝! – syedfa 2010-11-09 17:45:11

0

在sqlite中編寫查詢與在任何其他SQL語言中編寫查詢類似。基於我對你的問題的理解,我認爲你應該把經度和緯度存儲爲雙倍。

相關問題