查看: 1807|回复: 1

求助:如何直接读取分层分块的localMap?

[复制链接]

该用户从未签到

发表于 2010-1-13 20:58:22 | 显示全部楼层 |阅读模式
本帖最后由 lianghui 于 2010-1-13 21:03 编辑

OSG EARTH的问题求教

1、将一个分层分块的图贴到地球表面。
我的做法:在本机上发布了MyMap目录,里边包含一个tms.xml文件,文件内容如下:
  <?xml version="1.0" encoding="utf-8" ?>
- <tilemap tilemapservice="" version="">
  <title />
  <abstract />
  <srs>EPSG:41001</srs>
  <boundingbox maxx="2558000.00" maxy="752000.00" minx="-2050000.00" miny="-2137000.00" />
  <origin x="-2050000.00" y="-2137000.00" />
  <tileformat extension="jpg" height="256" mime-type="" width="256" />
- <tilesets profile="local">
  <tileset href="" order="0" units-per-pixel="64000" />
        </tileset>
  <tileset href="" order="1" units-per-pixel="32000" />
        </tileset>
  <tileset href="" order="2" units-per-pixel="16000" />
        </tileset>
< </tilesets>
  </tilemap>
同级目录包含文件夹:0,1,2,各文件夹内包含了2^N个文件夹和金字塔分割的4^N张图片。
使用代码
    osg::ArgumentParser arguments(&argc,argv);
    osgViewer::Viewer viewer(arguments);
    osgEarthUtil::EarthManipulator* manip = new  osgEarthUtil::EarthManipulator();
    viewer.setCameraManipulator( manip );
    osgEarth::Map* map = new osgEarth::Map();

    osgEarth::Config conf;
conf.add( "url", “http://localhost/MyMap/tms.xml” );
    map->addMapLayer( new osgEarth::MapLayer(
        "MyMap", osgEarth::MapLayer::TYPE_IMAGE, "tms", conf ) );
    osgEarth::MapNode* mapNode = new osgEarth::MapNode( map );
    viewer.setSceneData( mapNode );
    //viewer.addEventHandler(new osgViewer::StatsHandler());
    viewer.addEventHandler(new osgViewer::StatsHandler());
    viewer.addEventHandler(new osgViewer::WindowSizeHandler());
    viewer.addEventHandler(new osgGA::StateSetManipulator(viewer.getCamera()->getOrCreateStateSet()));
    return viewer.run();
渲染后看不到球体,在对应的位置也看不到我发布的图片。
如果将红色字体部分替换成
conf.add( "url", "http://pelicanmapping.com/downloads/jason/OakRidge_UTM_TMS/tilemapresource.xml" );
还是能浏览到地球的。

2、在浏览地球的时候,相机必须接近一定高度才出现渲染地球图层,在这个高度、视角以上时图层不出现或者只出现地球的一小块。代码是这样的:

  m_pViewer = new osgViewer::Viewer();
  m_pManip = new osgEarthUtil::EarthManipulator();
  m_pRoot = new osg::Switch;
  osg::ref_ptr<osg::Camera> camera = new osg::Camera;
  camera->setProjectionMatrixAsPerspective( 40.0f,(double)m_Traits->width/(double)m_Traits->height, 1.0f, 10000.0f );
  // construct the viewer.
  m_pViewer->setCameraManipulator( m_pManip );
  m_pViewer->setThreadingModel( osgViewer::Viewer::SingleThreaded );
  m_pViewer->setCamera( camera.get() );
  m_pMapNode = new MapNode();
  osg::ref_ptr<osg::Node> loadedModel = m_pMapNode;
  m_pfadeLayerNode = new osgEarthUtil::FadeLayerNode( m_pMapNode->getMap(), m_pMapNode->getEngine()->getEngineProperties());
  m_pfadeLayerNode->addChild(loadedModel.get());
  m_pRoot->addChild(m_pfadeLayerNode);
  m_pViewer->setSceneData(m_pRoot);
  m_pViewer->realize();
等m_pViewer->frame();执行后,再中断,加载如下图层:
conf.add( "url", "http://pelicanmapping.com/downloads/jason/OakRidge_UTM_TMS/tilemapresource.xml“);
    MapLayer* layer = new MapLayer((std::string)LayerName, MapLayer::TYPE_IMAGE, (std::string)TypeImage, conf );
m_pMapNode->getMap()->addMapLayer(layer);
光板球消失,但是地球没有渲染出来,需要拉近一定高度才能出现。在出现的临界范围来回转动地球,只能看见其中一块图片。
这两个问题困扰了我很久了……

void setProjectionMatrixAsPerspective( double fovy,
double aspectRatio, double zNear, double zFar );
对应的参数里边第一个参数设成40.0时效果要比10.0时要好,最后一个参数值10000比100的效果要好。
  camera->setProjectionMatrixAsPerspective( 40.0f,(double)m_Traits->width/(double)m_Traits->height, 1.0f, 10000.0f );

该用户从未签到

发表于 2010-1-24 20:24:09 | 显示全部楼层
请问下,osgearth的地图和高程数据是否能下载下来?
还有一个问题是,osgearth的高程数据能精确到什么程度?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表