2013-01-03 52 views
1

我有一個座標,假定有任何經度和緯度值。SimpleDB - 位置比較選擇表達式

我在SimpleDB上有一個域設置,它有很多項目(簡單的字符串),屬性爲'Latitude'和'Longitude'。現在我想要做的是查詢SimpleDB,並查看當前位置座標是否與SimpleDB的項目座標相距'x'米。 'x'應該是10.

我的應用程序使用包含緯度和經度的屬性將項目上載到SimpleDB。我檢測用戶位置,獲取座標,並且我想使用選擇表達式來查看座標是否相隔'x'米。那麼他們的更好做法呢?或者這是最好的方法,如果是這樣,我該怎麼做?

下面是一個選擇表達式可能看起來像什麼的例子,我只是不知道如何在這種情況下使用它,以及'%@'值將被填充。這整個格式可能是關閉的,它只是我的想法。

select * from test-app-simpledb where Latitude >= '%@' AND Latitude <= '%@' AND Longitude >= '%@' AND Longitude <= '%@' 

因此,「測試應用程序,SimpleDB的」是我的SimpleDB的域名,緯度和經度是我比較的座標的屬性。它們全部轉換爲字符串。

那麼,我該如何做位置比較選擇表達式。查詢項目的座標(緯度和經度屬性)是否爲'x'(在此情況下爲10米)。

任何方式來做到這一點?謝謝!

+0

@Rob感謝,在這個問題的答案,將在「角度」參數是什麼呢?另外'軸承代表'是什麼意思? – MCKapur

+0

@Rob所以我迭代bearing從0到pi * 2 – MCKapur

+0

@Rob是'bearingDegrees'你正在接受的角度?我從0迭代到M_pi * 2.0的那個? – MCKapur

回答

4

在修訂後的問題中,很明顯,實際的問題是如何針對Amazon SimpleDB數據庫進行查詢,以查看數據庫中的位置是否位於由iOS應用程序提供的位置的某個半徑範圍內。

正如您正確識別的那樣,如果可能的話,您確實希望做到服務器端而不是客戶端。特定的解決方案將高度依賴於特定的數據庫技術(在這種情況下爲SimpleDB)。

這個問題在Spatial queries on AWS SimpleDB中有所涉及。我會建議檢查一下以獲取更多信息。

作爲適當距離算法的代理,您可以將米的距離轉換爲緯度和經度範圍。因此,您可以在iOS中計算緯度和經度的最小值和最大值,然後將這些值在WHERE子句中傳遞給遠程數據庫。然後服務器可以根據這些標準過濾結果。這肯定會給你一個方形區域(而不是通過正確計算距離得到的圓形區域),但它使得在服務器上不需要特殊的地理位置邏輯來快速限制結果集變得非常容易。要做到這一點,你可以定義一個區域MKCoordinateRegionMakeWithDistance,然後抓住它的span

MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(originalCoordinate, 200, 200); 
MKCoordinateSpan span = region.span; 

這讓你span.latitudeDeltaspan.longitudeDelta,你可以圍繞給定位置的經度和緯度爲中心來定義形狀的某個位置附近區域的正方形。爲了證明在行動中,這裏的中心針是我在時代廣場的位置,而陰影區域是一個區域(使用上面的span構建,寬度和高度都是200米),它覆蓋了東經100米到100米之間的經度位置,以及我目前位置以北100米和北100米處的緯度。

using span to define a square region

這是採用MapKit.framework功能,大大簡化您的SQL查詢遠程數據庫來過濾基於地理距離的位置的方式。如果正方形區域存在問題,則可以使用CLLocation實例方法distanceFromLocation將結果下載到iOS應用程序後進一步過濾結果以確定實際距離。但是通過限制服務器檢索到的位置的經度和緯度,可以顯着簡化服務器檢索過程,同時不會通過太多的地理位置計算來阻止它。

但是,你真的想讓SimpleDB做完整,適當的距離計算,我必須把它留給別人。


下面是我的原始答案。在原始問題中,我誤解爲「如何構建圍繞特定位置的圓圈座標列表?」正如修改後的問題所表明的那樣,這根本不是問題,但我會在這裏保留我的舊回答作爲歷史參考。

原來的答覆:

如果使用Calculate new coordinate x meters and y degree away from one coordinate,實現可能看起來像:

NSInteger numberOfPoints = 10; 

for (double bearing = 0.0; bearing < 360.0; bearing += (360.0/numberOfPoints)) 
{ 
    CLLocationCoordinate2D coordinate = [self coordinateFromCoord:originalCoordinate 
                atDistanceKm:distanceKm 
               atBearingDegrees:bearing]; 
    // do whatever you want with this coordinate 
} 

這似乎很好地工作。例如,我有一個應用程序中使用這個例程在時代廣場離我下降10個引腳百米:

times square

+0

重新開始!在你給我的問題的答案中,他提供了一個與minLat,maxLat,maxLon和minLon相比較的選擇表達式,這可行,但需要有一種方法來計算最小緯度,最小經度,最大緯度和最大經度距離單個緯度/經度10米。在那兒? – MCKapur

+0

有沒有這方面的公式?你告訴我,緯度很容易,但經度不是 – MCKapur

+0

謝謝,那麼緯度和經度的Delta會是什麼?最小的緯度或經度還是最大值?我該如何使用它? – MCKapur