ArcEngine实现动态加载地图
2013-12-16 16:52
211 查看
动态加载地图
说一下主要思想:通过判断相关点是否在视图范围,并且达到某一地图比例尺时加载相应范围的地图(需要有相应基础才能看懂本文章)。1.首先得到关键点的图层
m_Map= axMapControl.Map;int l = 0;
int f = 0;
for (int j = 0; j < m_Map.LayerCount; j++)
{
if (m_Map.get_Layer(j).Name =="Points")
{
l = j;//获得Points图层
}
}
2.取得该范围
double xmax = env.XMax;double ymax = env.YMax;
double xmin = env.XMin;
double ymin = env.YMin;
3.经纬度以及名称字段的属性信息存入arraylist
ArrayListaList = new ArrayList();ArrayList bList = new ArrayList();
ArrayList nList = new ArrayList();
IFeatureLayer ilayer =(IFeatureLayer)m_Map.get_Layer(l);//得到点图层
IFeatureCursor pFeatureCursor;
pFeatureCursor =ilayer.FeatureClass.Search(null, false);
IFeature pFeature;
pFeature =pFeatureCursor.NextFeature();
while (pFeature != null)
{
string jdValue =Convert.ToString(pFeature.get_Value(4));
string wdValue =Convert.ToString(pFeature.get_Value(5));
string name =Convert.ToString(pFeature.get_Value(2));
pFeature = pFeatureCursor.NextFeature();
aList.Add(jdValue);//经纬度以及name存入arraylist
bList.Add(wdValue);
nList.Add(name);
}
4.遍历arraylist并判断点是否在可视范围内
if(m_Map.MapScale < 400000){
for (int j = 0; j < 35; j++)
{
double jd =double.Parse(aList[j].ToString());
double wd =double.Parse(bList[j].ToString());
//判断土层中是否已经存在某个影像数据,若存在则不进行坐标的判断
if (jd >= xmin&& jd <= xmax)
{
if (wd >= ymin&& wd <= ymax)
{ nameid = nList[j].ToString();//获得name属性
for (int q = 0; q< axMapControl.Map.LayerCount; q++)
{
temp = getname== nameid + ".tif";
getname =Convert.ToString(axMapControl.get_Layer(q).Name);
if(temp)
indexa = q - 1;
}
5.调用添加影像数据函数dynamicadd()(目前是本地)
//动态加载删格数据public void dynamicadd(string strFullPath)
{
int Index = strFullPath.LastIndexOf("\\");
string fileName = strFullPath.Substring(Index + 1);
string filePath = strFullPath.Substring(0, Index);
IWorkspaceFactory workspaceFactory =newRasterWorkspaceFactory();
IRasterWorkspace rasterWorkspace = (IRasterWorkspace)workspaceFactory.OpenFromFile(filePath,0);
IRasterDataset rasterDataset = (IRasterDataset)rasterWorkspace.OpenRasterDataset(fileName);
IRasterLayer rasterLayer =newRasterLayerClass();
rasterLayer.CreateFromDataset(rasterDataset);
axMapControl.AddLayer(rasterLayer,2);
}
6.判断是否已经动态加载
if (temp){
//MessageBox.Show(Convert.ToString(axMapControl.get_Layer(indexa).Name));//测试
axMapControl.get_Layer(indexa).MinimumScale = 250000;//设定这个图层的可见范围?
return;
}
else
{
string strFullPath ="";
strFullPath = Application.StartupPath + @"\\data\影像\" + nameid +".tif";
dynamicadd(strFullPath);
axMapControl.get_Layer(2).MinimumScale = 250000;
break;
}
7将影像图层控制在五个以内超过了就删除
clearLayer.Add(nameid);axMapControl.get_Layer(2).MinimumScale= 250000;
if(clearLayer.Count > 5)//当图层超过5个时清除最早加载的图层(应该是不在视图范围内的)
{
for (int e= 0; e < axMapControl.LayerCount;e++ )
{
if(axMapControl.get_Layer(e).Name.ToString() ==clearLayer[0].ToString()+".tif")
{
//ILayer layer = null;
//layer = axMapControl.Map.get_Layer(e);
axMapControl.DeleteLayer(e);
}
}
8.综上所述
//缩放至一定范围时加载地图//可视范围还有问题
string nameid = "";//关键的传值字段,连接影像数据的路径
string getname = "";//
bool temp =false;//判断是否已经加载的bool类型变量
ArrayList clearLayer= new ArrayList();
public void fanwei(IEnvelope env)
{
m_Map = axMapControl.Map;
int l = 0;
int f = 0;
for (int j = 0; j < m_Map.LayerCount; j++)
{
if (m_Map.get_Layer(j).Name =="Points")
{
l = j;//获得Points图层为以后得到图层传递l
}
}
double xmax = env.XMax;
double ymax = env.YMax;
double xmin = env.XMin;
double ymin = env.YMin;//屏幕范围参数取值
ArrayList aList =newArrayList();
ArrayList bList =newArrayList();
ArrayList nList =newArrayList();//用来存储经纬度以及名称字段的arraylist
IFeatureLayer ilayer = (IFeatureLayer)m_Map.get_Layer(l);//得到点图层
IFeatureCursor pFeatureCursor;
pFeatureCursor =ilayer.FeatureClass.Search(null,false);
IFeature pFeature;
pFeature =pFeatureCursor.NextFeature();//用来获取字段值的关键
while (pFeature != null)
{
string jdValue = Convert.ToString(pFeature.get_Value(4));
string wdValue = Convert.ToString(pFeature.get_Value(5));
string name = Convert.ToString(pFeature.get_Value(2));
pFeature =pFeatureCursor.NextFeature();
aList.Add(jdValue);//经纬度以及name存入arraylist
bList.Add(wdValue);
nList.Add(name);
}
if (m_Map.MapScale < 400000)//比例尺大于此值将进行判断
{
for (int j = 0; j < 35; j++)//在这里我知道共有35个点
{
double jd = double.Parse(aList[j].ToString());
double wd = double.Parse(bList[j].ToString());
//判断点是否在可视范围内,在范围内则取值nameid与影像数据路径相关联
//判断图层中是否已经存在某个影像数据,若存在则不进行坐标的判断
if (jd >= xmin && jd <= xmax)
{
if (wd >= ymin&& wd <= ymax)
{
nameid =nList[j].ToString();//获得name属性
for (int q = 0; q <axMapControl.Map.LayerCount; q++)
{
temp = (getname== nameid + ".tif");
getname = Convert.ToString(axMapControl.get_Layer(q).Name);
if(temp)
{
indexa = q - 1;
break;//很重要!!!!
}
}
if (temp)
{
for (int e = 0; e < axMapControl.LayerCount; e++)
{
for (int r = 0; r <clearLayer.Count; r++)
{
if(axMapControl.get_Layer(e).Name.ToString() == clearLayer[r].ToString() +".tif")
{
//ILayer layer =null;
//layer =axMapControl.Map.get_Layer(e);
axMapControl.get_Layer(e).MinimumScale = 250000;
}
}
}
return;//return还是break要注意
}
else
{
stringstrFullPath = "";
strFullPath =Application.StartupPath + @"\\data\影像\" + nameid +".tif";
dynamicadd(strFullPath);
clearLayer.Add(nameid);
for (int e = 0; e < axMapControl.LayerCount; e++)
{
if(axMapControl.get_Layer(e).Name.ToString() == clearLayer[0].ToString() +".tif")
{
//ILayer layer = null;
//layer =axMapControl.Map.get_Layer(e);
axMapControl.get_Layer(e).MinimumScale = 250000;
}
} if (clearLayer.Count >5)//当图层超过5个时清除最早加载的图层(应该是不在视图范围内的)
{
for (int e= 0; e < axMapControl.LayerCount;e++ )
{
if(axMapControl.get_Layer(e).Name.ToString() ==clearLayer[0].ToString()+".tif")
{
//ILayer layer = null;
//layer = axMapControl.Map.get_Layer(e);
axMapControl.DeleteLayer(e);
}
}
}
break;
} }
}
}
}
}
9.从数据库中添加数据
字段及其主函数
string nameid = "";string getname = "";
bool temp = false;
ArrayList clearLayer =newArrayList();
string strFullPath = "";//关?键¨¹路¡¤径?参?数ºy!ê?!ê?!ê?!ê?!ê?
public void fanwei(IEnvelope env)
{
m_Map = axMapControl.Map;
int L = 0;
for (int j = 0; j< m_Map.LayerCount; j++)
{
if (m_Map.get_Layer(j).Name =="Points")//可¨¦改?
{
L = j;//获?得Ì?Points图ª?层?
}
}
double xmax = env.XMax;
double ymax = env.YMax;
double xmin = env.XMin;
double ymin = env.YMin;
ArrayList aList = newArrayList();
ArrayList bList = newArrayList();
ArrayList nList = newArrayList();
IFeatureLayer ilayer = (IFeatureLayer)m_Map.get_Layer(L);//得Ì?到Ì?点Ì?图ª?层?
IFeatureCursor pFeatureCursor;
pFeatureCursor = ilayer.FeatureClass.Search(null,false);
IFeature pFeature;
pFeature = pFeatureCursor.NextFeature();
while (pFeature != null)
{
string jdValue = Convert.ToString(pFeature.get_Value(4));
string wdValue = Convert.ToString(pFeature.get_Value(5));
string name = Convert.ToString(pFeature.get_Value(2));
pFeature = pFeatureCursor.NextFeature();
aList.Add(jdValue);//经-纬3度¨¨以°?及¡ãname存ä?入¨?arraylist
bList.Add(wdValue);
nList.Add(name);
}
if (m_Map.MapScale < 400000)
{
for (intj = 0; j < 35; j++)
{
double jd = double.Parse(aList[j].ToString());
doublewd = double.Parse(bList[j].ToString());
//
if (jd >= xmin && jd <=xmax)
{
if (wd >= ymin && wd <= ymax)
{
nameid =nList[j].ToString();//
//
strFullPath =FSelect(nameid);
for (int q = 0; q< axMapControl.Map.LayerCount; q++)
{
getname = Convert.ToString(axMapControl.get_Layer(q).Name);
temp = (getname== strFullPath);
if (temp)
{
indexa = q- 1;
break;
}
}
if (temp)
{
for (int e = 0; e< axMapControl.LayerCount; e++)
{
for (int r = 0; r< clearLayer.Count; r++)
{
if (axMapControl.get_Layer(e).Name.ToString() ==strFullPath)
{
axMapControl.get_Layer(e).MinimumScale = 250000;
}
}
}
return;
}
else
{
dynamicadd(strFullPath);
clearLayer.Add(strFullPath);
if (clearLayer.Count > 5)
{
for (int e = 0; e< axMapControl.LayerCount; e++)
{
if (axMapControl.get_Layer(e).Name.ToString() ==clearLayer[0].ToString() +".tif"|| axMapControl.get_Layer(e).Name.ToString() == clearLayer[0].ToString())
{
axMapControl.DeleteLayer(e);
}
}
}
break;
}
}
}
}
}
}
加载数据的函数
publicvoid dynamicadd(stringstrFullPath){
//int Index = strFullPath.LastIndexOf("\\");
//string fileName = strFullPath.Substring(Index + 1);
//string filePath = strFullPath.Substring(0, Index);
IPropertySet pProSet =newPropertySet();
pProSet.SetProperty("Server","192.168.159.186");
pProSet.SetProperty("Instance","sde:oracle11g:192.168.159.186/orcl");
pProSet.SetProperty("Database","orcl");
pProSet.SetProperty("user","sde");
pProSet.SetProperty("password","sde");
pProSet.SetProperty("version","SDE.DEFAULT");
IWorkspace pSdeWorkspace =null;
IFeatureWorkspace pFeatureWorkspace =null;
IRasterWorkspaceEx pRasterWorkspace =null;
IWorkspaceFactory pWSF =newSdeWorkspaceFactory();
pSdeWorkspace = pWSF.Open(pProSet, 0);
pFeatureWorkspace = pSdeWorkspace as IFeatureWorkspace;
pRasterWorkspace = pSdeWorkspace as IRasterWorkspaceEx;
//
IRasterDatasetpRasterDataset = (IRasterDataset)pRasterWorkspace.OpenRasterDataset(strFullPath);
IRasterLayer pLayerBackground =newRasterLayerClass();
pLayerBackground.CreateFromDataset(pRasterDataset);
axMapControl.AddLayer(pLayerBackground,1);
}
对数据库的操作
public string FSelect(stringstrPath){
string sdename = "";
OracleConnection conn =newOracleConnection(@ClassCommon.GetConnect());
conn.Open();
string sql = "selectsdename from SYSTEM_HERITAGE_SDE_VIEW where hname = '"+strPath+"'";//
//OracleCommand cmd = new OracleCommand(sql, conn);
using (OracleCommandcmd =newOracleCommand(sql,conn))
{
cmd.CommandType = CommandType.Text;
try
{
OracleDataReader reader =cmd.ExecuteReader();
while (reader.Read())
{
sdename = reader["sdename"].ToString(); ;
}
}
catch (Exceptionex)
{
}
}
conn.Close();
//cmd.Dispose();
return sdename;
}
相关文章推荐
- arcgis 加载png图片实现图片跟随地图缩放 和图片的动态播放
- cocos2d-android - 1.地图动态加载原理(世界地图的实现)
- arcengine加载模板时实现比例尺与地图的同步
- 虚幻4中异步加载Pak中地图实现场景切换的动态加载画面
- cocos2d-android - 1.地图动态加载原理(世界地图的实现)
- 用AjaxMethod 方法实现动态加载地图
- android 实现listview动态加载列表项
- [UE4]C++实现动态加载的问题
- 通过使页面动态加载不同CSS实现多界面
- ASP.NET中实现模版的动态加载
- 动态加载与插件系统的初步实现(四):解析JSON、扩展Fiddler
- vb动态加载dll的一个类,实现vb动态加载dll并动态调用dll导出的函数的一个方便办法
- ViewPager实现加载网络图片,动态添加删除效果
- Java基础---Java---基础加强---类加载器、委托机制、AOP、 动态代理技术、让动态生成的类成为目标类的代理、实现Spring可配置的AOP框架
- Silverlight 动态加载程序集 -----实现按需下载
- android动态加载.so,实现动态库升级
- 加载动态DLL,实现查询进程路径
- 利用jQuery的ResourceLoader插件实现JS和CSS脚本的动态按需加载
- Android学习笔记31-使用惰性控件ViewStub实现布局动态加载
- C#动态加载DLL,通过配置文件实现对程序集的即插即用