OSGEarth

来自CGTWiki
跳转至:导航搜索
  1. OSGEarth github
  2. OSGEarth文档

数据准备

水经微图数据下载与导出

地形和标签

在v6o.cgt3d.cn服务器上,有全国地形和标签的数据不用下载,使用拷贝工具选出所要导出的区域,直接使用tms进行导出即可。

水经微图导出说明

水经微图导出
  • 标签应使用png导出

卫星图像

一般采用bing的卫星图,下载方式如1.2所示。

如果效果不好应采用天地图的影像,导出tms。

加载方法

 <image name="googlelable" driver="tms">
        <url>http://v6o.cgt3d.cn:8055/tms.xml</url>
        <min_level>0</min_level>
        <max_level>8</max_level>
   </image>

全能电子地图下载器下载bing数据

在v6o.cgt3d.cn服务器上,已经默认下载全国1-15级的图像。

如要添加新区域,只需要采用增量下载即可,使用全能电子地图下载器下载,地址为D:\Program Files (x86)\MapTileDownloader。

   <image name="bing" driver="xyz">
        <url>http://v6o.cgt3d.cn:8054/{z}/{x}/{y}.jpg</url>
        <profile>spherical-mercator</profile>
   </image>

GeoServer数据的发布

  • 准备工作:需要在发布地图之前添加工作区,设置name和url,并设置为默认工作区。
服务页面
新建工作区

WFS

  • 进入GeoServer服务后,选择左侧 数据->数据存储->添加新的数据存储->Directory of spatial files,添加矢量数据。设置数据源名称和数据文件的目录。(最好采用英文目录)
新建数据源
  • 保存后会出现New Layer页面,点击发布,计算地图范围,保存。
设置数据范围
  • 在Layer Preview中可以找到刚刚发布的数据,可以点击OpenLayers查看数据。也可提供url调用。
矢量数据示例
  • osgearth配置的文件如下,只需将tpyename中的名字换成要调用的矢量文件的图层名字即可成功调用相应矢量文件。
<model driver="feature_geom">
        <features name="states" driver="wfs">
             <url>http://10.112.187.139:8080/geoserver/wfs</url>
	       <typename>worldmap:heze_city</typename>
      <outputformat>json</outputformat>
      </features> 	
        <styles>
		<style type="text/css">
			default {
				stroke:#ffff00;
				stroke-width: 2;
				altitude-clamping:  terrain;
				altitude-technique: drape;
			}
		</style>
	</styles>
	<fading duration="1.0"/>	
</model>

TMS

  • 发布tms瓦片数据流程:
  • 在数据储存内选择添加新的数据储存,选择栅格数据源下的GeoTIFF,然后填写数据源名称和选择数据本地瓦片数据。
添加数据储存
选择本地瓦片数据
  • 发布地图服务:点击发布,设置Tile Caching选项,在设置Tile Caching之前首先新建一个Gridsets,设置格网集的名称、坐标系、切片的范围、切片的宽与高以及切片的级数,本次使用了默认的EPSG:4326设置了5级。其中切片的范围来源于发布地图时的地图范围。
设置Tile Caching
  • 发布完成后点击左侧功能栏的Tile Layers,然后找到刚刚发布的地图,点击seed/Truncate,打开设置页面。设置Number of tasks to use,zoom start以及zoom stop,点击提交,即可实现切片,切片文件保存在GeoServer安装目录。
配置切片
  • 上一步切片已成功存在本地,如想在osgearth中调用TMS瓦片地图服务,在GeoWebCache页面,点击TMS 1.0.0 document查看相应url。
缓存页面
相应url
  • osgearth配置的文件如下:
<!--
osgEarth Sample - GDAL Driver
Demonstrates the simplest possible use of the GDAL driver to load a GeoTIFF image.
-->

<map version="2">
    <image driver="tms" name="map:world" cache_enabled="false">
        <url>http://localhost:8080/geoserver/gwc/service/tms/1.0.0/worldmap%3A1_1_1@EPSG%3A4326@png/</url>
        </image>
</map>

Earth配置文件加载数据

<map name="example" type="geocentric" version="2">
  <options>
    <terrain 
             skirt_ratio              = "0.1"
             color                    = "#ffffffff"
             normalize_edges          = "false"
             incremental_update       = "true"
             quick_release_gl_objects = "true"
             min_tile_range_factor    = "4.0"
             cluster_culling          = "true"
             first_lod                = "0"
             min_filter               = "LINEAR"
             mag_filter               = "LINEAR"
             blend                    = "interpolate"
             lighting ="true"/>	 
			 
			  <!--Specify where to cache the data-->
        <cache type="filesystem">
            <path>e:\cache\earth</path>
        </cache>
  </options>  

   <image name="bing" driver="xyz">
        <url>http://v6o.cgt3d.cn:8054/{z}/{x}/{y}.jpg</url>
        <profile>spherical-mercator</profile>
   </image>


   <image name="googlelable" driver="tms">
        <url>http://v6o.cgt3d.cn:8055/tms.xml</url>
		<min_level>0</min_level>
        <max_level>8</max_level>
   </image>
    <image name="hezelable" driver="tms">
        <url>http://v6o.cgt3d.cn:8056/tms.xml</url>
		<min_level>9</min_level>
        <max_level>17</max_level>
   </image>


  <model name="chengwu" driver="simple" cache_enabled="false" max_range="10000" min_range="1">
        <url>http://iis.cgt3d.cn/ChemIncPark/chengwu/OSGB/data.osgb </url>
		<cache_policy usage="no_cache"/>
        <location>115.913867 35.0219822 -0</location>
  </model>
    
    <viewpoints>
        <viewpoint name="ChengWu Chemical Park" lat="35.0219822" long="115.913713" pitch="-60" range="6000"/>    
    </viewpoints>

</map>

关键代码

添加图层到map

using namespace osgEarth;
using namespace osgEarth::Drivers;

#include <osgEarth/Map>
#include <osgEarth/MapNode>
#include <osgEarthDrivers/tms/TMSOptions>
#include <osgEarthDrivers/gdal/GDALOptions>

using namespace osgEarth;
using namespace osgEarth::Drivers;
...

// Create a Map and set it to Geocentric to display a globe
Map* map = new Map();

// Add an imagery layer (blue marble from a TMS source)
{
    TMSOptions tms;
    tms.url() = "http://labs.metacarta.com/wms-c/Basic.py/1.0.0/satellite/";
    ImageLayer* layer = new ImageLayer( "NASA", tms );
    map->addImageLayer( layer );
}

// Add an elevationlayer (SRTM from a local GeoTiff file)
{
    GDALOptions gdal;
    gdal.url() = "c:/data/srtm.tif";
    ElevationLayer* layer = new ElevationLayer( "SRTM", gdal );
    map->addElevationLayer( layer );
}

// Create a MapNode to render this map:
MapNode* mapNode = new MapNode( map );
...

viewer->setSceneData( mapNode );


加入天空盒和光照效果

osgEarth::DateTime dateTime(2019, 5, 8, 9);
osgEarth::Util::Ephemeris* ephemeris = new osgEarth::Util::Ephemeris;
 
osgEarth::Util::SkyNode* m_pSkyNode = osgEarth::Util::SkyNode::create(mapNode);
m_pSkyNode->setName("SkyNode");
m_pSkyNode->setEphemeris(ephemeris);
m_pSkyNode->setDateTime(dateTime);
m_pSkyNode->attach(viewer, 0);
m_pSkyNode->setLighting(true);
m_pSkyNode->addChild(mapNode);
root->addChild(m_pSkyNode);

文件及文件夹操作

osgDB操作

//osgDB\FileUtils.h
//新建目录
extern bool makeDirectory(const std::string &directiryPath);

//判断一个文件路径是否存在
extern bool fileExists(const std::string &fileName);

//获取一个目录下的文件列表
typedef std::vector<std::string> DirectoryContents;
extern DirectoryContents getDirectoryContents(const std::string &dirName);

//判断一个filename是文件还是目录
enum FileType{ FILE_NOT_FOUND, REGULAR_FILE, DIRECTORY};
extern FileType fileType(const std::string& filename);

osgEarthXML操作

//读取XML文档,osgEarth/XmlUtils
osgEarth::XmlDocument* doc=new osgEarth::XmlDocument::load(const std::string &xmlfile);
osgEarth::Config docConfig=doc->getConfig();
if(!config.empty())
{
     std::string name=config.value("name");
     int age=config.value<int>("age",0);

     ///需要注意的是key字符串必须都是小写,例如源XML中为MySet标签,只能写config.find("myset");不能写config.find("MySet");
     osgEarth::Config* mySet=config.find("myset");
     if(config.hasChild("child1"))
        osgEarth::Config child=config.child("child1");
}