2012-12-31 111 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)