查看: 1186|回复: 1

OSGEarth的mbtiles插件

[复制链接]

该用户从未签到

发表于 2016-3-10 23:07:24 | 显示全部楼层 |阅读模式
osgEarth的mbtiles的插件(Plugin osgearth_mbtiles)的源码(MBTilesTileSource.cpp)中,有如下代码
  1. const Profile* profile = getProfile();
  2.         if (!profile)
  3.         {
  4.             if (!profileStr.empty())
  5.             {
  6.                 // try to parse it as a JSON config
  7.                 Config pconf;
  8.                 pconf.fromJSON(profileStr);
  9.                 profile = Profile::create(ProfileOptions(pconf));

  10.                 // if that didn't work, try parsing it directly
  11.                 if ( !profile )
  12.                 {
  13.                     profile = Profile::create(profileStr);
  14.                 }

  15.                 if ( !profile )
  16.                 {
  17.                     return Status::Error( Stringify() << "Profile not recognized: " << profileStr );
  18.                 }
  19.             }
  20.             else
  21.             {
  22.                 // Spherical mercator is the MBTiles default.
  23.                 profile = osgEarth::Registry::instance()->getGlobalGeodeticProfile();
  24.                                 //profile = osgEarth::Registry::instance()->getSphericalMercatorProfile();
  25.             }

  26.             setProfile( profile );     
  27.             OE_INFO << LC << "Profile = " << profileStr << std::endl;
  28.         }
复制代码

        (1) profile = osgEarth::Registry::instance()->getSphericalMercatorProfile();为Earth自带的代码
        (2) profile = osgEarth::Registry::instance()->getGlobalGeodeticProfile();为修改后的代码
        说明,mbtiles文件中没有写入profile信息因此会创建一个默认的投影方式。问题如下,当采用(1)时,会调用 MBTilesTileSource::createImage,可以显示地图数据,只是因数据为wgs84下的数据;当采用(2)时,不会调用createImage方法,地图数据就没办法显示。
       往大神指导,问题很大呢。
osg      版本 3.5.1
Earth   版本 2.7.0

该用户从未签到

 楼主| 发表于 2016-3-11 13:56:49 | 显示全部楼层
经过今天上午的调试,问题出在,读取bounds这里;在插件源码中,将south和north的两个值读反了,造成进行相交运算时,判断视点区域是否在数据所包含的区域时一直返回false,造成不读数据。而墨卡托那个,就不知道原因是啥了。
  1. GeoExtent extent(
  2.                     osgEarth::SpatialReference::get("wgs84"),
  3.                     osgEarth::as<double>(tokens[0], 0.0),
  4.                     osgEarth::as<double>(tokens[1], 0.0), // south
  5.                     osgEarth::as<double>(tokens[2], 0.0), // east
  6.                     osgEarth::as<double>(tokens[3], 0.0)  // north
  7.                     );
复制代码

这里源码中tokens,south对应为3,north对应的索引值为1。而我的mbtiles是西南东北这样存储的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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