第二节:地形影像加载
地形影像数据加载是指将数字高程模型(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;
}
}