【问题标题】:coordinate conversion using lookup table使用查找表进行坐标转换
【发布时间】:2012-01-25 22:31:19
【问题描述】:

我有一个应用程序,它读取带有值(即纬度、经度、值)的网格坐标数据,然后将这些数据绘制在地图上。绘制的地图使用朗伯等角圆锥投影,因此所有坐标数据都必须从纬度/经度转换为东/北。这一切都很好,但是在读取多个数据文件时存在明显的性能问题。由于所有数据文件都包含相同的点集(尽管不一定以相同的顺序),我认为某种查找表对坐标转换很有用。但是,我以前从未使用过查找表,并且在弄清楚设计时遇到了一些麻烦。

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

由于 lat/lon 是浮点值,我不能将它们用作数组索引(例如:lookup_array[lat][lon]),所以这确实是我最容易出错的地方。

注意:此解决方案可以是 C 或 C++,以具有最佳解决方案为准。

【问题讨论】:

  • @DanielFischer,问得好,因为如果是,一个简单的表就是 table[int(factorlat),int(factorlon)]=value。如果它不是均匀分布的,你可以用一个函数替换因子
  • @DanielFischer - 是的,纬度/经度是均匀分布的。
  • 好吧,那么如果你有足够的空间,lookup[round((x-xoff)/step)][round((y-yoff)/step)]是最简单的。

标签: c++ c lookup-tables


【解决方案1】:

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

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

【讨论】:

  • +1。对于哈希值,只需使用 lat + pi*(2+lon) 之类的值,并确保 00。要么使用该哈希创建一个类,要么只使用具有该值(双精度)作为键的(无序)映射。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多