2012-08-07 52 views
6

我想知道人們如何提出在亞馬遜Web服務SimpleDB中進行空間查詢的有效方法?AWS SimpleDB上的空間查詢

通過空間查詢我的意思是在給定經度和緯度半徑內查找對象。

回答

14

SimpleDB目前不提供任何內置的空間搜索操作,但這並不意味着它無法完成。在非地理空間數據庫(如SimpleDB)中實施地理空間搜索有幾種方法,它們都圍繞使用數據庫檢索基於地理空間邊界框的粗略首選項,然後使用應用程序中的返回數據進行篩選更精確的算法,如Haversine formula

可能商店的緯度和經度(零填充和標準化)數值屬性,然後執行雙範圍查詢(lat >= minLat and lat <= maxLat and lon >= minLat and lon <= maxLat),但因爲沒有theese謂詞的選擇性(每個謂詞很多項目的比賽)這並不理想(參見Tuning Queries)。

更好的方法是使用GeoHashes

Geohashes提供像任意精度特性,對於附近的位置的相似前綴 ,並且逐漸從代碼的末尾去除 字符以減小其尺寸(並逐漸失去 精度)的可能性。

作爲一個實際的例子中,地理散列6gkzwgjzn820解碼爲 座標-25.382708 -49.265506和,而地理散列6gkzwgjz將 解碼到-25.383和-49.266,如果我們採取 同一區域相似的位置,如-25.427和-49.315,我們可以看到它是 編碼爲6gkzmg1w(注意類似的前綴)。

http://geohash.org/site/tips.html

與您的項目位置爲GeoHashes您可以使用like操作符來搜索邊界框(where GeoHash like '6gkzmg1w%'),但由於like操作是昂貴的(Comparison Operators)更好的方式將非規範化通過將每個GeoHash前綴級別(多少取決於您所需的搜索精度)作爲單獨的屬性(GeoHash6 GeoHash8等)存儲數據,然後使用簡單的相等謂詞(where Geohash8 = '6gkzmg1w')。

現在是GeoHashes的缺點。由於您無法假設您的搜索框中的GeoHash居中,因此您還必須搜索所有相鄰的前綴。該方法極好地通過geohash-js

描述地理散列還具有作爲的位數減少 (右)的財產,精度下降。這個屬性可以用來做 邊界框搜索,因爲彼此相鄰的點將共享 類似的Geohash前綴。但是,由於給定的點可能出現在給定的邊界處的Geohash邊界框中,因此有必要生成一個Geohash值列表,以便在點周圍執行真正的鄰近搜索。 由於Geohash算法使用的是基本32編號系統,因此可以使用簡單的查找表推導圍繞任何其他給定012的Geohash值的Geohash值。

因此,例如,賓夕法尼亞大道1600號,華盛頓特區解析爲: 38.897,-77.036

使用地理散列算法,這個緯度和經度轉換 到:dqcjqcp84c6e

一個簡單的邊框在該點周圍可以通過 描述截斷此地理散列到:dqcjqc

然而,「dqcjqcp84c6e」不居中「內dqcjqc」,和搜索「dqcjqc」內 可能錯過某些所需圓盾TS。

所以相反,我們可以使用Geohash的數學屬性來 快速計算'dqcjqc'的鄰居;我們發現,它們是: 'dqcjqf', 'dqcjqb', 'dqcjr1', 'dqcjq9', 'dqcjqd', 'dqcjr4', 'dqcjr0', 'dqcjq8'

這給了我們周圍邊框「 dqcjqcp84c6e'大約2km x 1.5km 並且允許僅在9個鍵上進行數據庫搜索:SELECT * FROM表 WHERE LEFT(geohash,6)IN('dqcjqc', 'dqcjqf','dqcjqb','dqcjr1', 'dqcjq9', 'dqcjqd', 'dqcjr4', 'dqcjr0', 'dqcjq8');

轉換爲SimpleDB的查詢會是where GeoHash6 in('dqcjqc', 'dqcjqf', 'dqcjqb', 'dqcjr1', 'dqcjq9', 'dqcjqd', 'dqcjr4', 'dqcjr0', 'dqcjq8'),然後你會做你的結果半正矢過濾,以僅獲得搜索半徑範圍內是這樣的項目。

+0

出色答卷,感謝上Geohashes討論 – user293895 2012-08-09 01:44:11

0

我要離開這裏,因爲它可能會幫助你!

14年前,我們試圖做一個半徑範圍內地理位置的地理查詢表。顯然沒有地理空間索引或類似的東西。 從字面上看,只有標準的SQL和Oracle ...無論如何,我們最終將固定平面字段中的所有緯度/經度變換爲千米。基本上什麼是地理空間索引。

爲了解釋它究竟做了什麼,它將世界變成了一個平坦的表面,並且有一點SQL技巧,你甚至可以通過半徑選擇,甚至可以從你選擇的兩點得到距離。由於它也是原始的完整整數,查詢速度非常快。

這裏是PHP一個簡單的例子和​​一個非常複雜的尋找,但很容易,一旦你瞭解它的SQL查詢:

https://gist.github.com/tobsn/899413