动态加载地图

说一下主要思想:通过判断相关点是否在视图范围,并且达到某一地图比例尺时加载相应范围的地图(需要有相应基础才能看懂本文章)。

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存入arraylistbList.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();//用来存储经纬度以及名称字段的arraylistIFeatureLayer 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存入arraylistbList.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存ä?入¨?arraylistbList.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;}

ArcEngine实现动态加载地图相关推荐

  1. GEE学习笔记 八十七:python版GEE动态加载地图方法(更新版)

    为了防控疫情,继续宅在家里--. 国内某些在国外受过高等教育的人竟然认为公开承认上图红色注释会引起某些麻烦. 在Google Earth Engine的python版API更新后,之前使用folium ...

  2. Echarts动态加载地图数据(Dynamic load Echarts map data)

    本篇就是Echarts制作地图终篇啦,前面我们已经制作好自定义区域的地图,如何结合'数据'让地图根据我们的业务逻辑变得有"活力",这才是最重要的.Echarts官网中给的demo大 ...

  3. vue高德、谷歌地图动态加载

    vue高德.谷歌地图动态加载 前言 引入地图资源 页面使用 完整map.js 前言 因为我们这个项目,做的是国际化项目,考虑的是,在国内使用高德地图,在国外使用谷歌地图,所以在这里做了个动态引入地图, ...

  4. 百度地图-省市县联动加载地图

    2019独角兽企业重金招聘Python工程师标准>>> 在平常项目中,我们会遇到这样的业务场景: 客户希望把自己的门店绘制在百度地图上,通过省.市.区的选择,然后加载不同区域下的店铺 ...

  5. arcengine 加载地图不显示_ArcEngine加载地图

    对于ArcEngine开发者来说,万事第一步,就是要先加载地图数据,不过我们下面要讲的加载地图的方法不是用ArcEngine自带的控件或命令来实现的,而是以代码方式实现的.加载地图的方式主要分为两种: ...

  6. 虚幻4里的地图动态加载

    动态加载是把一张大地图分成若干块,然后每块只在需要的时候加载进来,不需要的时候在卸载掉,有助于节省内存. 先打开关卡面板,在没有建立用于动态加载的地图前是这样的 在这里来添加地图,当前的地图就是为永久 ...

  7. arcengine 加载地图不显示_用LSV下载城市地图、全省地图教程

    在LSV里,可以下载各种的城市地图.也可以下载DEM数据.近日,有粉丝私信给我,如何下载令人满意的城市地图/全省地图. 首先,在LSV里下载地图. 以一个地级市为例,如何下载某个地级市的行政区划+道路 ...

  8. 虚幻4的关卡动态加载机制

    对于大型游戏MMORPG游戏或是3D街景(虚拟现实)还有大型无缝地图都需要地图啊,关卡动态加载的机制来达到让用户感觉自己一直是在漫游,而不会出现Loading(读条),卡界面等情况.当然除非是垮区域无 ...

  9. Android动态加载技术初探

    一.前言: 现在,已经有实力强大的公司用这个技术开发应用了,比如淘宝,大众点评,百度地图等,之所以采用这个技术,实际上,就是方便更新功能,当然,前提是新旧功能的接口一致,不然会报Not Found等错 ...

最新文章

  1. Java 基本数据类型 sizeof 功能
  2. MFC使用OpenCV在文档窗口中显示图像(支持多图片格式)
  3. 洛谷 - P3391 【模板】文艺平衡树(Splay-区间反转)
  4. stm32 PWM互补输出
  5. java service 初始化_【Java】Nacos – NacosNamingService初始化
  6. linux 运行python效率高还是windows高_为什么使用Mac开发比Windows效率高?
  7. STM32固件库下载教程
  8. phpspider 简单使用
  9. 能量换算,方便减肥控制饮食
  10. python排列3彩票统计
  11. 反相比例运放反馈电阻并联电容和积分电路区别,以及积分电路中反馈电容并联电阻的区别。阻值和容值参数大小不同,电路性质也就不同了
  12. MySQL-实操:部门、员工信息与管理
  13. 罗杨美慧 20190919-3 效能分析
  14. 使用VBA操作文件(1):使用Excel对话框
  15. 知名企业面试、笔试题
  16. ALV清缓存_SAP刘梦_新浪博客
  17. Qt Central Widget
  18. New eBooks Available for Subscribers
  19. P110中 深拷贝与浅拷贝问题
  20. et99php,坚石诚信ET99加密狗api aardio调用示范

热门文章

  1. 做职场里的“超级英雄”,需要怎样的盔甲与工具?
  2. 用python画写轮眼_创意scratch编程课:火影经典忍术,宇智波佐助的写轮眼!
  3. android 检查xposed,[原创]利用Xposed躲过Xposed检测
  4. C语言编程>第二十七周 ① 请补充fun函数,该函数的功能是:寻找两个整数之间的所有素数(包括这两个整数),把结果保存在数组a中,函数返回素数的个数。
  5. 慕课-工程伦理第十二讲参考答案
  6. 平板电脑如何刷linux,平板电脑刷windows的方法是什么_如何把平板刷windows图文步骤...
  7. Android图形显示系统原理
  8. 广义相对论与量子力学的根本矛盾是什么?
  9. 身家破亿!86版「红孩儿」拒绝出道成学霸,已是中科院博士,名下52家公司
  10. Docker可视化工具 DockerUI 和 Shipyard 的区别