第二节:地形影像加载


地形影像数据加载是指将数字高程模型(DEM)和数字正射影像图(DOM)加载到场景中作为底图数据展示。CooRun SDK支持原始数据以及切割后的切片数据加载。

主要包括添加(创建)、定位、显隐和删除4种操作。

对于地形影像数据,需要配置数据路径、数据的坐标参考以及数据的显示范围等等。有时候这些参数获取比较麻烦,为了方便使用,SDK提供了数据源对象来自动获取相应的配置信息,这样可以节省很多参数配置。由于不同数据源能获取到的配置信息有所不同,下面将在每个数据源中去介绍数据源对象的配置及使用。

下图是地形影像加载效果:

  

切片数据图层配置信息获取

已切片的地形影像数据源获取,需要配置数据源路径,然后从数据源对象中获取相应的配置信息,代码如下:

Javascript调用

var dataType = "mtd";//数据源类型,本地mtd,服务mtds
var dataSourceOptions = map.CreateDataSourceOptions(dataType);//创建数据源配置对象,名称必须与数据源名称匹配
dataSourceOptions.AddConfig("Url", url);//数据源路径
var dataSource = map.CreateDataSource(dataSourceOptions);//创建数据源对象
var count = dataSource.GetLayerCount();//获取数据源包含图层数量
if(count == 0){
    alert("没有找到服务数据配置");
    return null;
}
//获取数据源图层配置项
var Url = dataSource.GetLayerInfo(0, "Url");//数据路径
var Format = dataSource.GetLayerInfo(0, "Format");//切割形成的数据格式
var Srs = dataSource.GetLayerInfo(0, "Srs");//数据的坐标参考
var MaxX = dataSource.GetLayerInfo(0, "MaxX");//数据的范围X向最大值
var MinX = dataSource.GetLayerInfo(0, "MinX");//数据的范围X向最小值
var MaxY = dataSource.GetLayerInfo(0, "MaxY");//数据的范围Y向最大值
var MinY = dataSource.GetLayerInfo(0, "MinY");//数据的范围Y向最小值
var TileSize = dataSource.GetLayerInfo(0, "TileSize")  || "256";//切割数据的瓦片大小,最大为256,建议使用切割的大小设置,否则会影响效率
var MinLevel = dataSource.GetLayerInfo(0, "MinLevel");//数据显示的最小层级
var MaxLevel = dataSource.GetLayerInfo(0, "MaxLevel") || "10";//数据显示的最大层级

C++调用

std::string dataType="mtd";//数据源类型,本地mtd,服务mtds
ConfigOptionsCOMLib::IDataSourceOptionsPtr dataSourceOptions = map->CreateDataSourceOptions(dataType.c_str());//创建数据源配置对象,名称必须与数据源名称匹配
dataSourceOptions->AddConfig("Url",url.c_str());//数据源路径
BaseObjectCOMLib::IDataSourceObjectPtr dataSource=map->CreateDataSource(dataSourceOptions);//创建数据源对象
long count =dataSource->GetLayerCount();//获取数据源包含图层数量
if(count == 0)
{
    return NULL;
}
//获取数据源图层配置项
std::string Url = dataSource->GetLayerInfo(0, "Url");//数据路径
std::string Format = dataSource->GetLayerInfo(0, "Format");//切割形成的数据格式
std::string Srs = dataSource->GetLayerInfo(0, "Srs");//数据的坐标参考
std::string MaxX = dataSource->GetLayerInfo(0, "MaxX");//数据的范围X向最大值
std::string MinX = dataSource->GetLayerInfo(0, "MinX");//数据的范围X向最小值
std::string MaxY = dataSource->GetLayerInfo(0, "MaxY");//数据的范围Y向最大值
std::string MinY = dataSource->GetLayerInfo(0, "MinY");//数据的范围Y向最小值
std::string TileSize="256";
TileSize = dataSource->GetLayerInfo(0, "TileSize");//切割数据的瓦片大小,最大为256,建议使用切割的大小设置,否则会影响效率
std::string MinLevel = dataSource->GetLayerInfo(0, "MinLevel");//数据显示的最小层级
std::string MaxLevel="10";
MaxLevel = dataSource->GetLayerInfo(0, "MaxLevel");//数据显示的最大层级

C#调用

string dataType = "mtd";//数据源类型,本地mtd,服务mtds
var dataSourceOptions = map.CreateDataSourceOptions(dataType);//创建数据源配置对象,名称必须与数据源名称匹配
dataSourceOptions.AddConfig("Url", url);//数据源路径
var dataSource = map.CreateDataSource(dataSourceOptions);//创建数据源对象
int count = dataSource.GetLayerCount();//获取数据源包含图层数量
if(count == 0){
    MessageBox.Show("没有找到服务数据配置");
    return null;
}
//获取数据源图层配置项
string Url = dataSource.GetLayerInfo(0, "Url");//数据路径
string Format = dataSource.GetLayerInfo(0, "Format");//切割形成的数据格式
string Srs = dataSource.GetLayerInfo(0, "Srs");//数据的坐标参考
string MaxX = dataSource.GetLayerInfo(0, "MaxX");//数据的范围X向最大值
string MinX = dataSource.GetLayerInfo(0, "MinX");//数据的范围X向最小值
string MaxY = dataSource.GetLayerInfo(0, "MaxY");//数据的范围Y向最大值
string MinY = dataSource.GetLayerInfo(0, "MinY");//数据的范围Y向最小值
string TileSize = "256";
TileSize = dataSource.GetLayerInfo(0, "TileSize");//切割数据的瓦片大小,最大为256,建议使用切割的大小设置,否则会影响效率
string MinLevel = dataSource.GetLayerInfo(0, "MinLevel");//数据显示的最小层级
string MaxLevel = "10";
MaxLevel = dataSource.GetLayerInfo(0, "MaxLevel");//数据显示的最大层级

切片影像加载

加载切片影像时,可以使用上面的数据源对象获取相应的参数信息,也可以从数据里的tms.xml中读取相应的配置。

切片影像参数说明

切片影像加载可配置的参数如下表所示:

配置项 配置说明 值类型 备注
LayerOptionsName 图层配置对象名称 string ImageLayerOptions 代表影像图层配置对象
DataSourceTypeName 数据源类型 string 本地数据需配置为mtd,服务数据需配置为mtds
Url 数据访问路径 string 数据的层级目录
Driver 驱动名称 string terrainquadtree 代表地形驱动,该值不可更改
Format 数据格式 string 数据目录下的tms.xml中的tileformat 标签里的mime-type的值
Srs 数据坐标参考 string 数据目录下的tms.xml中的srs标签的值
TileSize 切割数据的瓦片大小 int 数据目录下的tms.xml中的tileformat标签中的height值
MaxX 数据范围x向最大值 double 数据目录下的tms.xml 中的boundingbox标签中maxx值
MinX 数据范围X向最小值 double 数据目录下的tms.xml 中的boundingbox标签中minx值
MaxY 数据范围Y向最大值 double 数据目录下的tms.xml 中的boundingbox标签中maxy值
MinY 数据范围Y向最小值 double 数据目录下的tms.xml 中的boundingbox标签中miny值
MinLevel 数据显示的最小层级 int 数据目录下tms.xml 中的tileset的最小值
MaxLevel 数据显示的最大层级 int 数据目录下tms.xml 中的tileset的最大值

代码调用示例

Javascript调用

var domLayer = null;
var bDomVisible = true;
var gDomPath = "http://192.168.1.50:8088/files/HZDOM2/Terrain/DOM/tms.xml";
//创建影像(切割)图层
function createDomLayer(){
    if(domLayer == null){
        domLayer = loadDomLayer(gDomPath, true);
    }else{
        alert("请勿重复创建影像图层!");
    }
}

//显隐影像(切割)图层
function visibleDomLayer(){
    if(domLayer){
        domLayer.SetVisible(bDomVisible = !bDomVisible);//显隐图层
    }else{
        alert("无影像图层,无法显隐!");
    }
}

//定位影像(切割)图层
function locateDomLayer(){
    if(domLayer){
        domLayer.Locate();//定位图层
    }else{
        alert("无影像图层,无法定位!");
    }
}

//删除影像(切割)图层
function removeDomLayer(){
    if(domLayer){
        map.RemoveLayer(domLayer);//删除图层
        domLayer = null;
        bDomVisible = true;
    }else{
        alert("无影像图层,无需移除!");
    }
}

//加载影像(切割)图层
function loadDomLayer(url, isLocate){
    var dataType = "mtd";//数据源类型
    if(url.indexOf('http') == -1){
        dataType = "mtd";//本地地形影像
    }else{
        dataType = "mtds";//服务地形影像
    }
    var dataSourceOptions = map.CreateDataSourceOptions(dataType);//创建数据源配置对象,名称必须与数据源名称匹配
    dataSourceOptions.AddConfig("Url", url);//数据源路径
    var dataSource = map.CreateDataSource(dataSourceOptions);//创建数据源对象
    var count = dataSource.GetLayerCount();//获取数据源包含图层数量
    if(count == 0){
        alert("没有找到服务数据配置");
        return null;
    }
    //获取数据源图层配置项
    var Url = dataSource.GetLayerInfo(0, "Url");//数据路径
    var Format = dataSource.GetLayerInfo(0, "Format");//切割形成的数据格式
    var Srs = dataSource.GetLayerInfo(0, "Srs");//数据的坐标参考
    var MaxX = dataSource.GetLayerInfo(0, "MaxX");//数据的范围X向最大值
    var MinX = dataSource.GetLayerInfo(0, "MinX");//数据的范围X向最小值
    var MaxY = dataSource.GetLayerInfo(0, "MaxY");//数据的范围Y向最大值
    var MinY = dataSource.GetLayerInfo(0, "MinY");//数据的范围Y向最小值
    var TileSize = dataSource.GetLayerInfo(0, "TileSize")  || "256";//切割数据的瓦片大小,最大为256,建议使用切割的大小设置,否则会影响效率
    var MinLevel = dataSource.GetLayerInfo(0, "MinLevel");//数据显示的最小层级
    var MaxLevel = dataSource.GetLayerInfo(0, "MaxLevel") || "10";//数据显示的最大层级

    var tlo = map.CreateLayerOptions("domlayer");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "ImageLayerOptions"); //图层配置对象名称, ImageLayerOptions代表影像图层配置对象
    tlo.AddConfig("DataSourceTypeName", dataType);//数据源类型
    tlo.AddConfig("Driver", "terrainquadtree");//驱动名称,terrainquadtree代表地形驱动
    tlo.AddConfig("Url", Url);//数据路径
    tlo.AddConfig("Format", Format);//数据格式
    tlo.AddConfig("Srs", Srs);//数据的坐标参考
    tlo.AddConfig("MaxX", MaxX);//数据的范围X向最大值
    tlo.AddConfig("MinX", MinX);//数据的范围X向最小值
    tlo.AddConfig("MaxY", MaxY);//数据的范围Y向最大值
    tlo.AddConfig("MinY", MinY);//数据的范围Y向最小值
    tlo.AddConfig("TileSize", TileSize);//切割数据的瓦片大小
    tlo.AddConfig("MinLevel", MinLevel);//数据显示的最小层级
    tlo.AddConfig("MaxLevel", MaxLevel);//数据显示的最大层级
    var domlayer = map.CreateLayer("ImageLayer", tlo);//创建影像图层,第一项参数必须为ImageLayer
    map.AddLayer(domlayer);//添加影像图层
    if(isLocate){
        domlayer.Locate();//图层定位
    }
    return domlayer;
}

C++调用

BaseObjectCOMLib::ILayerObjectPtr domLayer;//影像(切割)图层
std::string gDomPath = "http://192.168.1.50:8088/files/HZDOM2/Terrain/DOM/tms.xml";
//创建影像(切割)图层
void Cf0c1DEMDOMDlg::OnBnClickedcreatedomlayer()
{
    //如果影像(切割)图层存在
    if(domLayer)
    {
        return;
    }
    char temp_status[MAX_PATH];
    GetPrivateProfileStringA("Path", "DomPath", "", temp_status, MAX_PATH, mIniPath.c_str());
    std::string DomPath(temp_status);
    domLayer = loadDomLayer(DomPath, true);//加载影像(切割)图层
}

//显隐影像(切割)图层
void Cf0c1DEMDOMDlg::OnBnClickedvisibledomlayer()
{
    //如果影像(切割)图层为空
    if(!domLayer)
    {
        return;
    }
    static bool domVisble = true;
    domLayer->SetVisible(domVisble = !domVisble); //显隐影像(切割)图层
}

//定位影像(切割)图层
void Cf0c1DEMDOMDlg::OnBnClickedlocatedomlayer()
{
    //如果影像(切割)图层为空
    if(!domLayer)
    {
        return;
    }
    domLayer->Locate();//定位图层
}

//删除影像(切割)图层
void Cf0c1DEMDOMDlg::OnBnClickedremovedomlayer()
{
    //如果影像(切割)图层为空
    if(!domLayer)
    {
        return;
    }
    map->RemoveLayer(domLayer);//删除图层
    domLayer = NULL;
}

//加载影像(切割)图层
BaseObjectCOMLib::ILayerObjectPtr Cf0c1DEMDOMDlg::loadDomLayer(std::string url,BOOL isLocate)
{
    std::string dataType="mtds";
    //判断是否网络加载
    if(!url.find("http"))
    {
        dataType = "mtds";//数据源类型,服务地形影像
    }
    else
    {
        dataType = "mtd";//数据源类型,本地地形影像
    }
    ConfigOptionsCOMLib::IDataSourceOptionsPtr dataSourceOptions = map->CreateDataSourceOptions(dataType.c_str());//创建数据源配置对象,名称必须与数据源名称匹配
    dataSourceOptions->AddConfig("Url",url.c_str());//数据源路径
    BaseObjectCOMLib::IDataSourceObjectPtr dataSource=map->CreateDataSource(dataSourceOptions);//创建数据源对象
    long count =dataSource->GetLayerCount();//获取数据源包含图层数量
    if(count == 0)
    {
        return NULL;
    }
    //获取数据源图层配置项
    std::string Url = dataSource->GetLayerInfo(0, "Url");//数据路径
    std::string Format = dataSource->GetLayerInfo(0, "Format");//切割形成的数据格式
    std::string Srs = dataSource->GetLayerInfo(0, "Srs");//数据的坐标参考
    std::string MaxX = dataSource->GetLayerInfo(0, "MaxX");//数据的范围X向最大值
    std::string MinX = dataSource->GetLayerInfo(0, "MinX");//数据的范围X向最小值
    std::string MaxY = dataSource->GetLayerInfo(0, "MaxY");//数据的范围Y向最大值
    std::string MinY = dataSource->GetLayerInfo(0, "MinY");//数据的范围Y向最小值
    std::string TileSize="256";
    TileSize = dataSource->GetLayerInfo(0, "TileSize");//切割数据的瓦片大小,最大为256,建议使用切割的大小设置,否则会影响效率
    std::string MinLevel = dataSource->GetLayerInfo(0, "MinLevel");//数据显示的最小层级
    std::string MaxLevel="10";
    MaxLevel = dataSource->GetLayerInfo(0, "MaxLevel");//数据显示的最大层级
    ConfigOptionsCOMLib::ILayerOptionsPtr tlo = (ConfigOptionsCOMLib::ILayerOptionsPtr)map->CreateLayerOptions("domlayer"); // 创建图层配置对象,给配置起个名称,任意名称
    tlo->AddConfig("LayerOptionsName", "ImageLayerOptions"); //图层配置对象名称, ImageLayerOptions代表影像图层配置对象
    tlo->AddConfig("DataSourceTypeName", dataType.c_str());//数据源类型
    tlo->AddConfig("Driver", "terrainquadtree");//驱动名称,terrainquadtree代表地形驱动
    tlo->AddConfig("Url", Url.c_str());//数据路径
    tlo->AddConfig("Format", Format.c_str());//数据格式
    tlo->AddConfig("Srs", Srs.c_str());//数据的坐标参考
    tlo->AddConfig("MaxX", MaxX.c_str());//数据的范围X向最大值
    tlo->AddConfig("MinX", MinX.c_str());//数据的范围X向最小值
    tlo->AddConfig("MaxY", MaxY.c_str());//数据的范围Y向最大值
    tlo->AddConfig("MinY", MinY.c_str());//数据的范围Y向最小值
    tlo->AddConfig("TileSize", TileSize.c_str());//切割数据的瓦片大小
    tlo->AddConfig("MinLevel", MinLevel.c_str());//数据显示的最小层级
    tlo->AddConfig("MaxLevel", MaxLevel.c_str());//数据显示的最大层级
    BaseObjectCOMLib::ILayerObjectPtr domLayer= map->CreateLayer("ImageLayer", tlo);//创建影像图层,第一项参数必须为ImageLayer
    map->AddLayer(domLayer);//添加影像图层
    if(isLocate){
        domLayer->Locate();//图层定位
    }
    return domLayer;
}

C#调用

ILayerObject domLayer;//影像图层(切割)
bool bDomVisible = true;//影像图层(切割)显隐控制
string gDomPath = "http://192.168.1.50:8088/files/HZDOM2/Terrain/DOM/tms.xml"; 
//创建影像切割图层
private void createDomLayer_Click(object sender, EventArgs e)
{
    if(domLayer == null){
        domLayer = loadDomLayer(gDomPath, true);
    }else{
        MessageBox.Show("请勿重复创建影像图层!");
    }
}

//显隐影像切割图层
private void visibleDomLayer_Click(object sender, EventArgs e)
{
    if (domLayer !=null)
    {
        domLayer.SetVisible(bDomVisible = !bDomVisible);//显隐图层
    }
}

//定位影像(切割)图层
private void locateDomLayer_Click(object sender, EventArgs e)
{
    if (domLayer != null)
    {
        domLayer.Locate();//定位图层
    }
}

//删除影像(切割)图层
private void removeDomLayer_Click(object sender, EventArgs e)
{
    if (domLayer != null)
    {
        map.RemoveLayer(domLayer);//删除图层
        domLayer = null;
        bDomVisible = true;
    }
}

//加载切割影像图层
private ILayerObject loadDomLayer(string url, bool isLocate)
{
    string dataType = "mtd";//数据源类型
    if(url.IndexOf("http") == -1){
        dataType = "mtd";//本地地形影像
    }else{
        dataType = "mtds";//服务地形影像
    }
    var dataSourceOptions = map.CreateDataSourceOptions(dataType);//创建数据源配置对象,名称必须与数据源名称匹配
    dataSourceOptions.AddConfig("Url", url);//数据源路径
    var dataSource = map.CreateDataSource(dataSourceOptions);//创建数据源对象
    int count = dataSource.GetLayerCount();//获取数据源包含图层数量
    if(count == 0){
        MessageBox.Show("没有找到服务数据配置");
        return null;
    }
    //获取数据源图层配置项
    string Url = dataSource.GetLayerInfo(0, "Url");//数据路径
    string Format = dataSource.GetLayerInfo(0, "Format");//切割形成的数据格式
    string Srs = dataSource.GetLayerInfo(0, "Srs");//数据的坐标参考
    string MaxX = dataSource.GetLayerInfo(0, "MaxX");//数据的范围X向最大值
    string MinX = dataSource.GetLayerInfo(0, "MinX");//数据的范围X向最小值
    string MaxY = dataSource.GetLayerInfo(0, "MaxY");//数据的范围Y向最大值
    string MinY = dataSource.GetLayerInfo(0, "MinY");//数据的范围Y向最小值
    string TileSize = "256";
    TileSize = dataSource.GetLayerInfo(0, "TileSize");//切割数据的瓦片大小,最大为256,建议使用切割的大小设置,否则会影响效率
    string MinLevel = dataSource.GetLayerInfo(0, "MinLevel");//数据显示的最小层级
    string MaxLevel = "10";
    MaxLevel = dataSource.GetLayerInfo(0, "MaxLevel");//数据显示的最大层级

    var tlo = map.CreateLayerOptions("domlayer");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "ImageLayerOptions"); //图层配置对象名称, ImageLayerOptions代表影像图层配置对象
    tlo.AddConfig("DataSourceTypeName", dataType);//数据源类型
    tlo.AddConfig("Driver", "terrainquadtree");//驱动名称,terrainquadtree代表地形驱动
    tlo.AddConfig("Url", Url);//数据路径
    tlo.AddConfig("Format", Format);//数据格式
    tlo.AddConfig("Srs", Srs);//数据的坐标参考
    tlo.AddConfig("MaxX", MaxX);//数据的范围X向最大值
    tlo.AddConfig("MinX", MinX);//数据的范围X向最小值
    tlo.AddConfig("MaxY", MaxY);//数据的范围Y向最大值
    tlo.AddConfig("MinY", MinY);//数据的范围Y向最小值
    tlo.AddConfig("TileSize", TileSize);//切割数据的瓦片大小
    tlo.AddConfig("MinLevel", MinLevel);//数据显示的最小层级
    tlo.AddConfig("MaxLevel", MaxLevel);//数据显示的最大层级
    var domlayer = map.CreateLayer("ImageLayer", tlo);//创建影像图层,第一项参数必须为ImageLayer
    map.AddLayer(domlayer);//添加影像图层
    if(isLocate){
        domlayer.Locate();//图层定位
    }
    return domlayer;
}

切片地形加载

加载切片地形数据时,可以使用数据源对象获取相应的参数信息,也可以从数据里的tms.xml中读取相应的配置。通过数据源获取方式可见:切片数据图层配置信息获取

切片地形参数说明

切片地形加载可配置的参数如下表所示:

配置项 配置说明 值类型 备注
LayerOptionsName 图层配置对象名称 string ElevationLayerOptions 代表地形图层配置对象
DataSourceTypeName 数据源类型 string 本地数据需配置为mtd,服务数据需配置为mtds
Url 数据访问路径 string 数据的层级目录
Driver 驱动名称 string terrainquadtree 代表地形驱动,该值不可更改
Format 数据格式 string 数据目录下的tms.xml中的tileformat 标签里的mime-type的值
Srs 数据坐标参考 string 数据目录下的tms.xml中的srs标签的值
TileSize 切割数据的瓦片大小 int 数据目录下的tms.xml中的tileformat标签中的height值
MaxX 数据范围x向最大值 double 数据目录下的tms.xml 中的boundingbox标签中maxx值
MinX 数据范围X向最小值 double 数据目录下的tms.xml 中的boundingbox标签中minx值
MaxY 数据范围Y向最大值 double 数据目录下的tms.xml 中的boundingbox标签中maxy值
MinY 数据范围Y向最小值 double 数据目录下的tms.xml 中的boundingbox标签中miny值
MinLevel 数据显示的最小层级 int 数据目录下tms.xml 中的tileset的最小值
MaxLevel 数据显示的最大层级 int 数据目录下tms.xml 中的tileset的最大值

代码调用示例

Javascript调用

var demLayer = null;
var bDemVisible = true; 
var gDemPath = "http://192.168.1.50:8088/files/HZDOM2/Terrain/DEM/tms.xml";
//创建地形高程(切割)图层
function createDemLayer(){
    if(demLayer == null){
        demLayer = loadDemLayer(gDemPath, false);
    }else{
        alert("请勿重复创建地形高程图层!");
    }
}

//显隐地形高程(切割)图层
function visibleDemLayer(){
    if(demLayer){
        demLayer.SetVisible(bDemVisible = !bDemVisible);//显隐图层
    }else{
        alert("无地形高程图层,无法显隐!");
    }
}

//定位地形高程(切割)图层
function locateDemLayer(){
    if(demLayer){
        demLayer.Locate();//定位图层
    }else{
        alert("无地形高程图层,无法定位!");
    }
}

//删除地形高程(切割)图层
function removeDemLayer(){
    if(demLayer){
        map.RemoveLayer(demLayer);//删除图层
        demLayer = null;
        bDemVisible = true;
    }else{
        alert("无地形高程图层,无需移除!");
    }
}

//加载地形(切割)图层
function loadDemLayer(url, isLocate){
    var dataType = "mtd";//数据源类型
    if(url.indexOf('http') == -1){
        dataType = "mtd";//本地地形影像
    }else{
        dataType = "mtds";//服务地形影像
    }
    var dataSourceOptions = map.CreateDataSourceOptions(dataType);//创建数据源配置对象,名称必须与数据源名称匹配
    dataSourceOptions.AddConfig("Url", url);//数据源路径
    var dataSource = map.CreateDataSource(dataSourceOptions);//创建数据源对象
    var count = dataSource.GetLayerCount();//获取数据源包含图层数量
    if(count == 0){
        alert("没有找到服务数据配置");
        return null;
    }
    //获取数据源图层配置项
    var Url = dataSource.GetLayerInfo(0, "Url");//数据路径
    var Format = dataSource.GetLayerInfo(0, "Format");//切割形成的数据格式
    var Srs = dataSource.GetLayerInfo(0, "Srs");//数据的坐标参考
    var MaxX = dataSource.GetLayerInfo(0, "MaxX");//数据的范围X向最大值
    var MinX = dataSource.GetLayerInfo(0, "MinX");//数据的范围X向最小值
    var MaxY = dataSource.GetLayerInfo(0, "MaxY");//数据的范围Y向最大值
    var MinY = dataSource.GetLayerInfo(0, "MinY");//数据的范围Y向最小值
    var TileSize = dataSource.GetLayerInfo(0, "TileSize")  || "16";//切割数据的瓦片大小,最大为16,建议使用切割的大小设置,否则会影响效率
    var MinLevel = dataSource.GetLayerInfo(0, "MinLevel");//数据显示的最小层级
    var MaxLevel = dataSource.GetLayerInfo(0, "MaxLevel") || "10";//数据显示的最大层级
    var tlo = map.CreateLayerOptions("demlayer");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "ElevationLayerOptions"); //图层配置对象名称, ElevationLayerOptions代表地形图层配置
    tlo.AddConfig("DataSourceTypeName", dataType);//数据源类型
     tlo.AddConfig("Driver", "terrainquadtree");//驱动名称,terrainquadtree代表地形驱动
    tlo.AddConfig("Url", Url);//数据路径
    tlo.AddConfig("Format", Format);//数据格式
    tlo.AddConfig("Srs", Srs);//数据的坐标参考
    tlo.AddConfig("MaxX", MaxX);//数据的范围X向最大值
    tlo.AddConfig("MinX", MinX);//数据的范围X向最小值
    tlo.AddConfig("MaxY", MaxY);//数据的范围Y向最大值
    tlo.AddConfig("MinY", MinY);//数据的范围Y向最小值
    tlo.AddConfig("TileSize", TileSize);//切割数据的瓦片大小
    tlo.AddConfig("MinLevel", MinLevel);//数据显示的最小层级
    tlo.AddConfig("MaxLevel", MaxLevel);//数据显示的最大层级
    var demlayer = map.CreateLayer("ElevationLayer", tlo);//创建地形图层,第一项参数必须为ElevationLayer
    map.AddLayer(demlayer);//添加地形图层
    if(isLocate){
        demlayer.Locate();//图层定位
    }
    return demlayer;
}

C++调用

BaseObjectCOMLib::ILayerObjectPtr demLayer;//地形(切割)图层对象
std::string gDemPath = "http://192.168.1.50:8088/files/HZDEM2/Terrain/DEM/tms.xml";
//创建地形高程(切割)图层
void Cf0c1DEMDOMDlg::OnBnClickedcreatedemlayer()
{
    if(demLayer)//如果地形高程(切割)图层不为空
    {
        return;
    }
    char temp_status[MAX_PATH];
    GetPrivateProfileStringA("Path", "DemPath", "", temp_status, MAX_PATH, mIniPath.c_str());
    std::string DemPath(temp_status);
    demLayer = loadDemLayer(DemPath, false);
}

//显隐地形高程(切割)图层
void Cf0c1DEMDOMDlg::OnBnClickedvisibledemlayer()
{
    if(!demLayer)//如果地形高程(切割)图层为空
    {
        return;
    }
    static bool demVisble = true;
    demLayer->SetVisible(demVisble = !demVisble); //显隐地形高程(切割)图层
}

//定位地形高程(切割)图层
void Cf0c1DEMDOMDlg::OnBnClickedlocatedemlayer()
{
    if(!demLayer)//如果地形高程(切割)图层为空
    {
        return;
    }
    demLayer->Locate();//定位图层
}

//删除地形高程(切割)图层
void Cf0c1DEMDOMDlg::OnBnClickedremovedemlayer()
{
    if(!demLayer)//如果地形高程(切割)图层为空
    {
        return;
    }
    map->RemoveLayer(demLayer);//删除图层
    demLayer = NULL;
}

//加载地形高程(切割)图层
BaseObjectCOMLib::ILayerObjectPtr Cf0c1DEMDOMDlg::loadDemLayer(std::string url,BOOL isLocate){
    std::string dataType="mtd";
    if(!url.find("http"))//判断是否网络加载
    {
        dataType = "mtds";//数据源类型,服务地形影像
    }
    else
    {
        dataType = "mtd";//数据源类型,本地地形影像
    }
    ConfigOptionsCOMLib::IDataSourceOptionsPtr dataSourceOptions = map->CreateDataSourceOptions(dataType.c_str());//创建数据源配置对象,名称必须与数据源名称匹配
    dataSourceOptions->AddConfig("Url",url.c_str());//数据源路径
    BaseObjectCOMLib::IDataSourceObjectPtr dataSource=map->CreateDataSource(dataSourceOptions);//创建数据源对象
    long count =dataSource->GetLayerCount();//获取数据源包含图层数量
    if(count == 0){
        return NULL;
    }
    //获取数据源图层配置项
    std::string Url = dataSource->GetLayerInfo(0, "Url");//数据路径
    std::string Format = dataSource->GetLayerInfo(0, "Format");//切割形成的数据格式
    std::string Srs = dataSource->GetLayerInfo(0, "Srs");//数据的坐标参考
    std::string MaxX = dataSource->GetLayerInfo(0, "MaxX");//数据的范围X向最大值
    std::string MinX = dataSource->GetLayerInfo(0, "MinX");//数据的范围X向最小值
    std::string MaxY = dataSource->GetLayerInfo(0, "MaxY");//数据的范围Y向最大值
    std::string MinY = dataSource->GetLayerInfo(0, "MinY");//数据的范围Y向最小值
    std::string TileSize="16";
    TileSize = dataSource->GetLayerInfo(0, "TileSize");//切割数据的瓦片大小,最大为256,建议使用切割的大小设置,否则会影响效率
    std::string MinLevel = dataSource->GetLayerInfo(0, "MinLevel");//数据显示的最小层级
    std::string MaxLevel="10";
    MaxLevel = dataSource->GetLayerInfo(0, "MaxLevel");//数据显示的最大层级
    ConfigOptionsCOMLib::ILayerOptionsPtr tlo = (ConfigOptionsCOMLib::ILayerOptionsPtr)map->CreateLayerOptions("demlayer"); // 创建图层配置对象,给配置起个名称,任意名称
    tlo->AddConfig("LayerOptionsName", "ElevationLayerOptions"); //图层配置对象名称, ElevationLayerOptions代表地形图层配置
    tlo->AddConfig("DataSourceTypeName", dataType.c_str());//数据源类型
    tlo->AddConfig("Driver", "terrainquadtree");//驱动名称,terrainquadtree代表地形驱动
    tlo->AddConfig("Url", Url.c_str());//数据路径
    tlo->AddConfig("Format", Format.c_str());//数据格式
    tlo->AddConfig("Srs", Srs.c_str());//数据的坐标参考
    tlo->AddConfig("MaxX", MaxX.c_str());//数据的范围X向最大值
    tlo->AddConfig("MinX", MinX.c_str());//数据的范围X向最小值
    tlo->AddConfig("MaxY", MaxY.c_str());//数据的范围Y向最大值
    tlo->AddConfig("MinY", MinY.c_str());//数据的范围Y向最小值
    tlo->AddConfig("TileSize", TileSize.c_str());//切割数据的瓦片大小
    tlo->AddConfig("MinLevel", MinLevel.c_str());//数据显示的最小层级
    tlo->AddConfig("MaxLevel", MaxLevel.c_str());//数据显示的最大层级
    BaseObjectCOMLib::ILayerObjectPtr demlayer= map->CreateLayer("ElevationLayer", tlo);//创建DEM图层,第一项参数必须为ImageLayer
    map->AddLayer(demlayer);//添加地形图层
    if(isLocate){
        demlayer->Locate();//图层定位
    }
    return demlayer;
}

C#调用

ILayerObject demLayer;//地形图层(切割)
bool bDemVisible = true;//地形图层(切割)显隐控制
string gDemPath = "http://192.168.1.50:8088/files/HZDOM2/Terrain/DEM/tms.xml";
//创建地形高程(切割)图层
private void createDemLayer_Click(object sender, EventArgs e)
{
    if (demLayer == null)
    {
        demLayer = loadDemLayer(gDemPath, false);
    }
    else
    {
        MessageBox.Show("请勿重复创建地形高程图层!");
    }
}

//显隐地形高程(切割)图层
private void visibleDemLayer_Click(object sender, EventArgs e)
{
    if (demLayer!=null)
    {
        demLayer.SetVisible(bDemVisible = !bDemVisible);//显隐图层
    }
}

//定位地形高程(切割)图层
private void locateDemLayer_Click(object sender, EventArgs e)
{
    if (demLayer != null)
    {
        demLayer.Locate();//定位图层
    }
}

//删除地形高程(切割)图层
private void removeDemLayer_Click(object sender, EventArgs e)
{
    if (demLayer != null)
    {
        map.RemoveLayer(demLayer);//删除图层
        demLayer = null;
        bDemVisible = true;
    }
}

//加载地形(切割)图层
private ILayerObject loadDemLayer(string url, bool isLocate){
    string dataType = "mtd";//数据源类型
    if(url.IndexOf("http") == -1){
        dataType = "mtd";//本地地形影像
    }else{
        dataType = "mtds";//服务地形影像
    }
    var dataSourceOptions = map.CreateDataSourceOptions(dataType);//创建数据源配置对象,名称必须与数据源名称匹配
    dataSourceOptions.AddConfig("Url", url);//数据源路径
    var dataSource = map.CreateDataSource(dataSourceOptions);//创建数据源对象
    var count = dataSource.GetLayerCount();//获取数据源包含图层数量
    if(count == 0){
        MessageBox.Show("没有找到服务数据配置");
        return null;
    }
    //获取数据源图层配置项
    string Url = dataSource.GetLayerInfo(0, "Url");//数据路径
    string Format = dataSource.GetLayerInfo(0, "Format");//切割形成的数据格式
    string Srs = dataSource.GetLayerInfo(0, "Srs");//数据的坐标参考
    string MaxX = dataSource.GetLayerInfo(0, "MaxX");//数据的范围X向最大值
    string MinX = dataSource.GetLayerInfo(0, "MinX");//数据的范围X向最小值
    string MaxY = dataSource.GetLayerInfo(0, "MaxY");//数据的范围Y向最大值
    string MinY = dataSource.GetLayerInfo(0, "MinY");//数据的范围Y向最小值
    string TileSize = "16";
    TileSize = dataSource.GetLayerInfo(0, "TileSize");//切割数据的瓦片大小,最大为16,建议使用切割的大小设置,否则会影响效率
    string MinLevel = dataSource.GetLayerInfo(0, "MinLevel");//数据显示的最小层级
    string MaxLevel = "10";
    MaxLevel = dataSource.GetLayerInfo(0, "MaxLevel");//数据显示的最大层级

    var tlo = map.CreateLayerOptions("demlayer");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "ElevationLayerOptions"); //图层配置对象名称, ElevationLayerOptions代表地形图层配置
    tlo.AddConfig("DataSourceTypeName", dataType);//数据源类型
    tlo.AddConfig("Driver", "terrainquadtree");//驱动名称,terrainquadtree代表地形驱动
    tlo.AddConfig("Url", Url);//数据路径
    tlo.AddConfig("Format", Format);//数据格式
    tlo.AddConfig("Srs", Srs);//数据的坐标参考
    tlo.AddConfig("MaxX", MaxX);//数据的范围X向最大值
    tlo.AddConfig("MinX", MinX);//数据的范围X向最小值
    tlo.AddConfig("MaxY", MaxY);//数据的范围Y向最大值
    tlo.AddConfig("MinY", MinY);//数据的范围Y向最小值
    tlo.AddConfig("TileSize", TileSize);//切割数据的瓦片大小
    tlo.AddConfig("MinLevel", MinLevel);//数据显示的最小层级
    tlo.AddConfig("MaxLevel", MaxLevel);//数据显示的最大层级
    var demlayer = map.CreateLayer("ElevationLayer", tlo);//创建地形图层,第一项参数必须为ElevationLayer
    map.AddLayer(demlayer);//添加地形图层
    if(isLocate){
        demlayer.Locate();//图层定位
    }
    return demlayer;
}

原始地形影像图层配置信息获取

原始的地形影像数据源获取,需要配置数据源路径,然后从数据源对象中获取相应的配置信息,代码如下:

Javascript调用

var dataSourceOptions = map.CreateDataSourceOptions("gdal");//创建数据源配置项,名称必须与数据源类型匹配
dataSourceOptions.AddConfig("Url", url);//设置数据源配置路径
var dataSource = map.CreateDataSource(dataSourceOptions);//创建数据源
var count = dataSource.GetLayerCount();//获取数据源包含图层数量
if(count == 0){
    alert("没有找到服务数据配置");
    return null;
}
//获取数据源图层配置项
var Url = dataSource.GetLayerInfo(0, "Url");//要加载的数据路径
var Srs = dataSource.GetLayerInfo(0, "Srs");//数据的坐标参考
var MaxX = dataSource.GetLayerInfo(0, "MaxX");//数据的范围X向最大值
var MinX = dataSource.GetLayerInfo(0, "MinX");//数据的范围X向最小值
var MaxY = dataSource.GetLayerInfo(0, "MaxY");//数据的范围Y向最大值
var MinY = dataSource.GetLayerInfo(0, "MinY");//数据的范围Y向最小值

C++调用

ConfigOptionsCOMLib::IDataSourceOptionsPtr dataSourceOptions = map->CreateDataSourceOptions("gdal");//创建数据源配置对象,名称必须与数据源名称匹配
dataSourceOptions->AddConfig("Url",url.c_str());//数据源路径
BaseObjectCOMLib::IDataSourceObjectPtr dataSource=map->CreateDataSource(dataSourceOptions);//创建数据源对象
long count =dataSource->GetLayerCount();//获取数据源包含图层数量
if(count == 0){
    return NULL;
}
//获取数据源图层配置项
std::string Url = dataSource->GetLayerInfo(0, "Url");//数据路径
std::string Srs = dataSource->GetLayerInfo(0, "Srs");//数据的坐标参考
std::string MaxX = dataSource->GetLayerInfo(0, "MaxX");//数据的范围X向最大值
std::string MinX = dataSource->GetLayerInfo(0, "MinX");//数据的范围X向最小值
std::string MaxY = dataSource->GetLayerInfo(0, "MaxY");//数据的范围Y向最大值
std::string MinY = dataSource->GetLayerInfo(0, "MinY");//数据的范围Y向最小值
std::string TileSize="16";
TileSize = dataSource->GetLayerInfo(0, "TileSize");//切割数据的瓦片大小,最大为256,建议使用切割的大小设置,否则会影响效率

C#调用

IDataSourceOptions dataSourceOptions = map.CreateDataSourceOptions("gdal");//创建数据源配置项,名称必须与数据源类型匹配
dataSourceOptions.AddConfig("Url", gSrcDomPath);//设置数据源配置路径
IDataSourceObject dataSource = map.CreateDataSource(dataSourceOptions);//创建数据源
long count = dataSource.GetLayerCount();//获取数据源包含图层数量
if (count == 0)
{
    return;
}
//获取数据源图层配置项
string Url = dataSource.GetLayerInfo(0, "Url");//要加载的数据路径
string Srs = dataSource.GetLayerInfo(0, "Srs");//数据的坐标参考
string MaxX = dataSource.GetLayerInfo(0, "MaxX");//数据的范围X向最大值
string MinX = dataSource.GetLayerInfo(0, "MinX");//数据的范围X向最小值
string MaxY = dataSource.GetLayerInfo(0, "MaxY");//数据的范围Y向最大值
string MinY = dataSource.GetLayerInfo(0, "MinY");//数据的范围Y向最小值

原始影像加载

加载原始影像时,需要使用上面的数据源对象获取相应的参数信息。原始地形影像图层配置信息获取

原始影像参数说明

切片影像加载可配置的参数如下表所示:

配置项 配置说明 值类型 备注
LayerOptionsName 图层配置对象名称 string ImageLayerOptions 代表影像图层配置对象
DataSourceTypeName 数据源类型 string 原始数据必须配置为gdal
Url 数据访问路径 string 数据的真实路径
Driver 驱动名称 string terrainquadtree 代表地形驱动,该值不可更改
IsCreatePyramid 是否在加载时创建金字塔文件 bool 默认值false,如果构建需要一定等待时间
IsInterpolateImagery 是否变换影像成像方式 bool 默认值false
InterpolationMethod 差值方式 string INTER_CUBIC -- 立方插值:最耗时,比双线性插值边沿更平滑(IsInterpolateImagery必须设为true才生效)
INTERP_BILINEAR -- 双线性插值:较为平滑,耗时一般;(IsInterpolateImagery必须设为true才生效)
INTERP_NEAREST -- 临近插值法(默认值):速度最快,临近像素点值一样;
Srs 数据坐标参考 string 数据目录下的tms.xml中的srs标签的值
TileSize 数据的瓦片大小 int 数据的瓦片大小,建议设为64、128、256等值,但不能大于256,越大加载效率越高
MaxX 数据范围x向最大值 double 从数据源中读取
MinX 数据范围X向最小值 double 从数据源中读取
MaxY 数据范围Y向最大值 double 从数据源中读取
MinY 数据范围Y向最小值 double 从数据源中读取

代码调用示例

Javascript调用

var srcDomLayer = null;
var bSrcDomVisible = true;
var gSrcDomPath = "E:\\测试数据\\Terrain\\Gdal\\Dom.tif"; 
//创建影像(未切割)图层
function createSrcDomLayer(){
    if(srcDomLayer == null){
        srcDomLayer = loadSrcDomLayer(gSrcDomPath, true);
    }else{
        alert("请勿重复创建影像图层!");
    }
}

//显隐影像(未切割)图层
function visibleSrcDomLayer(){
    if(srcDomLayer){
        srcDomLayer.SetVisible(bSrcDomVisible = !bSrcDomVisible);//显隐图层
    }else{
        alert("无影像图层,无法显隐!");
    }
}

//定位影像(未切割)图层
function locateSrcDomLayer(){
    if(srcDomLayer){
        srcDomLayer.Locate();//定位图层
    }else{
        alert("无影像图层,无法定位!");
    }
}

//删除影像(未切割)图层
function removeSrcDomLayer(){
    if(srcDomLayer){
        map.RemoveLayer(srcDomLayer);//移除图层
        srcDomLayer = null;
        bSrcDomVisible = true;
    }else{
        alert("无影像图层,无需移除!");
    }
}

//加载影像(原始)图层
function loadSrcDomLayer(url, isLocate){
    var dataSourceOptions = map.CreateDataSourceOptions("gdal");//创建数据源配置项,名称必须与数据源类型匹配
    dataSourceOptions.AddConfig("Url", url);//设置数据源配置路径
    var dataSource = map.CreateDataSource(dataSourceOptions);//创建数据源
    var count = dataSource.GetLayerCount();//获取数据源包含图层数量
    if(count == 0){
        alert("没有找到服务数据配置");
        return null;
    }
    //获取数据源图层配置项
    var Url = dataSource.GetLayerInfo(0, "Url");//要加载的数据路径
    var Srs = dataSource.GetLayerInfo(0, "Srs");//数据的坐标参考
    var MaxX = dataSource.GetLayerInfo(0, "MaxX");//数据的范围X向最大值
    var MinX = dataSource.GetLayerInfo(0, "MinX");//数据的范围X向最小值
    var MaxY = dataSource.GetLayerInfo(0, "MaxY");//数据的范围Y向最大值
    var MinY = dataSource.GetLayerInfo(0, "MinY");//数据的范围Y向最小值

    var tlo = map.CreateLayerOptions("domlayer");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "ImageLayerOptions");//图层配置对象名称, ImageLayerOptions代表影像数据配置
    tlo.AddConfig("DataSourceTypeName", "gdal");//数据源类型,代表gdal插件
    tlo.AddConfig("Driver", "terrainquadtree");//代表地形驱动
    tlo.AddConfig("IsCreatePyramid", "false");//是否在加载时创建金字塔文件,若有,则会先删除再创建
    tlo.AddConfig("IsInterpolateImagery", "false");//是否变换影像成像方式,默认为false
    //InterpolationMethod 差值方式
    //INTER_CUBIC -- 立方插值:最耗时,比双线性插值边沿更平滑(IsInterpolateImagery必须设为true才生效)
    //INTERP_BILINEAR -- 双线性插值:较为平滑,耗时一般;(IsInterpolateImagery必须设为true才生效)
    //INTERP_NEAREST -- 临近插值法(默认值):速度最快,临近像素点值一样;
    //tlo.AddConfig("InterpolationMethod", "INTER_CUBIC");//立方插值
    //tlo.AddConfig("InterpolationMethod", "INTERP_BILINEAR");//双线性插值
    tlo.AddConfig("InterpolationMethod", "INTERP_NEAREST");//临近插值法
    tlo.AddConfig("Url", Url);//要加载的数据路径
    tlo.AddConfig("Srs", Srs);//数据的坐标参考
    tlo.AddConfig("MaxX", MaxX);//数据的范围X向最大值
    tlo.AddConfig("MinX", MinX);//数据的范围X向最小值
    tlo.AddConfig("MaxY", MaxY);//数据的范围Y向最大值
    tlo.AddConfig("MinY", MinY);//数据的范围Y向最小值
    tlo.AddConfig("TileSize", "256");//瓦片大小,最大256
    var domGdalLayer = map.CreateLayer("ImageLayer", tlo); //创建影像图层,第一项参数必须为ImageLayer
    map.AddLayer(domGdalLayer);//添加影像图层
    if(isLocate){
        domGdalLayer.Locate();//图层定位
    }
    return domGdalLayer;
}

C++调用

BaseObjectCOMLib::ILayerObjectPtr domGdalLayer;//影像(未切割)图层对象
std::string SrcDomPath = "E:\\测试数据\\Terrain\\Gdal\\Dom.tif"; 
//创建影像(原始)图层
void Cf0c1DEMDOMDlg::OnBnClickedcreatesrcdomlayer()
{
    //如果影像(原始)图层为空
    if(domGdalLayer)
    {
        return;
    }
    char temp_status[MAX_PATH];
    GetPrivateProfileStringA("Path", "SrcDomPath", "", temp_status, MAX_PATH, mIniPath.c_str());
    std::string SrcDomPath(temp_status);
    domGdalLayer = loadSrcDomLayer(SrcDomPath, true);//加载影像(原始)图层
}

//显隐影像(原始)图层
void Cf0c1DEMDOMDlg::OnBnClickedvisiblesrcdomlayer()
{
    //如果影像(原始)图层为空
    if(!domGdalLayer)
    {
        return;
    }
    static bool domGdalVisble = true;
    domGdalLayer->SetVisible(domGdalVisble = !domGdalVisble); //显隐影像(原始)图层
}

//定位影像(原始)图层
void Cf0c1DEMDOMDlg::OnBnClickedlocatesrcdomlayer()
{
    //如果影像(原始)图层为空
    if(!domGdalLayer)
    {
        return;
    }
    domGdalLayer->Locate();//定位图层
}

//删除影像(原始)图层
void Cf0c1DEMDOMDlg::OnBnClickedremovesrcdomlayer()
{
    //如果影像(原始)图层为空
    if(!domGdalLayer)
    {
        return;
    }
    map->RemoveLayer(domGdalLayer);//删除图层
    domGdalLayer = NULL;
}

//创建原始影像图层
BaseObjectCOMLib::ILayerObjectPtr Cf0c1DEMDOMDlg::loadSrcDomLayer(std::string url,BOOL isLocate){
    ConfigOptionsCOMLib::IDataSourceOptionsPtr dataSourceOptions = map->CreateDataSourceOptions("gdal");//创建数据源配置对象,名称必须与数据源名称匹配
    dataSourceOptions->AddConfig("Url",url.c_str());//数据源路径
    BaseObjectCOMLib::IDataSourceObjectPtr dataSource=map->CreateDataSource(dataSourceOptions);//创建数据源对象
    long count =dataSource->GetLayerCount();//获取数据源包含图层数量
    if(count == 0){
        return NULL;
    }
    //获取数据源图层配置项
    std::string Url = dataSource->GetLayerInfo(0, "Url");//数据路径
    std::string Srs = dataSource->GetLayerInfo(0, "Srs");//数据的坐标参考
    std::string MaxX = dataSource->GetLayerInfo(0, "MaxX");//数据的范围X向最大值
    std::string MinX = dataSource->GetLayerInfo(0, "MinX");//数据的范围X向最小值
    std::string MaxY = dataSource->GetLayerInfo(0, "MaxY");//数据的范围Y向最大值
    std::string MinY = dataSource->GetLayerInfo(0, "MinY");//数据的范围Y向最小值
    std::string TileSize="256";
    TileSize = dataSource->GetLayerInfo(0, "TileSize");//切割数据的瓦片大小,最大为256,建议使用切割的大小设置,否则会影响效率
    ConfigOptionsCOMLib::ILayerOptionsPtr tlo = (ConfigOptionsCOMLib::ILayerOptionsPtr)map->CreateLayerOptions("demlayer"); // 创建图层配置对象,给配置起个名称,任意名称
    tlo->AddConfig("LayerOptionsName", "ImageLayerOptions"); //图层配置对象名称, ImageLayerOptions代表影像图层配置对象
    tlo->AddConfig("DataSourceTypeName", "gdal");//数据源类型
    tlo->AddConfig("Driver", "terrainquadtree");//驱动名称,terrainquadtree代表地形驱动
    tlo->AddConfig("IsCreatePyramid", "false");//是否在加载时创建金字塔文件,若有,则会先删除再创建
    tlo->AddConfig("IsInterpolateImagery", "true");//是否变换影像成像方式,默认为false
    //InterpolationMethod 差值方式
    //INTER_CUBIC -- 立方插值:最耗时,比双线性插值边沿更平滑(默认值)
    //INTERP_BILINEAR -- 双线性插值:较为平滑,耗时一般;(IsInterpolateImagery必须设为true才生效)
    //INTERP_NEAREST -- 临近插值法:速度最快,临近像素点值一样;(IsInterpolateImagery必须设为true才生效)
    //tlo->AddConfig("InterpolationMethod", "INTER_CUBIC");//立方插值
    //tlo->AddConfig("InterpolationMethod", "INTERP_BILINEAR");//双线性插值
    tlo->AddConfig("InterpolationMethod", "INTERP_NEAREST");//临近插值法
    tlo->AddConfig("Url", Url.c_str());//数据路径
    tlo->AddConfig("Srs", Srs.c_str());//数据的坐标参考
    tlo->AddConfig("MaxX", MaxX.c_str());//数据的范围X向最大值
    tlo->AddConfig("MinX", MinX.c_str());//数据的范围X向最小值
    tlo->AddConfig("MaxY", MaxY.c_str());//数据的范围Y向最大值
    tlo->AddConfig("MinY", MinY.c_str());//数据的范围Y向最小值
    tlo->AddConfig("TileSize", TileSize.c_str());//切割数据的瓦片大小
    BaseObjectCOMLib::ILayerObjectPtr domGdalLayer= map->CreateLayer("ImageLayer", tlo);//创建影像图层,第一项参数必须为ImageLayer
    map->AddLayer(domGdalLayer);//添加影像图层
    if(isLocate){
        domGdalLayer->Locate();//图层定位
    }
    return domGdalLayer;
}

C#调用

ILayerObject srcDomLayer;//影像图层(原始)
bool bSrcDomVisible = true;//影像图层(原始)显隐控制
string gSrcDomPath = "E:\\测试数据\\ Terrain\\Gdal\\Dom.tif"; 
//创建影像(原始)图层
private void createSrcDomLayer_Click(object sender, EventArgs e)
{
    if (srcDomLayer != null)
    {
        return;
    }
    IDataSourceOptions dataSourceOptions = map.CreateDataSourceOptions("gdal");//创建数据源配置项,名称必须与数据源类型匹配
    dataSourceOptions.AddConfig("Url", gSrcDomPath);//设置数据源配置路径
    IDataSourceObject dataSource = map.CreateDataSource(dataSourceOptions);//创建数据源
    long count = dataSource.GetLayerCount();//获取数据源包含图层数量
    if (count == 0)
    {
        return;
    }
    //获取数据源图层配置项
    string Url = dataSource.GetLayerInfo(0, "Url");//要加载的数据路径
    string Srs = dataSource.GetLayerInfo(0, "Srs");//数据的坐标参考
    string MaxX = dataSource.GetLayerInfo(0, "MaxX");//数据的范围X向最大值
    string MinX = dataSource.GetLayerInfo(0, "MinX");//数据的范围X向最小值
    string MaxY = dataSource.GetLayerInfo(0, "MaxY");//数据的范围Y向最大值
    string MinY = dataSource.GetLayerInfo(0, "MinY");//数据的范围Y向最小值

    ILayerOptions tlo = map.CreateLayerOptions("domlayer");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "ImageLayerOptions");//图层配置对象名称, ImageLayerOptions代表影像数据配置
    tlo.AddConfig("DataSourceTypeName", "gdal");//数据源类型,代表gdal插件
    tlo.AddConfig("Driver", "terrainquadtree");//代表地形驱动
    tlo.AddConfig("IsCreatePyramid", "false");//是否在加载时创建金字塔文件,若有,则会先删除再创建
    tlo.AddConfig("IsInterpolateImagery", "false");//是否变换影像成像方式,默认为false
    //InterpolationMethod 差值方式
    //INTER_CUBIC -- 立方插值:最耗时,比双线性插值边沿更平滑(IsInterpolateImagery必须设为true才生效)
    //INTERP_BILINEAR -- 双线性插值:较为平滑,耗时一般;(IsInterpolateImagery必须设为true才生效)
    //INTERP_NEAREST -- 临近插值法(默认值):速度最快,临近像素点值一样;
    //tlo.AddConfig("InterpolationMethod", "INTER_CUBIC");//立方插值
    //tlo.AddConfig("InterpolationMethod", "INTERP_BILINEAR");//双线性插值
    tlo.AddConfig("InterpolationMethod", "INTERP_NEAREST");//临近插值法
    tlo.AddConfig("Url", Url);//要加载的数据路径
    tlo.AddConfig("Srs", Srs);//数据的坐标参考
    tlo.AddConfig("MaxX", MaxX);//数据的范围X向最大值
    tlo.AddConfig("MinX", MinX);//数据的范围X向最小值
    tlo.AddConfig("MaxY", MaxY);//数据的范围Y向最大值
    tlo.AddConfig("MinY", MinY);//数据的范围Y向最小值
    tlo.AddConfig("TileSize", "256");//瓦片大小,最大256
    srcDomLayer = map.CreateLayer("ImageLayer", tlo); //创建影像图层,第一项参数必须为ImageLayer
    map.AddLayer(srcDomLayer);//添加影像图层
    srcDomLayer.Locate();//图层定位
}

//显隐影像(未切割)图层
private void visibleSrcDomLayer_Click(object sender, EventArgs e)
{
    if (srcDomLayer!=null)
    {
        srcDomLayer.SetVisible(bSrcDomVisible = !bSrcDomVisible);//显隐图层
    }
}

//定位影像(未切割)图层
private void locateSrcDomLayer_Click(object sender, EventArgs e)
{
    if (srcDomLayer != null)
    {
        srcDomLayer.Locate();//定位图层
    }
}

//删除影像(未切割)图层
private void button1_Click(object sender, EventArgs e)
{
    if (srcDomLayer!=null)
    {
        map.RemoveLayer(srcDomLayer);//移除图层
        srcDomLayer = null;
        bSrcDomVisible = true;
    }
}

原始地形加载

加载原始地形数据时,需要使用数据源对象获取相应的参数信息。通过数据源获取方式可见:原始地形影像图层配置信息获取

原始地形参数说明

原始地形加载可配置的参数如下表所示:

配置项 配置说明 值类型 备注
LayerOptionsName 图层配置对象名称 string ElevationLayerOptions 代表地形图层配置对象
DataSourceTypeName 数据源类型 string 原始数据必须配置为gdal
Url 数据访问路径 string 数据的真实路径
Driver 驱动名称 string terrainquadtree 代表地形驱动,该值不可更改
IsCreatePyramid 是否在加载时创建金字塔文件 bool 默认值false,如果构建需要一定等待时间
IsInterpolateImagery 是否变换影像成像方式 bool 默认值false
InterpolationMethod 差值方式 string INTER_CUBIC -- 立方插值:最耗时,比双线性插值边沿更平滑(IsInterpolateImagery必须设为true才生效)
INTERP_BILINEAR -- 双线性插值:较为平滑,耗时一般;(IsInterpolateImagery必须设为true才生效)
INTERP_NEAREST -- 临近插值法(默认值):速度最快,临近像素点值一样;
Srs 数据坐标参考 string 数据目录下的tms.xml中的srs标签的值
TileSize 数据的瓦片大小 int 数据的瓦片大小,建议设为16
MaxX 数据范围x向最大值 double 从数据源中读取
MinX 数据范围X向最小值 double 从数据源中读取
MaxY 数据范围Y向最大值 double 从数据源中读取
MinY 数据范围Y向最小值 double 从数据源中读取

代码调用示例

Javascript调用

var srcDemLayer = null;
var bSrcDemVisible = true;
var gSrcDemPath = "E:\\测试数据\\Terrain\\Gdal\\Dem.tif";
//创建地形高程(未切割)图层
function createSrcDemLayer(){
    if(srcDemLayer == null){
        srcDemLayer = loadSrcDemLayer(gSrcDemPath, false);
    }else{
        alert("请勿重复创建地形高程图层!");
    }
}

//显隐地形高程(未切割)图层
function visibleSrcDemLayer(){
    if(srcDemLayer){
        srcDemLayer.SetVisible(bSrcDemVisible = !bSrcDemVisible);//图层显隐
    }else{
        alert("无地形高程图层,无法显隐!");
    }
}

//定位地形高程(未切割)图层
function locateSrcDemLayer(){
    if(srcDemLayer){
        srcDemLayer.Locate();//图层定位
    }else{
        alert("无地形高程图层,无法定位!");
    }
}

//删除地形高程(未切割)图层
function removeSrcDemLayer(){
    if(srcDemLayer){
        map.RemoveLayer(srcDemLayer);//移除图层
        srcDemLayer = null;
        bSrcDemVisible = true;
    }else{
        alert("无地形高程图层,无需移除!");
    }
}

//加载地形(原始)图层
function loadSrcDemLayer(url, isLocate){
    var dataSourceOptions = map.CreateDataSourceOptions("gdal");//创建数据源配置项,名称必须与数据源类型匹配
    dataSourceOptions.AddConfig("Url", url); //设置数据源配置路径
    var dataSource = map.CreateDataSource(dataSourceOptions);//创建数据源
    var count = dataSource.GetLayerCount();//获取数据源包含图层数量
    if(count == 0){
        alert("没有找到服务数据配置");
        return null;
    }
    //获取数据源图层配置项
    var Url = dataSource.GetLayerInfo(0, "Url");//要加载的数据路径
    var Srs = dataSource.GetLayerInfo(0, "Srs");//数据的坐标参考
    var MaxX = dataSource.GetLayerInfo(0, "MaxX");//数据的范围X向最大值
    var MinX = dataSource.GetLayerInfo(0, "MinX");//数据的范围X向最小值
    var MaxY = dataSource.GetLayerInfo(0, "MaxY");//数据的范围Y向最大值
    var MinY = dataSource.GetLayerInfo(0, "MinY");//数据的范围Y向最小值

    var tlo = map.CreateLayerOptions("demlayer");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "ElevationLayerOptions");//图层配置对象名称, ElevationLayerOptions代表地形数据配置
    tlo.AddConfig("DataSourceTypeName", "gdal");//数据源类型,代表gdal插件
    tlo.AddConfig("Driver", "terrainquadtree");//代表地形驱动
    tlo.AddConfig("IsCreatePyramid", "false");//是否在加载时创建金字塔文件,若有,则会先删除再创建
    tlo.AddConfig("IsInterpolateImagery", "false");//是否变换影像成像方式,默认为false
    //InterpolationMethod 差值方式
    //INTER_CUBIC -- 立方插值:最耗时,比双线性插值边沿更平滑(IsInterpolateImagery必须设为true才生效)
    //INTERP_BILINEAR -- 双线性插值:较为平滑,耗时一般;(IsInterpolateImagery必须设为true才生效)
    //INTERP_NEAREST -- 临近插值法(默认值):速度最快,临近像素点值一样;
    //tlo.AddConfig("InterpolationMethod", "INTER_CUBIC");//立方插值
    //tlo.AddConfig("InterpolationMethod", "INTERP_BILINEAR");//双线性插值
    tlo.AddConfig("InterpolationMethod", "INTERP_NEAREST");//临近插值法
    tlo.AddConfig("Url", Url);//要加载的数据路径
    tlo.AddConfig("Srs", Srs);//数据的坐标参考
    tlo.AddConfig("MaxX", MaxX);//数据的范围X向最大值
    tlo.AddConfig("MinX", MinX);//数据的范围X向最小值
    tlo.AddConfig("MaxY", MaxY);//数据的范围Y向最大值
    tlo.AddConfig("MinY", MinY);//数据的范围Y向最小值
    tlo.AddConfig("MaxX", MaxX);//数据的范围X向最大值
    tlo.AddConfig("TileSize", "16");//瓦片大小,最大16
    var demGdalLayer = map.CreateLayer("ElevationLayer", tlo); //创建地形图层,第一项参数必须为ElevationLayer
    map.AddLayer(demGdalLayer);//添加地形图层
    if(isLocate){
        demGdalLayer.Locate();//地形图层定位
    }
    return demGdalLayer;
}

C++调用

BaseObjectCOMLib::ILayerObjectPtr demGdalLayer;//地形(未切割)图层对象
std::string SrcDemPath = "E:\\测试数据\\Terrain\\Gdal\\Dem.tif";
//创建地形高程(原始)图层
void Cf0c1DEMDOMDlg::OnBnClickedcreatesrcdemlayer()
{
    //如果地形高程(原始)图层为空
    if(demGdalLayer)
    {
        return;
    }
    char temp_status[MAX_PATH];
    GetPrivateProfileStringA("Path", "SrcDemPath", "", temp_status, MAX_PATH, mIniPath.c_str());
    std::string SrcDemPath(temp_status);
    demGdalLayer = loadSrcDemLayer(SrcDemPath, false);//加载地形高程(原始)图层
}

//显隐地形高程(原始)图层
void Cf0c1DEMDOMDlg::OnBnClickedvisiblesrcdemlayer()
{
    //如果地形高程(原始)图层为空
    if(!demGdalLayer)
    {
        return;
    }
    static bool demGdalVisble = true;
    demGdalLayer->SetVisible(demGdalVisble = !demGdalVisble); //显隐地形高程(原始)图层
}

//定位地形高程(原始)图层
void Cf0c1DEMDOMDlg::OnBnClickedlocatesrcdemlayer()
{
    //如果地形高程(原始)图层为空
    if(!demGdalLayer)
    {
        return;
    }
    demGdalLayer->Locate();//定位图层
}

//删除地形高程(原始)图层
void Cf0c1DEMDOMDlg::OnBnClickedremovesrcdemlayer()
{
    //如果地形高程(原始)图层为空
    if(!demGdalLayer)
    {
        return;
    }
    map->RemoveLayer(demGdalLayer);//删除图层
    demGdalLayer = NULL;
}
//加载地形(未切割)图层
BaseObjectCOMLib::ILayerObjectPtr Cf0c1DEMDOMDlg::loadSrcDemLayer(std::string url,BOOL isLocate)
{
    ConfigOptionsCOMLib::IDataSourceOptionsPtr dataSourceOptions = map->CreateDataSourceOptions("gdal");//创建数据源配置对象,名称必须与数据源名称匹配
    dataSourceOptions->AddConfig("Url",url.c_str());//数据源路径
    BaseObjectCOMLib::IDataSourceObjectPtr dataSource=map->CreateDataSource(dataSourceOptions);//创建数据源对象
    long count =dataSource->GetLayerCount();//获取数据源包含图层数量
    if(count == 0){
        return NULL;
    }
    //获取数据源图层配置项
    std::string Url = dataSource->GetLayerInfo(0, "Url");//数据路径
    std::string Srs = dataSource->GetLayerInfo(0, "Srs");//数据的坐标参考
    std::string MaxX = dataSource->GetLayerInfo(0, "MaxX");//数据的范围X向最大值
    std::string MinX = dataSource->GetLayerInfo(0, "MinX");//数据的范围X向最小值
    std::string MaxY = dataSource->GetLayerInfo(0, "MaxY");//数据的范围Y向最大值
    std::string MinY = dataSource->GetLayerInfo(0, "MinY");//数据的范围Y向最小值
    std::string TileSize="16";
    TileSize = dataSource->GetLayerInfo(0, "TileSize");//切割数据的瓦片大小,最大为256,建议使用切割的大小设置,否则会影响效率
    ConfigOptionsCOMLib::ILayerOptionsPtr tlo = (ConfigOptionsCOMLib::ILayerOptionsPtr)map->CreateLayerOptions("demlayer"); // 创建图层配置对象,给配置起个名称,任意名称
    tlo->AddConfig("LayerOptionsName", "ElevationLayerOptions"); //创建配置类型, ElevationLayerOptions代表地形数据配置,必须是此键值对
    tlo->AddConfig("DataSourceTypeName", "gdal");//数据源类型
    tlo->AddConfig("Driver", "terrainquadtree");//驱动名称,terrainquadtree代表地形驱动
    tlo->AddConfig("IsCreatePyramid", "false");//是否在加载时创建金字塔文件,若有,则会先删除再创建
    tlo->AddConfig("IsInterpolateImagery", "true");//是否变换影像成像方式,默认为false
    //InterpolationMethod 差值方式
    //INTER_CUBIC -- 立方插值:最耗时,比双线性插值边沿更平滑(默认值)
    //INTERP_BILINEAR -- 双线性插值:较为平滑,耗时一般;(IsInterpolateImagery必须设为true才生效)
    //INTERP_NEAREST -- 临近插值法:速度最快,临近像素点值一样;(IsInterpolateImagery必须设为true才生效)
    //tlo->AddConfig("InterpolationMethod", "INTER_CUBIC");//立方插值
    //tlo->AddConfig("InterpolationMethod", "INTERP_BILINEAR");//双线性插值
    tlo->AddConfig("InterpolationMethod", "INTERP_NEAREST");//临近插值法
    tlo->AddConfig("Url", Url.c_str());//数据路径
    tlo->AddConfig("Srs", Srs.c_str());//数据的坐标参考
    tlo->AddConfig("MaxX", MaxX.c_str());//数据的范围X向最大值
    tlo->AddConfig("MinX", MinX.c_str());//数据的范围X向最小值
    tlo->AddConfig("MaxY", MaxY.c_str());//数据的范围Y向最大值
    tlo->AddConfig("MinY", MinY.c_str());//数据的范围Y向最小值
    tlo->AddConfig("TileSize", TileSize.c_str());//切割数据的瓦片大小
    BaseObjectCOMLib::ILayerObjectPtr demGdalLayer= map->CreateLayer("ElevationLayer", tlo);//创建影像图层,第一项参数必须为ImageLayer
    map->AddLayer(demGdalLayer);//添加影像图层
    if(isLocate){
        demGdalLayer->Locate();//图层定位
    }
    return demGdalLayer;
}

C#调用

ILayerObject srcDemLayer;//地形图层(原始)
bool bSrcDemVisible = true;//地形图层(原始)显隐控制
string gSrcDemPath = "E:\\测试数据\\ Terrain\\Gdal\\Dem.tif";
//创建地形高程(未切割)图层
private void createSrcDemLayer_Click(object sender, EventArgs e)
{
    if (srcDemLayer!=null)
    {
        return;
    }
    IDataSourceOptions dataSourceOptions = map.CreateDataSourceOptions("gdal");//创建数据源配置项,名称必须与数据源类型匹配
    dataSourceOptions.AddConfig("Url", gSrcDemPath);//设置数据源配置路径
    IDataSourceObject dataSource = map.CreateDataSource(dataSourceOptions);//创建数据源
    long count = dataSource.GetLayerCount();//获取数据源包含图层数量
    if (count == 0)
    {
        return;
    }
    //获取数据源图层配置项
    string Url = dataSource.GetLayerInfo(0, "Url");//要加载的数据路径
    string Srs = dataSource.GetLayerInfo(0, "Srs");//数据的坐标参考
    string MaxX = dataSource.GetLayerInfo(0, "MaxX");//数据的范围X向最大值
    string MinX = dataSource.GetLayerInfo(0, "MinX");//数据的范围X向最小值
    string MaxY = dataSource.GetLayerInfo(0, "MaxY");//数据的范围Y向最大值
    string MinY = dataSource.GetLayerInfo(0, "MinY");//数据的范围Y向最小值

    ILayerOptions tlo = (ILayerOptions)map.CreateLayerOptions("demlayer");//创建图层配置对象,任意名称
    tlo.AddConfig("LayerOptionsName", "ElevationLayerOptions");//图层配置对象名称, ImageLayerOptions代表影像数据配置
    tlo.AddConfig("DataSourceTypeName", "gdal");//数据源类型,代表gdal插件
    tlo.AddConfig("Driver", "terrainquadtree");//代表地形驱动
    tlo.AddConfig("IsCreatePyramid", "false");//是否在加载时创建金字塔文件,若有,则会先删除再创建
    tlo.AddConfig("IsInterpolateImagery", "false");//是否变换影像成像方式,默认为false
    //InterpolationMethod 差值方式
    //INTER_CUBIC -- 立方插值:最耗时,比双线性插值边沿更平滑(IsInterpolateImagery必须设为true才生效)
    //INTERP_BILINEAR -- 双线性插值:较为平滑,耗时一般;(IsInterpolateImagery必须设为true才生效)
    //INTERP_NEAREST -- 临近插值法(默认值):速度最快,临近像素点值一样;
    //tlo.AddConfig("InterpolationMethod", "INTER_CUBIC");//立方插值
    //tlo.AddConfig("InterpolationMethod", "INTERP_BILINEAR");//双线性插值
    tlo.AddConfig("InterpolationMethod", "INTERP_NEAREST");//临近插值法
    tlo.AddConfig("Url", Url);//要加载的数据路径
    tlo.AddConfig("Srs", Srs);//数据的坐标参考
    tlo.AddConfig("MaxX", MaxX);//数据的范围X向最大值
    tlo.AddConfig("MinX", MinX);//数据的范围X向最小值
    tlo.AddConfig("MaxY", MaxY);//数据的范围Y向最大值
    tlo.AddConfig("MinY", MinY);//数据的范围Y向最小值
    tlo.AddConfig("TileSize", "16");//瓦片大小,最大256
    srcDemLayer = map.CreateLayer("ElevationLayer", tlo); //创建影像图层,第一项参数必须为ImageLayer
    map.AddLayer(srcDemLayer);//添加影像图层
}

//显隐地形高程(未切割)图层
private void visibleSrcDemLayer_Click(object sender, EventArgs e)
{
    if (srcDemLayer != null)
    {
        srcDemLayer.SetVisible(bSrcDemVisible = !bSrcDemVisible);//图层显隐
    }
}

//定位地形高程(未切割)图层
private void locateSrcDemLayer_Click(object sender, EventArgs e)
{
    if (srcDemLayer != null)
    {
        srcDemLayer.Locate();//图层定位
    }
}

//删除地形高程(未切割)图层
private void removeSrcDemLayer_Click(object sender, EventArgs e)
{
    if (srcDemLayer != null)
    {
        map.RemoveLayer(srcDemLayer);//移除图层
        srcDemLayer = null;
        bSrcDemVisible = true;
    }
}

results matching ""

    No results matching ""