2012-12-31 112 views
4

我在SQLite數據庫中獲得了具有高度的長/緯度座標。快速搜索SQL中的最近值

一些示例數據:

latitude longitude altitude 
------------------------------ 
48.003333 11.0  652  
48.036667 11.000833 651 
48.280833 11.000833 533 

現在我想一些SQL查詢,這將給我最接近海拔指定緯度/經度座標,以便例如

鑑於經/緯將48.023445/11.000733所以最接近的是海拔651與緯度/長48.036667/11.000833。試圖搜索很多論壇,但沒有用處。到處都是一個變量或非常緩慢的查詢的例子。我非常需要這個查詢,並且看到了一些基於UNION的解決方案。我需要它很快,因爲我會在這張桌子上做大約一千五百萬次查詢。我正在使用交易和索引。

+0

你使用了哪個數據庫? PostgreSQL的? – piotrekkr

+3

Maby這將幫助http://stackoverflow.com/questions/1006654/fastest-distance-lookup-given-latitude-longitude或maby使用postgresql + PostGIS(http://postgis.org/) – piotrekkr

+0

@MartinŠevic您的查詢都是在矩形區域的連續點嗎?在這種情況下,您應該爲您的問題添加更多上下文。 – kmkaplan

回答

1

我會去一些類似下面的查詢:

select * from pos order by ((lat-48.00333)*(lat-48.00333)+(long-11.0)*(long-11.0)+(alt-652)*(alt-652)); 

SQLite不支持SQRT但SQRT是單調的,你可以在距離公式中跳過它。

+0

但我不想計算距離,我只想爲地圖上的每個像素設置高度。每個像素都有它自己的座標,所以我只想搜索最近的一行,其中long = xx.xxxxx和lat = yy.yyyyyy –

+1

據我瞭解,你試圖做類似於: foreach y foreach x find closest海拔到點(x,y) 是對不起?在這種情況下,掃描是O(n^2),因此這種查詢效率很低。 –

+0

是的,你是對的 –

3

使用經度和緯度座標的球體上兩點之間距離的公式並不簡單,並且is described here。如頁面中所述,如果點相對接近,則可以用簡單的平面三角法得出結果,並且僅使用點之間的歐幾里得距離:

4

爲了您的目的(點接近搜索座標),您可能會以及使用飛機上的距離公式儘量減少。

(lat-latitude)*(lat-latitude) + (long-longitude)*(long-longitude)