使用查找表进行坐标转换

时间:2012-01-25 22:31:20

标签: c++ c lookup-tables

我有一个应用程序,它使用值(即lat,lon,value)读入网格化坐标数据,然后在地图上绘制这些数据。绘制的地图使用lambert共形圆锥投影,因此所有坐标数据必须从lat / lon转换为easting / northing。这一切都很好,但是在读取多个数据文件时会出现明显的性能问题。由于所有数据文件都包含相同的点集(虽然不一定是相同的顺序),我认为某种查找表对于坐标转换很有用。但是我之前从未使用过查找表,并且在设计时遇到了一些麻烦。

简而言之 - 假设坐标对之间存在1:1的关系,任何关于采用纬度/经度坐标对(浮点值)的最快方法的建议并查找相应的E / N对(浮点值) ,没有缺失值等?

由于lat / lon是浮点值,所以我不能将它们用作数组索引(例如:lookup_array [lat] [lon]),所以这真的是我获得最多绊倒的地方。

注意:此解决方案可以是C或C ++,无论哪种解决方案都是最佳解决方案。

3 个答案:

答案 0 :(得分:2)

您要使用的技术称为memoization。对于您的情况,hash table似乎是lookup table的良好候选人。 C ++ 11有一个标准的基于散列的关联容器,名为std::unordered_map。存在C ++ 03的实现;例如早期版本的GCC和MSVC都有std::tr1::unordered_map。您需要创建(或找到)将坐标转换为哈希值的良好哈希函数(请参阅下面评论中Johan Lundberg的建议)。

基于比较的关联容器,例如, std::map也适合,但当元素数量足够大时它会明显变慢。

答案 1 :(得分:1)

因为可能的纬度/长度的空间很大,我认为事先建立整个表格是不可行的。但是,您可以记住(例如)哈希表中每个转换的结果。然后,每次进行转换时,首先检查它是否在表中。如果不是,则进行计算并将其存储在哈希表中以供下次使用。

但是,在任何基于查询的数据结构(see this question)中使用浮点数作为键并不是一个好主意。对于lat / long数据,如果您的输入格式一致,那么您可以通过使用字符串作为键来避免此问题(如果不是,则可以使用sprintf()或类似的方法来制作一致的格式的lat / long字符串,直到给定的精度)。

如果您想要一个开箱即用的C ++哈希表实现,请查看std::unordered_mapthis wikipedia article.

答案 2 :(得分:1)

您可以进行插值而不是直接查找。计算覆盖整个地图表面的经度和纬度的常规网格的映射。当你得到一个纬度/长对时,你会在网格中查找围绕该点的四个点,并使用线性插值来获得更精确的值。