矢量拾取是最近才做的功能, 以前一直认为这个功能可能会很麻烦, 原因呢:

  1. osgEarth里(估计所有的GIS球中)是将矢量光栅化成纹理贴到球上的, 怎么拾取一张图片上的一条线呢
  2. osgEarth的自带例子里没有找到矢量拾取的例子

最终这个功能毕竟是做出来了, 这里把自己的探索过程梳理一下.

  1. 首先去google上搜了一下osgEarth 矢量 拾取, 基本上没有找到什么可用的信息
  2. 继续googleosgEarth features pick, 第一条赫然是 osgearth/Pickers at master · gwaldron/osgearth · GitHub, 光看这个Pickers的名字, 就觉得有戏, 不过拿这个在osgEarth自带例子代码里搜了一下, 只有一个文件里包含了一下, 但却没有实际的地方使用过(其实这里自己是有点过于草率了, 应该再细细读一下例子代码的)
  3. 继续google没有什么收获, 就去了两个osgEarth的qq群里问了一下, 本来是没抱什么希望的, 因为之前在里面也问过一些问题, 水的居多, 回答问题的比较少, 但这次却有惊喜, YunGIS提醒例子里是有的, 并给了关键字: FeatureQueryTool, 拿这个词作为关键字搜索后, 就发现这个类是用来查询矢量的, 看了它的源码后, 写出了下面这段代码:
osgEarth::Picker pick(view, view->getSceneData());
osgEarth::Picker::Hits hits;
if (pick.pick(x,y,hits))
{
    for(osgEarth::Picker::Hits::iterator hit = hits.begin(); hit != hits.end(); ++hit )
    {
        //这里转成你需要的类型
        osgEarth::Annotation::FeatureNode* node = pick.getNode<osgEarth::Annotation::FeatureNode>(*hit); 
        if (node)
        { 业务逻辑 }
    }
}

总结:

  1. 相关的中文资料很少. 可能国内研究osgEarth的朋友都没碰到过我的问题, 也可能是我的问题过于小白, 不值得记录下来, 反正中文没有搜索到有用的信息
  2. google还是更"亲"英文一些. 把你要搜索的内容翻译成英文, 往往会比较容易找到答案
  3. 要养成阅读源码的习惯. 明明已经通过搜索知道Pickers这个关键词了了, 却并没有在osgEarth源码里搜索一下, 找找相关代码阅读, 而只是在例子代码里搜索, 结果错过了答案

PS:
为什么要写这么一篇自己如何解决问题的流水账呢?
最近正在看刘未鹏的<暗时间>, 里面提到: 书写是为了更好的思考, 还有他关于为什么一定要写博客的思考, 看后觉得十分有道理, 所以就尝试着把自己的思考过程记录下来, 看看自己现在是如何解题, 如何把一个好的解题过程固化下来, 如何在没有头绪的时候进行思考, 找到答案.


chaoswong
48 声望2 粉丝

引用和评论

0 条评论