用MapX与C#开发地理信息系统
转:http://www.cnblogs.com/dachie/archive/2010/08/17/1801598.html
第四章 MapX与C#实例... 5
4.1 MapX图层建立... 5
4.1.1 MapX数据与地图的组织结构... 5
4.1.2 实例1:建立/添加一个用户自定义图层... 5
4.1.3 在MapX中使用栅格图层... 7
4.1.4 实例2:栅格图层的建立... 8
4.2 图元自动标注... 9
4.2.1 实例3:给图层加上自动标注功能... 9
4.3 MapX地图集... 9
4.3.1 什么是MapX地图集(Geoset)?. 9
4.3.2 实例4:打开已存在的地图集文件... 10
4.3.3 实例5:保存地图集... 10
4.4 内置工具的使用... 11
4.4.1 使用标准工具... 11
4.4.3 实例6:内置标准工具的使用... 11
4.5自定义工具... 12
4.5.1 创建自定义工具... 12
4.5.2 实例7:创建测量长度和面积自定义工具... 13
4.6 MapX地图符号样式的定制... 14
4.7在图层上添加自定义图元... 15
4.7.1 实例8:鼠标点击向图层上添加图元... 15
4.7.2 实例9:给定坐标向图层上自动添加图元... 17
4.8 获得图元属性... 20
4.8.1实例10:获取选定图元的属性... 20
4.9 图元的选取... 21
4.9.1 实例11:实现InfoTip功能... 21
4.10 图元属性的修改... 22
4.10.1 实例12:修改图元属性... 22
4.11 实例13:图元的查询... 23
4.12 实例14:鹰眼图的实现... 24
4.13 数据绑定... 26
4.14 GPS在GIS系统中的应用... 27
4.14.1定位信息的接收... 27
4.14.2定位信息的提取... 27
4.14.3定位信息在MapX中的显示... 28
4.14.4 实例15:GPS定位系统的应用... 28
4.15 多媒体信息在GIS系统中的应用... 33
4.15.1 GIS中嵌入多媒体的方法... 33
4.15.2 实例16:在MapX系统中嵌入多媒体数据... 33
第五章 MapX与Oracle结合... 35
5.1 Oracle数据库对GIS的支持... 35
5.1.1面向对象的数据库支持... 35
5.1.2.Oracle spatial组件的引入... 35
5.2 循序渐进学习Oracle Spatial在MapX中的应用... 36
5.2.1 oralce服务器的安装... 36
5.2.2 准备由Oracle Spatial存储的图层文件... 36
5.2.3 Easyloader上载工具... 36
5.2.4 图层信息在Oracle中的存储结构... 38
5.2.5用程序实现MapX图元到oracle数据库的上载... 42
5.2.6 用程序实现oracle数据表数据下载至MapX中显示... 44
5.2.7 图元样式的还原... 46
5.3 在网络环境下实现图层信息共享... 47
第六章 MapCtrl控件的开发方法... 57
6.1 主要功能... 57
6.2 开发步骤... 57
6.3 程序实现... 58
第七章 分发基于.net平台的MapX应用程序.. 91
7.1 .NET Framework 概述... 91
7.2 .NET Framework 的主要组件和功能... 92
7.2.1公共语言运行库... 92
7.2.2 .NET Framework 类库... 92
7.3 安装 .NET Framework. 93
7.4 Map客户安装... 93
7.5 制作安装程序... 93
第四章 MapX与C#实例
这一章我们通过若干专题来介绍用C#如何开发MapX应用程序。
4.1 MapX图层建立
4.1.1 MapX数据与地图的组织结构
MapX地图是由一个一个图层合成而来。 MapX 将其所有基础信息以 MapInfo表的形式组织起来;每一表都是一组 MapInfo 文件,用来在地图中建立一个图层。
.<Somefile>.tab:图层属性结构定义文件,该文件描述 MapInfo 表的结构。它是描述包含数据文件格式的小文本文件。
.<Somefile>.dat(.mdb、.aid 或 .dbf):图层属性记录文件,这些文件包含表格数据.可用记事本或相应的数据库管理软件打开浏览数据。
.<Somefile>.map:图层空间记录文件,该文件描述空间图形对象(如果该表没有任何地图对象,则该文件将不存在)。
.<Somefile>.id:图层索引文件,该文件是将数据与空间对象相链接的交叉引用文件(如果该表没有任何地图对象,则该文件将不存在)。
.<Somefile>.ind:它是索引文件.通过该索引文件,您可以使用 Find 对象搜索地图对象。
要创建图层就要了解这些内部机理,方能思路清晰。下面是一个创建自定义层的例子。
4.1.2 实例1:建立/添加一个用户自定义图层
在地图上建立一个用户自定义的图层,该图层上的每个图元包括图元编号、图元名称、图元描述、图元坐标等属性,并且生成一个数据集与该图层绑定。
public bool NewUserLayer(string layerName)
MapXLib.Fields flds=new MapXLib.FieldsClass();
flds.AddStringField("source",50,false);
flds.AddStringField("name",50,false);
flds.AddStringField("identity",50,false);
flds.AddStringField("description",50,false);
flds.AddStringField("foundTime",50,false);
flds.AddFloatField("objX",false);
flds.AddFloatField("objY",false);
layerInfo.AddParameter("Name",layerName);
layerInfo.AddParameter("Fields",flds);
layerInfo.AddParameter("AutoCreateDataset",1);
layerInfo.AddParameter("DatasetName","ds"+layerName);
if (!File.Exists(@appDirectory+"\\"+layerName+".tab"))
layerInfo.Type=MapXLib.LayerInfoTypeConstants.miLayerInfoTypeNewTable;
layerInfo.Type=MapXLib.LayerInfoTypeConstants.miLayerInfoTypeTab;
layer = axMap1.Layers.Add(layerInfo,1);
(2)MapXLib.LayerInfo对象是用来增加新层的一个非常好的方法,在layerInfo中具体定义该层的一些参数。
l layerInfo.AddParameter("Name","userDrawLayer"):指定该层的名字”userDrawLayer”,名字将会出现在图层控制对话框中。
l layerInfo.AddParameter("Fields",flds):指定该图层的属性字段集对象,即上面新定义的MapXLib.Fields对象。
l layerInfo.AddParameter("AutoCreateDataset",1):指定是否自动产生数据集,1自动产生,0不产生。有关数据集的概念,在后续部分再重点作介绍。
l layerInfo.AddParameter("DatasetName","dsUserLayer");指定数据集的名字“dsUserLayer”。
l axMap2.Layers.Add(layerInfo,1)语句:增加layerInfo所定义的新层,其中“1”代表增加至图层最上面。
编号 |
名称 |
描述 |
经度 |
纬度 |
01 |
北京市 |
中华人民共和国国首都 |
.. |
.. |
… |
… |
… |
… |
… |
(3)LabelProperties用来说明如何用数据集中的数据标注图层上每一个图元。
layer.LabelProperties.Dataset:指定数据集对象。
layer.LabelProperties.DataField:指定用数据集中哪个字段值标注图元。
layer.LabelProperties.Position:指定标注位置。
layer.LabelProperties.Style.TextFont.Size:指定标注的字体及大小等。
layer.LabelProperties.Offset:指定标注离图元中心的距离。
4.1.3 在MapX中使用栅格图层
4.1.3.1什么是栅格图象?
栅格图象是由多行微小的点(象素)组成的一种计算机化的图象。如果手头有扫描仪及扫描软件,可以通过扫描一幅纸张地图来创建栅格图象。完成地图扫描并将其保存于文件中后,即可在MapInfo中显示该文件。
有多种不同的栅格图象文件格式。MapInfo能够处理以下格式的栅格图象文件:JPEG、GIF、TIFF、PCX、BMP、TGA(Targa)和BIL(SPOT卫星图片)。
4.1.3.2什么是配准栅格图象?
栅格图层的应用在地理信息系统中也有重要作用。一般作为背景使用,特别是可作为鹰眼图的背景使用,可防止在改变视图时引起的刷新。
4.1.3.3配准栅格图像
若还没有在MapInfo Professional中显示过某个栅格图象,执行下述步骤配准该图象:
(2) 从“文件类型”下拉列表中选择“栅格图象”。MapInfo Professional显示栅格图象文件清单。
(4) 通过选择“投影”按钮并完成“选择投影”对话框来设定该图象的地图投影。配准栅格文件时,初始的投影方式就是表的缺省投影。
(5) 把鼠标光标移到对话框下半段的预览图象上,并移到一个已知地图坐标(例如经/纬度)的点,再单击鼠标按钮。MapInfo Professional显示“增加控制点”对话框。
(6) 通过输入对应于在地图图象上单击位置的地图坐标,完成“增加控制点”对话框。
记住,本初子午线以西的任何位置有负的经度,赤道以南的任何位置有负的纬度。因此,西经73度对应于X值-73。
所需的控制点数依赖于栅格图象的性质。如果不能确定地图投影或正在使用没有实际地图投影的图象,例如航空照片,也许要输入二十或更多控制点。
(8) 完成增加控制点后选择“确定”。MapInfo Professional把该栅格图象显示在地图窗口中。
完成“图象配准”对话框后,MapInfo Professional把配准信息保存到一个表文件(.tab)中。这样我们就可以象利用普通Mapinfo表文件一样来用这个栅格图层了。
4.1.4 实例2:栅格图层的建立
public bool LoadRasterLayer(string layerName)
int layerNumber=axMap1.Layers.Count;
axMap1.Layers.Add(layerName+".tab",layerNumber+1);
装载栅格图层与载载普通图层一样,用同样的语法结构Layers.Add()。
4.2 图元自动标注
对一个图元加上标注可直观的给用户识别地图上的每一个地理对象,在MapX中可设置自动标注图元和手工标注图元。
4.2.1 实例3:给图层加上自动标注功能
private void autoLabel(string layerName)
MapXLib.Layer layer=axMap1.Layers._Item(layerName);
MapXLib.Dataset ds=axMap1.DataSets._Item(“ds”+layerName);
layer.LabelProperties.Dataset =ds;
layer.LabelProperties.DataField =ds.Fields._Item(“name”);
layer.LabelProperties.Position=MapXLib.PositionConstants.miPositionBC;
layer.LabelProperties.Style.TextFont.Size=10;
layer.LabelProperties.Offset=4;
(1)程序中假定layer层在生成时已生成与之绑定的数据集,其名称为”ds”+layerName。具体作法请参见实例新建自定义图层。
(2)用LabelProperties对象来定义标注的内容,字体,位置等。例子中用数据集的name字段的内容来标注图元,标注位置在图元下方偏移4个单位,字体大小为10。
(3)layer.AutoLabel =true打开自动标注功能,若要关闭所有标注可简单地置标注的visible属性为false。
4.3 MapX地图集
4.3.1 什么是MapX地图集(Geoset)?
地图集即图层的的集合,MapX控件的Geoset属性即为要打开的地图集对象。地图集对象的扩展名为.gst。它可由MapX所带的工具Geoset Manager来生成,请读者自己一试。
.gst 是包含若干元数据关键字的文本文件,告诉 MapX 显示哪些表以及如何显示它们。
4.3.2 实例4:打开已存在的地图集文件
在硬盘中选择一个地图集文件.gst,然后在MapX中打开,并保存地图的初始属性如初始时的缩放比例及中心位置等。
openFileDialog1.DefaultExt ="*.gst";
openFileDialog1.Filter="geoset file (*.gst)|*.gst";
if (openFileDialog1.FileName=="")
axMap1.GeoSet=openFileDialog1.FileName;
4.3.3 实例5:保存地图集
在新建或添加一个图层后,地图集改变,在此时应保存改变后的地图集,以方便下次一次性打开所有图层,发挥geoset的作用。下面的程序实现这一功能。
saveFileDialog1.InitialDirectory=@appDirectory;
saveFileDialog1.Filter = "geoset files (*.gst)|*.gst";
if(saveFileDialog1.ShowDialog()==DialogResult.OK)
geosetFileName=saveFileDialog2.FileName;
axMap1.SaveMapAsGeoset(axMap1.Title.ToString(),@geosetFileName);
(1)appDirectory为应用程序目录变量,可用Directory.GetCurrentDirectory()来得到;
(2)saveFileDialog对话框来得到地图集的文件名及路径;
(3)saveMapAsGeoset()方法来保存地图集,其语法为void SaveMapAsGeoset ( System.String name,System.String fileSpec)
4.4 内置工具的使用
大多数地图绘制应用程序提供各种工具来协助完成常见的绘图任务(例如在地图上绘制线条)和导航任务(例如放大)。MapX 提供若干常见地图绘制工具,并且您还可以创建自己的定制工具。
4.4.1 使用标准工具
使用 MapX,您可以很容易地将常见工具栏按钮并入应用程序中。MapX 提供对若干常见地图绘制工具的内置支持,可实现大部分地图功能,包括:
• 令用户更改地图的比例和/ 或位置的导航工具(放大、缩小、平移、居中)。
miArrowTool = 1000: 单击标题或注释此外,在可编辑图层中移动选
miRadiusSelectTool = 1008 :扇形选择工具
miRectSelectTool = 1009 :矩形选择工具
miPolygonSelectTool = 1010:多边形选择工具
miAddPolylineTool = 1013:画折线工具
4.4.3 实例6:内置标准工具的使用
axMap2.CurrentTool=ToolConstants.miZoomInTool;
axMap2.ZoomTo(this.mapZoom,this.mapCenterX,this.mapCenterY);
axMap2.CurrentTool=MapXLib.ToolConstants.miPanTool;
MapXLib.Style style=new MapXLib.StyleClass();
axMap2.Layers.InsertionLayer=layerInsertion;
axMap2.CurrentTool=MapXLib.ToolConstants.miAddPointTool;
MapXLib.Style stylePolyLine=new MapXLib.StyleClass();
axMap2.DefaultStyle =stylePolyLine;
axMap2.Layers.InsertionLayer=layerInsertion;
axMap2.CurrentTool=MapXLib.ToolConstants.miAddPolylineTool;
MapXLib.Style styleRegion=new MapXLib.StyleClass();
axMap2.DefaultStyle =styleRegion;
axMap2.Layers.InsertionLayer=layerInsertion;
axMap2.CurrentTool=MapXLib.ToolConstants.miAddRegionTool;
(2)在上面增加图元的例程中, style.PickSymbol ()方法用来取得新图元的样式,包括大小.线型.颜色.填充方案等,以增加程序的灵活性;
(3)特别注意在增加图元时,不仅要设置当前图层为可编辑,而且要把当前层指定为图层集合的可插入层,即要指定图层集的insertionLayer属性。
4.5自定义工具
MapX内置工具给我们编程提供了很大的方便,但在一些情况下还远远不能满足用户需求,在这种情况下,我们就要进行自定义工具了。
4.5.1 创建自定义工具
4.5.2 实例7:创建测量长度和面积自定义工具
在GIS系统中,长度及面积的测量是一项重要功能,它也是典型的自定义工具的使用的例子,各种书中都有相应介绍,在这里就在c#下创建自定义长度测量及面积测量工具的例程介绍如下。
private const int miGetLength =100;//自定义用户工具:测量长度
private const int miGetArea =101;//自定义用户工具:测量面积
private void axMap1_PolyToolUsed(object sender, AxMapXLib.CMapXEvents_PolyToolUsedEvent e)
MapXLib.Points pts=(MapXLib.Points)e.points;
d+=axMap2.Distance(pt1.X,pt1.Y,pt2.X,pt2.Y);
statusBarPanel2.Text="距离:"+d.ToString();
MapXLib.Points pts=(MapXLib.Points)e.points;
MapXLib.FeatureFactory dd=axMap2.FeatureFactory;
MapXLib.Style style=axMap2.DefaultStyle;
statusBarPanel2.Text="面积:"+dd.CreateRegion(pts,style).Area.ToString();
4.6 MapX地图符号样式的定制
如图在mapinfo中运行mapbasic程序,选择symbol.mbx。
工具菜单下将会出现“创建新符号”,单击子菜单“新建一个”,出现符号编辑器,对新符号创建完成后按保存出现保存成功对话框。
注意:本人用的是mapinfo professional 7.0,若为以前的版本,可能会有所不同,具体请参考相关资料。
4.7在图层上添加自定义图元
4.7.1 实例8:鼠标点击向图层上添加图元
private const int miAddSymbol =106;//自定义用户工具:添加用户图元到图层,在类的变量声明部分定义
private void axMap1_ToolUsed(object sender, AxMapXLib.CMapXEvents_ToolUsedEvent e)
MapXLib.Point pnt=new MapXLib.PointClass();
MapXLib.RowValue rv=new MapXLib.RowValueClass();
MapXLib.RowValues rvs=new MapXLib.RowValuesClass();
MapXLib.FeatureFactory feaFac;
MapXLib.Style newStyle=new MapXLib.StyleClass();
feaFac = axMap2.FeatureFactory;
newStyle.SymbolType =MapXLib.SymbolTypeConstants.miSymbolTypeBitmap;//指定为位图样式
newStyle.SymbolBitmapSize=20;//指定图元大小
newStyle.SymbolBitmapName=bitmapfilename;//指定位图文件名
newStyle.SymbolBitmapTransparent=true;//指定位图透明,和图层融为一体
ftr= feaFac.CreateSymbol(pnt,newStyle);//用featuerFactory生成该位图图元
//******************************************************
//以下代码通过rowvalue和rowvalues来为新建图元设置所有属性
//******************************************************
dsUserLayer=axMap2.Layers._Item(1).DataSets._Item(1);//例程1中自动生成的dataset.
fldsUserLayer=dsUserLayer.Fields;
for(int j=1;j<=fldsUserLayer.Count;j++)
rv.Field=fldsUserLayer._Item(j);
rv.Field=fldsUserLayer._Item(j);
rv.Field=fldsUserLayer._Item(j);
rv.Field=fldsUserLayer._Item(j);
rv.Field=fldsUserLayer._Item(j);
userLayer.AddFeature(ftr,rvs);//向图层增加该图元
//下面是对确认按钮的编程,调用刚才实现的miAddSybol用户自定义工具
bitmapfilename=infoBitmapname;
axMap2.CurrentTool=(MapXLib.ToolConstants)miAddSymbol;
4.7.2 实例9:给定坐标向图层上自动添加图元
这种情况下不需要自定义miAddSymbol工具,直接编程实现,代码大致相同,示例如下:
public void AddUserSymbol(ref FeatureInfo featureInfo,string layerName)
//增加到userlayer后插入oracle表中,userName必须为工作层
MapXLib.Point pnt=new MapXLib.PointClass();
MapXLib.RowValue rv=new MapXLib.RowValueClass();
MapXLib.RowValues rvs=new MapXLib.RowValuesClass();
MapXLib.FeatureFactory feaFac;
MapXLib.Layer layer=axMap1.Layers._Item(layerName);
MapXLib.Style newStyle=new MapXLib.StyleClass();
feaFac = axMap1.FeatureFactory;
newStyle.SymbolType =MapXLib.SymbolTypeConstants.miSymbolTypeBitmap;
if (featureInfo.identity=="1")
{ newStyle.SymbolBitmapColor=(uint)MapXLib.ColorConstants.miColorBlue;
newStyle.SymbolBitmapOverrideColor=true;
else if(featureInfo.identity=="2")
newStyle.SymbolBitmapColor=(uint)MapXLib.ColorConstants.miColorGreen;
newStyle.SymbolBitmapOverrideColor=true;
{ newStyle.SymbolBitmapColor=(uint)MapXLib.ColorConstants.miColorRed ;
newStyle.SymbolBitmapOverrideColor=true;
newStyle.SymbolBitmapName=featureInfo.symbolFileName;
newStyle.SymbolBitmapTransparent=true;
axMap1.AutoRedraw = false;//禁止图层自动刷新
pnt.Set(featureInfo.point_x,featureInfo.point_y);
ftr= feaFac.CreateSymbol(pnt,newStyle);
//******************************************************
//以下代码通过rowvalue和rowvalues来为新建图元设置所有属性
//******************************************************
dsUserLayer=axMap1.DataSets._Item("ds"+layerName);
fldsUserLayer=dsUserLayer.Fields;
//MI_PRINX索引构成规则:number前2位加yymmddhhmmss
DateTime myDataTime=DateTime.Now;
if (featureInfo.source==null) featureInfo.source="6";
for(int j=1;j<=fldsUserLayer.Count;j++)
if(fldsUserLayer._Item(j).Name.ToUpper() =="MAINID")
rv.Field=fldsUserLayer._Item(j);
rv.Value=featureInfo.featureID;
if(fldsUserLayer._Item(j).Name.ToUpper() =="SOURCE")
rv.Field=fldsUserLayer._Item(j);
if(fldsUserLayer._Item(j).Name.ToUpper() =="NAME")
rv.Field=fldsUserLayer._Item(j);
if(fldsUserLayer._Item(j).Name.ToUpper() =="IDENTITY")
rv.Field=fldsUserLayer._Item(j);
rv.Value =featureInfo.identity;
if(fldsUserLayer._Item(j).Name.ToUpper() =="DESCRIPTION")
rv.Field=fldsUserLayer._Item(j);
rv.Value =featureInfo.description;
if(fldsUserLayer._Item(j).Name.ToUpper() =="FOUNDTIME")
rv.Field=fldsUserLayer._Item(j);
rv.Value =featureInfo.foundTime;
if(fldsUserLayer._Item(j).Name.ToUpper() =="MEDIA")
rv.Field=fldsUserLayer._Item(j);
if(fldsUserLayer._Item(j).Name.ToUpper() =="X")
rv.Field=fldsUserLayer._Item(j);
rv.Value =featureInfo.point_x;
if(fldsUserLayer._Item(j).Name.ToUpper() =="Y")
rv.Field=fldsUserLayer._Item(j);
rv.Value =featureInfo.point_y;
this.InsertIntoOracle(featureInfo,rownumber,ftr.Style,"symbol",ftr,layerName);
DeleteAllfeatures(userLayerName);
1.位图必须放在custSymb子目录下,且位图不支持24位以上真彩色, 大小最大48点。
(3)通过rowvalue.value指定该字段的值: rv.Value=caption;
(4)把每个rowvalue增加到rowvalues集合中去,该rowvalues代表该图元的所用属性;
(5)利用图层的addfeature(feature,rowvalues)方法增加新的图元。
这样我们可以用记事打开相应图层的.dat文件查看我们增加的新图元的所有属性。
4.8 获得图元属性
在地理信息系统获取某个图元的属性是最基本的功能之一,实现起来也比较简单。
4.8.1实例10:获取选定图元的属性
public string[] GetSymbolProperty(string layerName)
layer=axMap1.Layers._Item(layerName);
ds=axMap1.DataSets._Item("ds"+layerName);
symbolInfo=new string[fields.Count];
foreach(MapXLib.Feature ftr in layer.Selection)
for(int i=1;i<=fields.Count;i++)
layer.KeyField=fields._Item(i).Name;
symbolInfo[i-1]=ftr.KeyValue.ToString();
1.属性值的获得:首先设置图层的KeyField关键字段属性:layer.KeyField= ds.Fields._Item(j).Name;
然后利用图元的keyvalue即可得到图元该字段的值: ftr.KeyValue
for(int i=1;i<=fields.Count;i++)
3.在本例中将所有属性全转化为string类型存于字符串数组symbolInfo[]中。
4.9 图元的选取
图元选取利用MapX内置的各种选取工具即可,我们对地图的操作往往都是针对地图上所选取的图元进行的,所以许多操作都要在这个选取上作文章了。
4.9.1 实例11:实现InfoTip功能
private void axMap1_SelectionChanged(object sender, System.EventArgs e)
MapXLib.Layer layer=axMap2.Layers._Item(1);
MapXLib.Dataset ds=axMap2.DataSets._Item(1);
foreach(MapXLib.Feature ftr in layer.Selection)
for(int j=1;j<=ds.Fields.Count;j++)
layer.KeyField =ds.Fields._Item(j).Name;
symbolProperty[j-1]=ftr.KeyValue.ToString();
msg+= layer.KeyField+":"+ symbolProperty[j-1]+"\n";
toolTip1.SetToolTip(this.axMap1,msg);
注: (1)symbolProperty[]为一字符串数组,存储图元所有属性。
(2)例子中用了c#工具箱中的toolTip对象,巧妙的实现了信息提示.关于tooltip对象详细说明建议读者查帮助。
4.10 图元属性的修改
4.10.1 实例12:修改图元属性
MapXLib.RowValues rvs=new MapXLib.RowValuesClass();
MapXLib.Layer layer=axMap2.Layers._Item(1);
MapXLib.Dataset ds=axMap2.DataSets._Item("dsUserLayer");
for(int j=1;j<=ds.Fields.Count;j++)
layer.KeyField =ds.Fields._Item(j).Name;
4.11 实例13:图元的查询
下面的例程实现一个万能模糊查询,即给定一个查找关键字keyStr,然后可查出图元属性中包含有有关键字keyStr的图元,而不管是哪个属性字段。
public void searchSymbols(string keyStr)
MapXLib.Layer layer=axMap2.Layers._Item(1);
layer.Selection.ClearSelection();//清空selection集合
MapXLib.Variables vs=new MapXLib.VariablesClass();
ftrs=layer.Search("objName LIKE"+" "+"\"%"+keyStr+"%\"",vs);
//查找名称属性中包含keyStr的的图元,并存于ftrs集合中
ftrs1=layer.Search("objNumber LIKE"+" "+"\"%"+keyStr+"%\"",vs);
//查找编号属性中包含keyStr的的图元,并存于ftrs1集合中
ftrs.Add(ftrs1);//把ftrs1集合合并到ftrs集合中
MessageBox.Show("共有满足条件的图元"+ftrs.Count.ToString()+"个!");
//把查找到的所有图元存到selection集合中,以便使其高亮显示,处于选中状态。
4.12 实例14:鹰眼图的实现
鹰眼图的实现能使电子地图在功能及界面上锦上添花,各种媒体上都有一些介绍,下面介绍用C#实现的鹰眼图功能。
if (!File.Exists(@appDirectory+"\\mapSmall.tab"))
m_Layer=mapSmall.Layers.CreateLayer("RectLayer",@appDirectory+
"\\mapSmall.tab",1,32,mapSmall.NumericCoordSys);
m_Layer = mapSmall.Layers.Add(@appDirectory+"\\mapSmall.tab",1);
mapSmall.Layers.InsertionLayer=m_Layer;
private void axMap1_MapViewChanged(object sender, System.EventArgs e)
MapXLib.FeatureFactory feaFact;
feaFact=mapSmall.FeatureFactory;
MapXLib.Points tempPnts=new MapXLib.PointsClass();
MapXLib.Style tempStyle=new MapXLib.StyleClass();
double MapX=0,mapY=0,mapWidth=0,mapHeight=0,MapX1=0,mapY1=0;
float screenX,screenY,screenWidth,screenHeight,screenX1,screenY1;
screenWidth=axMap2.Bounds.Width;
screenHeight=axMap2.Bounds.Height;
screenY1=screenY+screenHeight;
axMap2.ConvertCoord(ref screenX,ref screenY,ref MapX,ref mapY,
MapXLib.ConversionConstants.miScreenToMap);
axMap2.ConvertCoord(ref screenX1,ref screenY1,ref MapX1,ref mapY1,
MapXLib.ConversionConstants.miScreenToMap);
tempStyle.RegionBorderColor=255;
MapXLib.Points pts=new MapXLib.PointsClass();
pts.AddXY(MapX+mapWidth,mapY,2);
pts.AddXY(MapX+mapWidth,mapY+mapHeight,3);
pts.AddXY(MapX,mapY+mapHeight,4);
tempFea = feaFact.CreateRegion(pts,tempStyle);
m_Fea = m_Layer.AddFeature(tempFea,new MapXLib.RowValuesClass());
m_Fea.Parts._Item(1).RemoveAll();
m_Fea.Parts._Item(1).AddXY(MapX,mapY,1);
m_Fea.Parts._Item(1).AddXY(MapX+mapWidth,mapY,2);
m_Fea.Parts._Item(1).AddXY(MapX+mapWidth,mapY+mapHeight,3);
m_Fea.Parts._Item(1).AddXY(MapX,mapY+mapHeight,4);
m_Fea.Update(true,new MapXLib.RowValuesClass());
void axMap2_MouseDownEvent(object sender,AxMapXLib.CMapXEvents_MouseDownEvent e)
axMap2.ConvertCoord(ref e.x,ref e.y,ref MapX,ref MapY,
MapXLib.ConversionConstants.miScreenToMap);
(1)由主图视图改变影响鹰眼图矩形框的重绘,代码实现在主图的viewchanged事件中。
(2)在鹰眼图中单击鼠标,把单击处的位置点作为主图的中心点重绘主图。代码实现在鹰眼图的mousedownevent事件中。
(4)mapSmall代表鹰眼图控件,mapLarge代表主图控件。
(6)注意convertCoord()函数的用法,请参考相关资料,注意其中第五个参数的用法。
请读者仔细领会其中的机理。本例子只给了视图范围同步问题,没有给出编辑同步问题,即在主图中增加一个图元,在鹰眼图中同步增加一个点。留给读者自己练习,相信一定不会难住聪明的读者。
4.13 数据绑定
(1)用layerinfo对象增加层时自动产生与之绑定的数据集 其中相应语句为
layerInfo.AddParameter("AutoCreateDataset",1);
layerInfo.AddParameter("DatasetName","dsUserLayer");
具体参见例程1部分。利用这种方法简单也非常方便,可以满足大部分应用。
(2)利用axMap1.DataSets.Add方法建立数据绑定
userLayer=axMap1.Layers._Item(1);
userLayer.LabelProperties.Dataset =dsUserLayer;
userLayer.LabelProperties.DataField =dsUserLayer.Fields._Item(2);
上面代码的关键部分是dsUserLayer=axMap1.DataSets.Add(
MapXLib.DatasetTypeConstants.miDataSetLayer,userLayer,"userdrawlayer",0,
4.14 GPS在GIS系统中的应用
4.14.1定位信息的接收
GPS定位信息接收系统主要由GPS接收天线、变频器、信号通道、微处理器、存储器以及电源等部分组成。GPS定位信息一般用RS-232串口将定位信息从GPS接收机传送到计算机中进行信息提取处理。
4.14.2定位信息的提取
本文以GARMIN GPS天线板为例来介绍GPS帧结构。GARMIN GPS接收到的数据帧主要由帧头、帧尾和帧内数据组成,根据数据帧的不同,帧头也不相同,主要有"$GPGGA"、"$GPGSA"、"$GPGSV"以及"$GPRMC"等。这些帧头标识了后续帧内数据的组成结构,各帧均以回车符和换行符作为帧尾标识一帧的结束。对于通常的情况,我们所关心的定位数据如经纬度、速度、时间等均可以从"$GPRMC"帧中获取得到,该帧的结构及各字段释义如下:
$GPRMC,<1>,<2>,<3>,<4>,<5>,<6>,<7>,<8>,<9>,<10>,<11>*hh
<1> 当前位置的格林尼治时间,格式为hhmmss
<2> 状态, A 为有效位置, V为非有效接收警告,即当前天线视野上方的卫星个数少于3颗。
<3> 纬度, 格式为ddmm.mmmm
<4> 标明南北半球, N 为北半球、S为南半球
<5> 经度,格式为dddmm.mmmm
<6> 标明东西半球,E为东半球、W为西半球
<7> 地面上的速度,范围为0.0到999.9
<8> 方位角,范围为000.0到 359.9 度
<9> 日期, 格式为ddmmyy
<10> 地磁变化,从000.0到 180.0 度
<11> 地磁变化方向,为E 或 W
至于其他几种帧格式,除了特殊用途外,平时并不常用,虽然接收机也在源源不断地向主机发送各种数据帧,但在处理时一般先通过对帧头的判断而只对"$GPRMC"帧进行数据的提取处理。如果情况特殊,需要从其他帧获取数据,处理方法与之也是完全类似的。由于帧内各数据段由逗号分割,因此在处理缓存数据时一般是通过搜寻ASCII码"$"来判断是否是帧头,在对帧头的类别进行识别后再通过对所经历逗号个数的计数来判断出当前正在处理的是哪一种定位导航参数,并作出相应的处理。
4.14.3定位信息在MapX中的显示
在MapX应用程序中我们只需把接收到的经纬度值赋给所定位图元的位置属性,即可观察到图元的移动轨迹。
4.14.4 实例15:GPS定位系统的应用
4.14.4.1程序功能
演示GPS定位信息的接收提取。
4.14.4.2 程序实现
在Form上添加串口通信控件及若干按钮和输入框,如下图:
然后编写各功能代码,代码如下:
namespace GPS
{
public struct GPSInfo
{
public double latitude; //纬度(分)
public char southornorth; //北纬(true)或南纬(false)
public double longitude; //经度(分)
public char eastorwest; //东经(true)或西经(false)
public string height; //高度(米)
public DateTime acceptTime; //接收时间
public string speed; //车辆的速度
public bool valid; //是否可信
}
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.TextBox textBox4;
private System.Windows.Forms.TextBox textBox3;
private System.Windows.Forms.TextBox textBox2;
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.Label label5;
private AxMSCommLib.AxMSComm axMSComm1;
private System.Windows.Forms.Button startRecieve;
private System.Windows.Forms.Button stopRecieve;
GPSInfo gif=new GPSInfo ();
private System.Windows.Forms.RichTextBox richTextBox1;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.TextBox textBox5;
private System.ComponentModel.Container components = null;
public GPSInfo GetGPSInfo()
{
return gif;
}
//开始接收
private void startRecieve_Click(object sender, System.EventArgs e)
{
if(!axMSComm1.PortOpen)
axMSComm1.PortOpen=true;
axMSComm1.Update();
}
停止接收
private void stopRecieve_Click(object sender, System.EventArgs e)
{
if(axMSComm1.PortOpen)
axMSComm1.PortOpen=false;
axMSComm1.Update();
}
//对接收到的GPS信息进行提取,并显示在表单中
private void axMSComm1_OnComm(object sender, System.EventArgs e)
{
string m_comdata ="";
m_comdata=(string)axMSComm1.Input;
int length,i;
byte []data=new byte [1024];
length=m_comdata.Length;
string m_zjz;
m_zjz=m_comdata ;
//寻找GPS信号的头标志
int s;
s=m_zjz.IndexOf("$GPRMC,");
string m_gps;
//NUM为所提取GPS信号的长度
m_gps=m_zjz.Substring (s,m_zjz.Length -s);
int x;
x=m_gps.Length ;
string m_sTime="",m_sPositionY="",m_sPositionX="",m_sDate="";
char ns=' ',ew=' ';
string spd="";
bool valid=false;
int index=0;
for(i=0;(index<11) && (m_gps[i]!=10);i++) //帧尾
{
if(m_gps[i]==',') //逗号计数
index++;
else
{
switch(index)
{
case 1: //提取出时间
m_sTime+=m_gps[i];
break;
case 2:
//判断数据是否可信(当GPS天线能接收到有3颗GPS卫星时为A,可信)
if(m_gps[i]=='A')
{
valid=true;
}
else
valid=false;
break;
case 3: //提取出纬度
m_sPositionY+=m_gps[i];
break;
case 4://南北纬
ns=m_gps[i];
break;
case 5: //提取出经度
m_sPositionX+=m_gps[i];
break;
case 6://东西经
ew=m_gps[i];
break;
case 7:
spd+=m_gps[i];
break;
case 9: //提取出日期
m_sDate+=m_gps[i];
break;
default:
break;
}
}
}
//时间
int day=Int32.Parse (m_sDate.Substring (0,2));
int month=Int32.Parse (m_sDate.Substring (2,2));
int year=Int32.Parse (m_sDate.Substring (4,2))+2000;
int hour1=Int32.Parse (m_sTime.Substring (0,2));
int minute1=Int32.Parse (m_sTime.Substring (2,2));
int second1=Int32.Parse (m_sTime.Substring (4,2));
int hour=23-hour1;
int minute=59-minute1;
int second=60-second1;
gif.acceptTime =new DateTime (year,month,day,hour,minute,second);
gif.acceptTime .AddHours (8);
//有效性
gif.valid =valid;
if(!gif.valid)
{
MessageBox.Show("接收卫星太少,不能定位!");
}
//南北纬
gif.southornorth =ns;
gif.speed=spd;
//东西经
gif.eastorwest =ew;
//纬度
gif.latitude=Int32.Parse (m_sPositionY.Substring (0,2))+double.Parse (m_sPositionY.Substring (2,7))/60; //前面是度,后面是分
//经度
if(m_sPositionX.Length ==10) //超过九十度
{
gif.longitude=Int32.Parse (m_sPositionX.Substring (0,3))+double.Parse (m_sPositionX.Substring (3,7))/60;
}
if(m_sPositionX.Length ==9) //小于九十度
{
gif.longitude=Int32.Parse (m_sPositionX.Substring (0,2))+double.Parse (m_sPositionX.Substring (2,7))/60;
}
textBox2.Text=gif.latitude.ToString().Substring(0,7)+" "+gif.southornorth.ToString();
textBox1.Text=gif.longitude.ToString().Substring(0,8)+" "+gif.eastorwest.ToString();
textBox3.Text=gif.acceptTime.ToString();
textBox4.Text=gif.speed.ToString();
int s2;
s2=m_zjz.IndexOf("$GPGGA,");
string m_gpsheigth=m_zjz.Substring (s2,m_zjz.Length -s2);
int index1=0;
int l=0;
string gps_height="";
for(l=0;(index1<11) && (m_gps[l]!=10);l++) //帧尾
{
if(m_gps[l]==',')
index1++;
else
{
switch(index1)
{
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
case 5:
break;
case 6:
break;
case 7:
break;
case 8:
break;
case 11:
gps_height+=m_gps[l];
break;
}
}
}
gif.height=gps_height;
textBox5.Text=gif.height.ToString();
}
//串口配置初始化
private void Form1_Load(object sender, System.EventArgs e)
{
axMSComm1.CommPort=1;
axMSComm1.Settings="4800,N,8,1";
axMSComm1.InputLen=0;
axMSComm1.RThreshold=100;
}
}
}
4.15 多媒体信息在GIS系统中的应用
将多媒体数据嵌入GIS系统,必将大大提升GIS系统的功能,同时提高了用户的音视觉效果。
4.15.1 GIS中嵌入多媒体的方法
1.在数据库中存储多媒体数据所对应文件的路径和文件名,在需要时检索出该多媒体文件,然后用内置功能或外挂程序来播放。
2.直接存储多媒体数据的二进制格式到数据库,在需要时将该数据读出进行处理。
下面我们利用比较简便的第一种方法,将地图上的图元同多媒体数据文件关联起来,多媒体信息限定为文字、图片、视频和声音四种。
4.15.2 实例16:在MapX系统中嵌入多媒体数据
在新建图层时增加一字段,专门存储多媒体数据的路径,在访问图元时,读取该多媒体字段内容,根据文件类型,启动相应的打开程序来打开多媒体文件。
MapXLib.Fields flds=new MapXLib.FieldsClass();
flds.AddStringField("name",50,false);
flds.AddStringField("media",50,false);//存储多媒体文件路径
layerInfo.AddParameter("Fields",flds);
layer = axMap1.Layers.Add(layerInfo,1);
layer.KeyField=fields._Item(“media”).Name;
string mediaFileName=ftr.KeyValue;
int startindex=symbol.IndexOf(".")+1;
if (substring(mediaFileName, startindex,3)==”txt”)//读取多媒体文件扩展名
Process.Start(“notepad.exe”, mediaFileName);
elseif(substring(mediaFileName, startindex,3)==”.jpg”)
Process.Start(“mspaint.exe”, mediaFileName);
Process.Start(“msplayer2.exe”, mediaFileName);
1. substring(mediaFileName, startindex,3):用来判断多媒体文件的类型,根据不同类型,用不同的应用程序打开。
第五章 MapX与Oracle结合
把MapX与oracle的结合作为单独一章节,因为笔者觉得它非常重要。Oracle作为数据库界的泰斗,其强大面向对象的数据库功能如果能和MapX结合起来,将起到珠联璧合的作用。
我们知道,地理信息系统处理的数据包括包括两部分,一是与该图元所占据的空间位置相关的空间数据,另一个是该图元的属性数据。一般作法是将两部分分开处理:空间数据以文件形式存储,如mapinfo的.map文件;属性数据以关系数据库形式存储或以文本文件形式存储,如mapinfo的.dat文件。这种方式在单用户的情况下,基本上可以满足要求,然而对于多用户下,在分布式网络平台上使用的GIS系统,就难以满足地理信息共享,并发控制及安全性的要求。如果能找到一种数据库,把空间数据和属性数据统一存储管理,将会对GIS系统的应用提高到一个更加高的水平上来。我们称具有这种功能的数据库为空间数据库。而Oracle数据库就有这样一种能力来实现空间数据的存储。
5.1 Oracle数据库对GIS的支持
为什么要在MapX用Oracle,避开其卓越性能及缜密的安全性不谈,我认为它只少有两点非常适合mapinfo产品。
5.1.1面向对象的数据库支持
5.1.2.Oracle spatial组件的引入
Oracle9i 和 Oracle Spatial 的具体特性包括(摘自oracle官方网站):
l 空间操作和函数,包括层限制和集合(例如,并集和用户定义的集合)
l 支持异种数据无缝集成(融合)的工具,包括投影管理和坐标转换
l 与 Oracle9i Application Server 无线版本集成
5.2 循序渐进学习Oracle Spatial在MapX中的应用
5.2.1 oralce服务器的安装
5.2.2 准备由Oracle Spatial存储的图层文件
5.2.3 Easyloader上载工具
在网上下载一个与oracle版本相对应的图层数据上载软件Easyloader,下载地址www.mapinfo.com 。Mapinfo Professional中也会自带。
确认输入正确后,单击ok button,连接信息将会填充到DBMS,Database及user域。
5.2.3.3 选择上载参数 (1)Append to Table/Replace(Create) Table:追加到已有表还是新建表或替代已有表。选择第二项新建或替代表。
(2)Append All to One:把所有mapinfo表追加到数据库中的一个表中,前提是所有的表结构要一致,默认。
(3)Grant Public Access:对服务器数据表授予公开访问权限,默认。
(4)Exclusive Use of Tables:加速表的上载时间,默认。
(5)Create Unique Index:为上载后的表创建唯一索引,该索引列的字段名为mi_prinx;选择该选项。
(6)Create Spatial Index:创建空间索引,加速空间对象的查找,默认。
单击Upload button开始上载过程,并显示上载进度,若完成,显示完成信息。
5.2.4 图层信息在Oracle中的存储结构
上载成功后,Oracle数据库将会新增一个MAPCATALOG表和一个图层数据表。
5.2.4.1 MAPINFO_MAPCATALOG表
Oracle数据库新增了MAPINFO表空间,该空间中多了一个MAPINFO_MAPCATALOG表。该表的结构如下: SPATIALTYPE FLOAT(126) 空间对象类型
SPATIALCOLUMN CHAR(32) 表中存储空间对象的那一列的列名
COORDINATESYSTEM CHAR(254) 指定图层使用的坐标系统
TYPE |
TABLENAME |
OWNER |
SPATIALCOLUMN |
… |
COOR |
SYMBOL |
… |
13.3 |
ASIACAPS |
SYSTEM |
GEOLOC |
… |
… |
Pen (1, 2, 0) |
… |
13.3 |
USERDRAWLAYER |
SYSTEM |
GEOLOC |
… |
… |
Symbol ("zhs.bmp",0,20,0) |
… |
我们再看一下第二个变化即我们上载了userdrawlayer层后的所得到的userdrawlayer
5.2.4.2 图层数据表
在SYSTEM表空间新增了userdrawlayer图层数据表。打开SYSTEM表空间,找到userdrawlayer数据表,该表的结构为:
OBJNUMBER |
OBJNAME |
OBJDSCR |
… |
MI_RENDITION |
MI_PRINX |
GEOLOC |
01001 |
市中心医院 |
大型中西医结合医院… |
… |
symbol ("hospial.bmp",0,20,1) |
1 |
|
01002 |
解放路 |
全长4公里,西起… |
… |
pen (1,1,0) |
2 |
|
01003 |
西湖 |
著名旅游胜地,总面积… |
… |
Pen (1, 2, 0) Brush (2, 16777215, 16777215) |
3 |
|
… |
… |
… |
… |
1.MI_PRINX:索引字段,为每个图元产生一唯一索引,这是我们用easyloader上载时指定参数create unique index的结果。
2.MI_RENDITION:从表数据可以看出,它是用来描述图元的样式的。表中是三个代表性图元的样式,分别是医院(点图元),街道(线样式)和水域(面样式)。下面就点线面样式定义语法介绍如下:
点符号样式用symbol子句来指定,symbol子句有三种形式:一种是指为MapInfo 3.0-style符号;一种是指定为TrueType字体符号;一种是指定为采用位图的符号。其语法列于下表:
符号类型 |
语法 |
例子 |
MapInfo 3.0-style |
Symbol(shape, color, size) |
Symbol(35,0,12) |
TrueType font |
Symbol(shape,color,size,font,fontstyle,rotation) |
Symbol(64,255,12,"MapInfo Weather" ,17,0) |
bitmap |
Symbol(bitmapname,color,size,customstyle) |
Symbol("sign.bmp", 255, 18, 0) |
Pen(thickness, pattern, color),例如:Pen(1, 2, 0)。
Brush(pattern,color,backgroundcolor),例如:Brush(2, 255, 65535)。
注意:如果要绘制一个区域图元时,要把pen子句和brush子句结合起来使用,用pen子句指定区域边界样式,用brush子句指定区域内的填充样式。
3.GEOLOC: 存储图元的空间信息,关于GEOLOC字段请看下一节“空间对象类型SDO_GEOMETRY”专题。
5.2.4.3 空间对象类型SDO_GEOMETRY
SQL>select GEOLOC from USERDRAWLAYER;
回车后将会显示图层中每一个图元的空间数据,下面选出的是点、线、面三种典型图元的GEOLOC值。
GEOLOC(SDO_GTYPE, SDO_SRID, SDO_POINT(X, Y, Z), SDO_ELEM_INFO, SDO_ORDINATES)
-----------------------------------------------------------------------------
SDO_GEOMETRY(2001, NULL, SDO_POINT_TYPE(-137.5192, 32.969427, NULL), NULL, NULL)
GEOLOC(SDO_GTYPE, SDO_SRID, SDO_POINT(X, Y, Z), SDO_ELEM_INFO, SDO_ORDINATES)
-----------------------------------------------------------------------------
GEOLOC(SDO_GTYPE, SDO_SRID, SDO_POINT(X, Y, Z), SDO_ELEM_INFO, SDO_ORDINATES)
-----------------------------------------------------------------------------
SDO_GEOMETRY(2003, NULL, SDO_POINT_TYPE(56.7574949, 3.18633104, NULL), SDO_ELEM_
INFO_ARRAY(1, 1003, 1), SDO_ORDINATE_ARRAY(35.8301621, 16.007866, 67.6552619, -1
4.205263, 77.6848291, 16.577925, 35.8301621, 16.007866))
可以看出,空间实体的空间信息是存储在一个字段名为GEOLOC的列中,该列的类型为SDO_GEOMETRY。下面对这种存储空间对象的列的类型定义作出语法解释。
SDO_SRID:指定坐标系统代码,数值型。如8307,代表Longitude / Latitude (WGS 84)坐标系统。null值表示没有指定坐标系统。
SDO_POINT(X, Y, Z):以三维组元指定点图元的空间位置。对于线图元和面图元,该属性被忽略。
通过上面的解释,大家就不难看懂每个图元的GEOLOC字段的值的含义了,同时我们也可以通过编程实现空间对象向Oracle数据库的存储了。
5.2.4.4 手工创建MapCataLog表及在OracleSpatial下的图层表
如果没有Easyloader这个工具,我们就要手工方式来创建这两个表了,表结构同上面所讲,然后用sql语句创建,并做必要的权限控制。以下为创建脚本:
CREATE USER "MAPINFO" PROFILE "DEFAULT" IDENTIFIED BY
TABLESPACE "SYSTEM" ACCOUNT UNLOCK;
//创建mapinfo.mapinfo_mapcatalog表
CREATE TABLE "MAPINFO"."MAPINFO_MAPCATALOG"("SPATIALTYPE" FLOAT(
126), "TABLENAME" CHAR(32), "OWNERNAME" CHAR(32),
"SPATIALCOLUMN" CHAR(32), "DB_X_LL" FLOAT(126), "DB_Y_LL" FLOAT(
126), "DB_X_UR" FLOAT(126), "DB_Y_UR" FLOAT(126),
"COORDINATESYSTEM" CHAR(254), "SYMBOL" CHAR(254), "XCOLUMNNAME"
CHAR(32), "YCOLUMNNAME" CHAR(32))
TABLESPACE "SYSTEM" PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS
STORAGE ( INITIAL 64K NEXT 64K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 50 FREELISTS 1 FREELIST GROUPS 1)
CREATE UNIQUE INDEX "MAPINFO"."MAPCATALOG_IDX"
ON "MAPINFO"."MAPINFO_MAPCATALOG"("TABLENAME", "OWNERNAME")
TABLESPACE "SYSTEM" PCTFREE 10 INITRANS 2 MAXTRANS 255
STORAGE ( INITIAL 64K NEXT 64K MINEXTENTS 1 MAXEXTENTS
2147483645 PCTINCREASE 50 FREELISTS 1)
//授权访问mapinfo.mapinfo_mapcatalog表
grant select, insert, update on mapinfo.mapinfo_mapcatalog to public;
CREATE TABLE "SYSTEM"."USERLAYER"("SOURCE" VARCHAR2(50), "NAME"
VARCHAR2(50), "IDENTITY" VARCHAR2(50), "DESCRIPTION" VARCHAR2(
50), "FOUNDTIME" VARCHAR2(50), "OBJX" NUMBER, "OBJY" NUMBER,
"MI_RENDITION" VARCHAR2(254), "MI_PRINX" NUMBER, "GEOLOC"
"MDSYS"."SDO_GEOMETRY", "MEDIA" VARCHAR2(100))
TABLESPACE "TOOLS" PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
STORAGE ( INITIAL 32K NEXT 32K MINEXTENTS 1 MAXEXTENTS 4096
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1)
5.2.5用程序实现MapX图元到oracle数据库的上载
rendition="symbol ("+"\""+style.SymbolBitmapName+"\""+","+
style.SymbolBitmapColor.GetHashCode()+","+
style.SymbolBitmapSize+","+style.SymbolType.GetHashCode()+")";
// geoloc="MDSYS.SDO_GEOMETRY(2001,NULL,MDSYS.SDO_POINT_TYPE("+
x.ToString()+","+y.ToString()+","+"NULL),"+"NULL,NULL)";
rendition="pen ("+style.LineWidth+","+style.LineStyle.GetHashCode()+
geoloc="MDSYS.SDO_GEOMETRY(2002,NULL,MDSYS.SDO_POINT_TYPE(0,0,NULL),
MDSYS.SDO_ELEM_INFO_ARRAY(1, 2, 1),MDSYS.SDO_ORDINATE_ARRAY(";
for(int i=1;i<=ftr.Parts._Item(1).Count;i++)
geoloc+=ftr.Parts._Item(1)._Item(i).X.ToString()+","+
ftr.Parts._Item(1)._Item(i).Y.ToString()+",";
geoloc=geoloc.Substring(0,geoloc.Length-1);
x.ToString()+","+y.ToString()+","+"NULL),"+
"MDSYS.SDO_ELEM_INFO_ARRAY(1, 2,1),"+"MDSYS.SDO_ORDINATE_ARRAY(";
for(int j=1;j<=ftr.Parts._Item(1).Count;j++)
geoloc+=ftr.Parts._Item(1)._Item(j).X.ToString()+","+ftr.Parts._Item(1)._Item(j).Y.ToString()+",";
geoloc=geoloc.Substring(1,geoloc.Length-1);
OracleConnection myConn = new OracleConnection(myConnString);
OracleCommand myOracleCommand = new OracleCommand(myInsertQuery);
myOracleCommand.Connection = myConn;
myOracleCommand.ExecuteNonQuery();
5.2.6 用程序实现oracle数据表数据下载至MapX中显示
在MapX中生成一新的图层,该图层的所有图元信息均来自Oracle图层数据表。
//*********************************************
//从Oracle Spatial加载空间数据以生成新的图层
//*********************************************
string conn="UID=system;PWD=manager;srvr=caiqin";
string querystr="select * from SYSTEM.USERDRAWLAYER";
LayerInfoObject.AddParameter("name","DrawLayerFromDB");
LayerInfoObject.AddParameter("ConnectString",conn);
LayerInfoObject.AddParameter("Query",querystr);
LayerInfoObject.AddParameter("toolkit","ORAINET");
layer=axMap2.Layers.Add(LayerInfoObject,1);
layer.LabelProperties.Dataset =layer.DataSets._Item(1);
layer.LabelProperties.DataField =layer.DataSets._Item(1).Fields._Item(2);
layer.LabelProperties.Position=MapXLib.PositionConstants.miPositionBC;
layer.LabelProperties.Style.TextFont.Size=10;
layer.LabelProperties.Offset=4;
这里我们再次利用Layerinfo对象来实现从MapX访问oracle数据,并进行显示。下面针对Layerinfo对象作一简单介绍。
Layerinfo.type |
Value |
description |
miLayerInfoTypeTab |
0 |
已存在的mapinfo tab表 |
miLayerInfoTypeUserDraw |
1 |
用户绘制图层 |
miLayerInfoTypeRaster |
2 |
栅格图层 |
miLayerInfoTypeShape |
3 |
Shape文件(.shp) |
miLayerInfoTypeServer |
4 |
数据库服务器 |
miLayerInfoTypeGeodictUserName |
5 |
由geodictionaty管理的图层 |
miLayerInfoTypeTemp |
6 |
创建临时图层 |
miLayerInfoTypeNewTable |
7 |
创建新的mapinfo图层 |
另外,Layerinfo对象有许多参数来具体描述欲添加的图层,这些参数随type取值的不同而不同,具体请参见MapX5.0帮助文档。
本例是访问Oracle数据库中的地理信息,所以type取值应为miLayerInfoTypeServer,在这种方式下,layerinfo应包含如下参数:
参数名称 |
必填 |
参数说明 |
Name |
Yes |
新增图层的名称 |
ConnectString |
Yes |
DBMS连接字符串 |
Query |
Yes |
Sql查询语句 |
ToolKit |
Yes |
工具包名称,取值ODBC或ORAINET |
Cache |
No |
是否启用缓存管理 |
MBRSearch |
No |
是否利用最小外接矩形查找 |
AutoCreateDataset |
No |
是否自动产生数据集实现数据绑定 |
DatasetName |
No |
数据集的名称 |
Visible |
No |
新层是否可见,默认可见 |
LayerInfoObject.AddParameter(参数名称,参数取值);
(2)本例程中使用了AutoCreateDataset参数取值为1,自动产生一数据集DrawLayerFromDB,实现新层与Oracle数据库的数据绑定。
5.2.7 图元样式的还原
前面在上载图元时,我们已经把每个图元的样式保存在了表的MI_RENDITION字段中,所以读出时我们就可利用这个字段把每个图元的样式还原出来。下面的函数就是还原图元样式的代码。
MapXLib.Dataset dsUserLayer=axMap2.DataSets._Item("DrawLayerFromDB");
MapXLib.Fields fldsUserLayer=dsUserLayer.Fields;
foreach(MapXLib.Feature fea in axMap2.Layers._Item("DrawLayerFromDB").AllFeatures)
rvs=dsUserLayer.get_RowValues(fea);
string symbol=rv.Value.ToString();
if (symbol.Substring(0,3)=="sym")
int startindex=symbol.IndexOf("\"")+1;
int lastindex=symbol.LastIndexOf("\"");
int len=lastindex - startindex;
string bitmapfile=symbol.Substring(startindex,len);
fea.Style.SymbolBitmapName=bitmapfile;
if (symbol.Substring(0,3)=="pen")
int startindex1=symbol.IndexOf(",");
int lastindex1=symbol.LastIndexOf(",");
int len1=lastindex1 - startindex1-1;
int startindexkh=symbol.IndexOf("(");
int lastindexkh=symbol.LastIndexOf(")");
(3) rvs=dsUserLayer.get_RowValues(fea):得到每个图元的所有字段信息rowvalues();
rv=rvs._Item("MI_RENDITION"):得到每个图元的样式;
(4)用字符串运算函数提取出样式SymbolBitmapName,LineStyle,linewidth,lineColor等。
(6)样式修改后,用feature.update()更新图元;
5.3 在网络环境下实现图层信息共享
ID |
source |
… |
filename |
x |
y |
C1 |
C2 |
C3 |
C4 |
… |
1 |
C1 |
… |
Home.bmp |
… |
… |
old |
new |
new |
new |
… |
2 |
C1 |
… |
Hospital.bmp |
... |
… |
old |
new |
old |
old |
… |
3 |
C1 |
… |
Home.bmp |
… |
… |
old |
modified |
modified |
modified |
… |
4 |
C1 |
… |
Hospital.bmp |
… |
… |
old |
deleted |
deleted |
deleted |
… |
Source:图元的来源即标绘方,表示该图元是由哪个标绘方标绘的。表中第一行表示该图元是由C1标绘的。字段ID就是由标绘方生产出该图元后提供的FeatureID。
Filename:位图符号图元的文件名。该文件必须存于MapX应用程序的CustSymbol目录下。
Ci:表示各标绘方(客户端)对于该图元的访问状态。访问状态有以下四种——
new表示该图元为新加图元,标绘方Ci还未在本地添加该新图元;
modified表示该图元被修改,标绘方Ci还未在本地作相应修改;
deleted表示该图元已被删除,该标绘方还未在本地作相应删除。
表中第一行表示该图元是由C1标绘的,其featureID为1,C2,C3,C4等各标绘方还未在其本地添加该图元。
在本地标绘出图元并输入图元各属性信息,在数据表中按上表结构插入该图元各属性信息,并置本方访问标志为old,其它各方访问标志为new。
在本地修改图元属性信息后,同时在数据表中修改该图元相应信息,并置本方访问标志为old,其它各方访问标志为modified。
在本地删除图元后,同时在数据表中查找到该图元,并置本方访问标志为old,其它各方访问标志为deleted。
这样定时刷新时只读取新添加的或已修改的图元,不仅实现了网络环境下异地信息的共享,而且大大提高了系统运行速度。
public bool NewUserLayer(string layerName)
MapXLib.Fields flds=new MapXLib.FieldsClass();
flds.AddIntegerField("mainID",false);
//该图元在生产方图层中的ID,如由本机产生则为featureID。
flds.AddStringField("source",50,false);
flds.AddStringField("name",50,false);
flds.AddStringField("identity",50,false);
flds.AddStringField("description",50,false);
flds.AddStringField("foundTime",50,false);
flds.AddStringField("media",100,false);
flds.AddFloatField("X",false);
flds.AddFloatField("Y",false);
layerInfo=new MapXLib.LayerInfoClass();
layerInfo.AddParameter("FileSpec",@appDirectory+"\\"+layerName+".tab");
layerInfo.AddParameter("Name",layerName);
layerInfo.AddParameter("Fields",flds);
layerInfo.AddParameter("AutoCreateDataset",1);
layerInfo.AddParameter("DatasetName","ds"+layerName);
if (!File.Exists(@appDirectory+"\\"+layerName+".tab"))
layerInfo.Type=MapXLib.LayerInfoTypeConstants.miLayerInfoTypeNewTable;
layerInfo.Type=MapXLib.LayerInfoTypeConstants.miLayerInfoTypeTab;
layer = axMap1.Layers.Add(layerInfo,1);
public void InsertIntoOracle(FeatureInfo featureInfo)
string c1="new",c2="new",c3="new",c4="new",c5="new",c6="new";
string str="INSERT INTO SYSTEM.INFO(ID, SOURCE, NAME, IDENTITY,
DESCRIPTION, FOUNDTIME, MEDIA, X, Y, BMP,C1,C2,C3,C4,C5,C6)";
str+=" Values(";str+=featureInfo.featureID.ToString()+","+featureInfo.source+",'"
+featureInfo.name+"','"+featureInfo.identity+"','"+featureInfo.description+"','"
+featureInfo.foundTime+"','"+featureInfo.media+"',"+featureInfo.point_x.ToString()+","
+featureInfo.point_y.ToString()+",'"+featureInfo.symbolFileName+"','"+c1+"','"+c2+"','"
+c3+"','"+c4+"','"+c5+"','"+c6+"'"+")";
//OracleConnection myConn = new OracleConnection(connectString);
OracleCommand myOracleCommand = new OracleCommand(str);
myOracleCommand.Connection = myConn;
myOracleCommand.ExecuteNonQuery();
string c1="modified",c2="modified",c3="modified",c4="modified",c5="modified",c6="modified";
layer=axMap1.Layers._Item(layerName);
MapXLib.Feature selectedFeature=layer.GetFeatureByKey(selectedFeatureKey);
if (selectedFeature==null) return;
MapXLib.RowValues rvs=new MapXLib.RowValuesClass();
MapXLib.Dataset ds=axMap1.DataSets._Item("ds"+layerName);
MapXLib.Fields fldsUserLayer=ds.Fields;
MapXLib.Style style=selectedFeature.Style;
if (featureInfo.identity=="1")
style.SymbolBitmapColor=(uint)MapXLib.ColorConstants.miColorBlue;
style.SymbolBitmapOverrideColor=true;
else if(featureInfo.identity=="2")
style.SymbolBitmapColor=(uint)MapXLib.ColorConstants.miColorGreen;
style.SymbolBitmapOverrideColor=true;
style.SymbolBitmapOverrideColor=false;
for(int j=1;j<=ds.Fields.Count;j++)
layer.KeyField =fldsUserLayer._Item(j).Name;
if (fldsUserLayer._Item(j).Name.ToUpper() =="SOURCE")
selectedFeature.KeyValue=featureInfo.source;
if (fldsUserLayer._Item(j).Name.ToUpper() =="NAME")
selectedFeature.KeyValue=featureInfo.name;
if (fldsUserLayer._Item(j).Name.ToUpper() =="IDENTITY")
selectedFeature.KeyValue=featureInfo.identity;
if (fldsUserLayer._Item(j).Name.ToUpper() =="DESCRIPTION")
selectedFeature.KeyValue=featureInfo.description;
if (fldsUserLayer._Item(j).Name.ToUpper() =="FOUNDTIME")
selectedFeature.KeyValue=featureInfo.foundTime;
if (fldsUserLayer._Item(j).Name.ToUpper() =="MEDIA")
selectedFeature.KeyValue=featureInfo.media;
if (fldsUserLayer._Item(j).Name.ToUpper() =="X")
selectedFeature.KeyValue=featureInfo.point_x.ToString();
if (fldsUserLayer._Item(j).Name.ToUpper() =="Y")
selectedFeature.KeyValue=featureInfo.point_y.ToString();
selectedFeature.Update(true,rvs);
//selectedFeature.Update(true,rvs);
string str="UPDATE SYSTEM.INFO SET ";
str+="NAME='"+featureInfo.name+"'";
str+=",IDENTITY='"+featureInfo.identity+"'";
str+=",DESCRIPTION='"+featureInfo.description+"'";
str+=",FOUNDTIME='"+featureInfo.foundTime+"'";
str+=",MEDIA='"+featureInfo.media+"'";
str+=",X="+featureInfo.point_x.ToString();
str+=",Y="+featureInfo.point_y.ToString();
str+=" WHERE ID="+selectedFeature.FeatureID.ToString()+" AND SOURCE='"+locate.ToString()+"'";
//OracleConnection myConn = new OracleConnection(connectString);
OracleCommand myOracleCommand = new OracleCommand(str);
myOracleCommand.Connection = myConn;
myOracleCommand.ExecuteNonQuery();
MessageBox.Show("modified successfully");
public void DeleteUserSymbol(string layerName,string selectedFeatureKey)
//删除viewlayer层图元,layerName为viewLayer图层的name
string c1="deleted",c2="deleted",c3="deleted",c4="deleted",c5="deleted",c6="deleted";
layer=axMap1.Layers._Item(layerName);
MapXLib.Feature selectedFeature=layer.GetFeatureByKey(selectedFeatureKey);
if (selectedFeature==null) return;
string str="UPDATE SYSTEM.INFO SET ";
str+="C1='"+c1+"',C2='"+c2+"',C3='"+c3+"',C4='"+c4+"',C5='"+c5+"',C6='"+c6+"' ";
str+="WHERE ID="+selectedFeature.FeatureID.ToString()+" AND SOURCE="+locate.ToString();
//OracleConnection myConn = new OracleConnection(connectString);
OracleCommand myOracleCommand = new OracleCommand(str);
myOracleCommand.Connection = myConn;
myOracleCommand.ExecuteNonQuery();
layer.DeleteFeature(selectedFeature);
private void timer1_Tick(object sender, System.EventArgs e)
FeatureInfo featureInfo=new FeatureInfo();
MapXLib.Variables vs=new MapXLib.VariablesClass();
string whereCondition,colStr="",type;
whereCondition="C1='new' or C1='modified' or C1='deleted'";
whereCondition="C2='new' or C2='modified' or C2='deleted'";
whereCondition="C3='new' or C3='modified' or C3='deleted'";
whereCondition="C4='new' or C4='modified' or C4='deleted'";
whereCondition="C5='new' or C5='modified' or C5='deleted'";
whereCondition="C6='new' or C6='modified' or C6='deleted'";
default:whereCondition="C6=''";
string str="SELECT ID,SOURCE,NAME,IDENTITY,DESCRIPTION,
FOUNDTIME,MEDIA,X,Y,BMP,"+colStr+" FROM SYSTEM.INFO ";
OracleCommand myOracleCommand = new OracleCommand(str);
myOracleCommand.Connection = myConn;
OracleDataReader myReader=myOracleCommand.ExecuteReader();
featureInfo.featureID=myReader.GetInt32(0);
featureInfo.source=myReader.GetValue(1).ToString();
try{featureInfo.name=myReader.GetString(2);}
featureInfo.identity=myReader.GetString(3);
try{featureInfo.description=myReader.GetString(4);}
catch{featureInfo.description="";}
try{featureInfo.foundTime=myReader.GetString(5);}
catch{featureInfo.foundTime="";}
try{featureInfo.media=myReader.GetString(6);}
featureInfo.point_x=myReader.GetDouble(7);
featureInfo.point_y=myReader.GetDouble(8);
featureInfo.symbolFileName=myReader.GetString(9);
this.AddUserSymbolOnLayer(featureInfo,"userLayer");
string searchStr="mainID="+featureInfo.featureID.ToString()+
" and source like "+"\"%"+featureInfo.source+"%\"";
features=axMap1.Layers._Item("userLayer").Search(searchStr,vs);
feature=features._Item(1); this.ModifyUserSymbol(featureInfo,feature.FeatureKey,"userLayer");
string searchStr="mainID="+featureInfo.featureID.ToString()+
" and source like "+"\"%"+featureInfo.source+"%\"";
features=axMap1.Layers._Item("userLayer").Search(searchStr,vs);
this.DeleteUserSymbol("userLayer",feature.FeatureKey);
//修改对应列的标志为old,表示新增的或新修改的或新删除的图元在本机已做同步更改
str1="UPDATE SYSTEM.INFO SET "+colStr+"='old'";
OracleCommand myOracleCommand1 = new OracleCommand(str1);
myOracleCommand1.Connection = myConn;
myOracleCommand1.ExecuteNonQuery();
//MessageBox.Show(axMap1.Layers._Item(1).AllFeatures.Count.ToString());
第六章 MapCtrl控件的开发方法
在这一章节我们对MapX进行二次封装,实现地理信息系统的大部分功能,从而从整体上把握地理信息系统的开发方法。
6.1 主要功能
4.利用OracleSpatial把图元存于空间数据库中以便网络共享
6.2 开发步骤
2.在项目类型中选择“visual C#”类型,在模板中选择“windows控件库”,输入控件库名称“mapCtrl”,单击“确定”,出现用户控件设计窗体。
3.在设计窗体中添加MapX5.0控件,StatusBar控件,ToolTip控件,TooBar控件等,设计效果如下图:
4.打开代码编辑器,定义各种控件接口,添加各种变量定义,功能函数,自定义事件及事件处理程序等,完成以上所需的各种功能。
6.选择菜单“生成”—“生成mapCtrl”,生成mapCtrl控件库。
6.3 程序实现
using System.Data.OracleClient;
public delegate void AddSymbolDelegate ();
public delegate void ChangeMapDelegate ();
public delegate void MeasureDelegate(int mode,string[] value1);
public delegate void MapRefreshDelegate();
public int featureID; //图元的唯一标示符(只读)
public string source; //图元来源(提供者)
public string description; //图元描述
public string media; //与图元关联的多媒体信息
public string identity; //图元身份(类型)
public string symbolFileName; //图元符号bmp文件名
public int featureType; //图元类型:0点图元,1线图元,2面图元
public double point_x; //点图元的经度
public double point_y; //点图元的纬度
public double[] line_xy; //线图元的顶点坐标序列:x1,y1,x2,y2....
public double[] polygon_xy; //面图元的顶点坐标序列
public struct featureRefreshProp
public class mapCtrl : System.Windows.Forms.UserControl
public AxMapXLib.AxMap axMap1;
private AxMapXLib.AxMap mapSmall;//对鹰眼图控件的引用
private MapXLib.Layer m_Layer;
private double mapZoom,mapCenterX,mapCenterY;
private const int miGetLength =100;//自定义用户工具:测量长度
private const int miGetArea =101;//自定义用户工具:测量面积
private const int miAddSymbol=102;//
private string appDirectory;//应用程序目录
private string connectString;//数据库连接字符串
private string connStringForLayerInfo;//layerinfo对象对数据库的连接参数
private string[] symbolProperty;//
private string selectedFeatureKey;//当前具有焦点的图元
private System.Windows.Forms.ToolTip toolTip1;
private System.Windows.Forms.OpenFileDialog openFileDialog1;
private System.Windows.Forms.ContextMenu mapMenu;
private System.Windows.Forms.MenuItem menuItemChangeGST;
private System.Windows.Forms.MenuItem menuItemSaveGST;
private System.Windows.Forms.MenuItem menuItemLayerCTL;
private System.ComponentModel.IContainer components;
public RunInfo rif=new RunInfo ();
public event AddSymbolDelegate addSymbolDelegate;
public event ChangeMapDelegate changeMapDelegate;
public event MeasureDelegate measureDelegate;
public event MapRefreshDelegate mapRefreshDelegate;
public featureRefreshProp []frp=new featureRefreshProp [1];
public FeatureInfo currentFeatureInfo=new FeatureInfo ();
// 该调用是 Windows.Forms 窗体设计器所必需的.
// TODO: 在 InitComponent 调用后添加任何初始化
protected override void Dispose( bool disposing )
private void InitializeComponent()
this.components = new System.ComponentModel.Container();
System.Resources.ResourceManager resources=
new System.Resources.ResourceManager(typeof(mapCtrl));
this.axMap1 = new AxMapXLib.AxMap();
this.toolTip1= new System.Windows.Forms.ToolTip(this.components);
this.openFileDialog1= new System.Windows.Forms.OpenFileDialog();
this.mapMenu = new System.Windows.Forms.ContextMenu();
this.menuItemChangeGST= new System.Windows.Forms.MenuItem();
this.menuItemSaveGST = new System.Windows.Forms.MenuItem();
this.menuItemLayerCTL = new System.Windows.Forms.MenuItem();
((System.ComponentModel.ISupportInitialize)(this.axMap1)).BeginInit();
this.axMap1.Dock = System.Windows.Forms.DockStyle.Fill;
this.axMap1.Location = new System.Drawing.Point(0,0);
this.axMap1.OcxState= ((System.Windows.Forms.AxHost.State)(resources.GetObject("axMap1.OcxState")));
this.axMap1.Size = new System.Drawing.Size(360, 296);
this.axMap1.SelectionChanged+=new System.EventHandler(this.axMap1_SelectionChanged);
this.axMap1.ToolUsed+=new AxMapXLib.CMapXEvents_ToolUsedEventHandler(this.axMap1_ToolUsed);
this.axMap1.MouseUpEvent+=new AxMapXLib.CMapXEvents_MouseUpEventHandler(this.axMap1_MouseUpEvent);
this.axMap1.MapViewChanged+=new System.EventHandler(this.axMap1_MapViewChanged);
this.mapMenu.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
this.menuItemChangeGST, this.menuItemSaveGST, this.menuItemLayerCTL});
this.menuItemChangeGST.Index = 0;
this.menuItemChangeGST.ShowShortcut = false;
this.menuItemChangeGST.Text = "更换地图";
this.menuItemChangeGST.Click+=new System.EventHandler(this.menuItemChangeGST_Click);
this.menuItemSaveGST.Index = 1;
this.menuItemSaveGST.ShowShortcut = false;
this.menuItemSaveGST.Text = "保存地图设置";
this.menuItemSaveGST.Click+=new System.EventHandler(this.menuItemSaveGST_Click);
this.menuItemLayerCTL.Index = 2;
this.menuItemLayerCTL.ShowShortcut = false;
this.menuItemLayerCTL.Text = "地图图层控制";
this.menuItemLayerCTL.Click+=new System.EventHandler(this.menuItemLayerCTL_Click);
this.Controls.Add(this.axMap1);
this.Size = new System.Drawing.Size(360, 296);
this.Load += new System.EventHandler(this.mapCtrl_Load);
((System.ComponentModel.ISupportInitialize)(this.axMap1)).EndInit();
public string SelectedFeatureKey
public string ConnStringForLayerInfo
return connStringForLayerInfo;
axMap1.CurrentTool=ToolConstants.miZoomInTool;
axMap1.CurrentTool=ToolConstants.miZoomOutTool;
axMap1.CurrentTool=ToolConstants.miPanTool;
axMap1.CurrentTool=ToolConstants.miCenterTool;
axMap1.CurrentTool=ToolConstants.miArrowTool;
axMap1.ZoomTo(this.mapZoom,this.mapCenterX,this.mapCenterY);
public void FeaturePointSelect()
axMap1.CurrentTool=ToolConstants.miSelectTool;
public void FeaturePolygonSelect()
axMap1.CurrentTool=ToolConstants.miPolygonSelectTool;
public void FeatureRadiusSelect()
axMap1.CurrentTool=ToolConstants.miRadiusSelectTool;
public void FeatureRectSelect()
axMap1.CurrentTool=ToolConstants.miRectSelectTool;
//axMap1.CurrentTool=ToolConstants.miRadiusSelectTool;
axMap1.CurrentTool=(MapXLib.ToolConstants)miGetLength;
axMap1.CurrentTool=(MapXLib.ToolConstants)miGetArea;
private void mapCtrl_Load(object sender, System.EventArgs e)
symbolProperty=new string[7];//仅用于selectionchanged事件中显示tooltip
appDirectory = Directory.GetCurrentDirectory();
axMap1.CreateCustomTool(miGetArea,MapXLib.ToolTypeConstants.miToolTypePolygon,
MapXLib.CursorConstants.miCrossCursor,MapXLib.CursorConstants.miCrossCursor,
MapXLib.CursorConstants.miCrossCursor,false);
axMap1.CreateCustomTool(miGetLength,MapXLib.ToolTypeConstants.miToolTypePoly,
MapXLib.CursorConstants.miCrossCursor,MapXLib.CursorConstants.miCrossCursor,
MapXLib.CursorConstants.miCrossCursor,false);
private void axMap1_PolyToolUsed(object sender, AxMapXLib.CMapXEvents_PolyToolUsedEvent e)
string []value1=new string [1];
//长度及面积为只读属性从控件的length和area属性中读取
MapXLib.Points pts=(MapXLib.Points)e.points;
length+=axMap1.Distance(pt1.X,pt1.Y,pt2.X,pt2.Y);
MapXLib.Points pts=(MapXLib.Points)e.points;
MapXLib.FeatureFactory dd=axMap1.FeatureFactory;
MapXLib.Style style=axMap1.DefaultStyle;
area=dd.CreateRegion(pts,style).Area;
public bool OpenGeoset(ref string geosetFileName)//参数要带扩展名.gst
openFileDialog1.DefaultExt ="*.gst";
openFileDialog1.Filter="geoset file (*.gst)|*.gst";
geosetFileName=openFileDialog1.FileName;
if (!File.Exists(geosetFileName))
axMap1.GeoSet=openFileDialog1.FileName;
public bool OpenGeoset(string geosetFileName)//参数要带扩展名.gst
if (!File.Exists(geosetFileName))
public void SaveGeoset(string geosetFileName)
axMap1.SaveMapAsGeoset(axMap1.Title.ToString(),@geosetFileName);
public bool NewUserLayer(string layerName)
MapXLib.Fields flds=new MapXLib.FieldsClass();
flds.AddStringField("source",50,false);
flds.AddStringField("name",50,false);
flds.AddStringField("identity",50,false);
flds.AddStringField("description",50,false);
flds.AddStringField("foundTime",50,false);
flds.AddFloatField("objX",false);
flds.AddFloatField("objY",false);
layerInfo=new MapXLib.LayerInfoClass();
layerInfo.AddParameter("FileSpec",@appDirectory+"\\"+layerName+".tab");
layerInfo.AddParameter("Name",layerName);
layerInfo.AddParameter("Fields",flds);
layerInfo.AddParameter("AutoCreateDataset",1);
layerInfo.AddParameter("DatasetName","ds"+layerName);
if (!File.Exists(@appDirectory+"\\"+layerName+".tab"))
layerInfo.Type=MapXLib.LayerInfoTypeConstants.miLayerInfoTypeNewTable; }
layerInfo.Type=MapXLib.LayerInfoTypeConstants.miLayerInfoTypeTab;
layer = axMap1.Layers.Add(layerInfo,1);
public bool LoadRasterLayer(string layerName)//装载栅格图层
int layerNumber=axMap1.Layers.Count;
axMap1.Layers.Add(layerName+".tab",layerNumber+1);
public void DeleteLayer(string layerName)
for(int i=1;i<=axMap1.Layers.Count;i++)
if (axMap1.Layers._Item(i).Name==layerName)
private void OpenDatabase(string connectString)//打开到数据库的连接
OracleConnection myConn = new OracleConnection(connectString);
public bool NewLayerTable(string layerName)
//在oracle中建立图层对应的表,表名等于层名,可由easyloader工具实现
MapXLib.Fields fields=new MapXLib.FieldsClass();
layer=axMap1.Layers._Item(layerName);
if (layer==null) return false;
fields=layer.DataSets._Item("ds"+layerName).Fields;
int fieldCount=layer.DataSets._Item("ds"+layerName).Fields.Count;
string [] fieldSet=new string[fieldCount+3];//后面为图元空间属性字段
for(int i=1;i<=fieldCount;i++)
fieldSet[i]=fields._Item(i).Name;
for(int j=1;j<=fieldCount-2;j++)
str+=fieldSet[j]+" VARCHAR2(50) NULL"+",";
str+="OBJX NUMBER,OBJY NUMBER,";
str+="MI_RENDITION VARCHAR2(50) NULL,
MI_PRINX NUMBER,GEOLOC MDSYS.SDO_GEOMETRY NULL";
string creatLayerTable="CREATE TABLE "+"SYSTEM" +"."+layerName +"("+str+")";
string id=rif.dataBaseMap .id ;
string password=rif.dataBaseMap .password ;
string dataSource=rif.dataBaseMap.server ;
connectString="user id="+id+" ;data source="+dataSource +";password="+password;
OracleConnection myConn = new OracleConnection(connectString);
OracleCommand myOracleCommand =
new OracleCommand(creatLayerTable);
myOracleCommand.Connection = myConn;
myOracleCommand.ExecuteNonQuery();
public void AddUserSymbol(ref FeatureInfo featureInfo,string layerName)
MapXLib.Point pnt=new MapXLib.PointClass();
MapXLib.RowValue rv=new MapXLib.RowValueClass();
MapXLib.RowValues rvs=new MapXLib.RowValuesClass();
MapXLib.FeatureFactory feaFac;
MapXLib.Layer layer=axMap1.Layers._Item(layerName);
MapXLib.Style newStyle=new MapXLib.StyleClass();
feaFac = axMap1.FeatureFactory;
newStyle.SymbolType =MapXLib.SymbolTypeConstants.miSymbolTypeBitmap;
if (featureInfo.identity=="0")
{ newStyle.SymbolBitmapColor=(uint)MapXLib.ColorConstants.miColorBlue;
newStyle.SymbolBitmapOverrideColor=true;
else if(featureInfo.identity=="1")
newStyle.SymbolBitmapColor=(uint)MapXLib.ColorConstants.miColorGreen;
newStyle.SymbolBitmapOverrideColor=true;
newStyle.SymbolBitmapColor=(uint)MapXLib.ColorConstants.miColorRed ;
newStyle.SymbolBitmapOverrideColor=true;
newStyle.SymbolBitmapName=featureInfo.symbolFileName;
newStyle.SymbolBitmapTransparent=true;
axMap1.AutoRedraw = false;//禁止图层自动刷新
pnt.Set(featureInfo.point_x,featureInfo.point_y);
ftr= feaFac.CreateSymbol(pnt,newStyle);
//******************************************************
//以下代码通过rowvalue和rowvalues来为新建图元设置所有属性
//******************************************************
dsUserLayer=axMap1.DataSets._Item("ds"+layerName);
fldsUserLayer=dsUserLayer.Fields;
//MI_PRINX索引构成规则:number前2位加yymmddhhmmss
DateTime myDataTime=DateTime.Now;
if (featureInfo.source==null) featureInfo.source="6";
string rownumber=featureInfo.source.PadLeft (
2,'0')+myDataTime.Year.ToString()+myDataTime.Month.ToString()
for(int j=1;j<=fldsUserLayer.Count;j++)
rv.Field=fldsUserLayer._Item(j);
rv.Field=fldsUserLayer._Item(j);
rv.Field=fldsUserLayer._Item(j);
rv.Value=featureInfo.identity;
rv.Field=fldsUserLayer._Item(j);
rv.Value =featureInfo.description;
rv.Field=fldsUserLayer._Item(j);
rv.Value =featureInfo.foundTime;
rv.Field=fldsUserLayer._Item(j);
rv.Value =featureInfo.point_x;
rv.Field=fldsUserLayer._Item(j);
rv.Value =featureInfo.point_y;
this.InsertIntoOracle(featureInfo,rownumber,ftr.Style,"symbol",ftr,layerName);
DeleteAllfeatures(userLayerName);
public void ModifyUserSymbol(FeatureInfo featureInfo,string layerName)
//修改图元属性,layerName为viewlayer层的name
layer=axMap1.Layers._Item(layerName);
MapXLib.Feature selectedFeature=layer.GetFeatureByKey(featureInfo.featureKey );
if (selectedFeature==null) return;
MapXLib.Dataset ds=axMap1.DataSets._Item("ds"+layerName);
MapXLib.RowValues rowValues=ds.get_RowValues(selectedFeature);
MapXLib.RowValue rowValue=rowValues._Item("MI_PRINX");
string prinx=rowValue.Value.ToString();//取得该图元在数据库中行的索引值
MapXLib.Style style=selectedFeature.Style;
if (featureInfo.identity=="0")
style.SymbolBitmapColor=(uint)MapXLib.ColorConstants.miColorBlue;
style.SymbolBitmapOverrideColor=true;
else if(featureInfo.identity=="1")
style.SymbolBitmapColor=(uint)MapXLib.ColorConstants.miColorGreen;
style.SymbolBitmapOverrideColor=true;
style.SymbolBitmapColor=(uint)MapXLib.ColorConstants.miColorRed ;
style.SymbolBitmapOverrideColor=true;
rendition="symbol("+"\""+style.SymbolBitmapName+"\""
MDSYS.SDO_POINT_TYPE("+featureInfo.point_x.ToString()+",
"+featureInfo.point_y.ToString()+","+"NULL),"+"NULL,NULL)";
MapXLib.Fields fields=new MapXLib.FieldsClass();
fields=axMap1.DataSets._Item("ds"+layerName).Fields;
string [] fieldSet=new string[fieldCount+1];
for(int i=1;i<=fieldCount;i++)
fieldSet[i-1]=fields._Item(i).Name;
fieldSet[fieldCount-1]="GEOLOC";
string tableName=layerName.Substring(0,layerName.Length-6);
string str="UPDATE SYSTEM."+tableName +" SET ";
str+=fieldSet[0]+"='"+featureInfo.source+"'";
str+=","+fieldSet[1]+"='"+featureInfo.name+"'";
str+=","+fieldSet[2]+"='"+featureInfo.identity+"'";
str+=","+fieldSet[3]+"='"+featureInfo.description+"'";
str+=","+fieldSet[4]+"='"+featureInfo.foundTime+"'";
str+=","+fieldSet[5]+"="+featureInfo.point_x.ToString();
str+=","+fieldSet[6]+"="+featureInfo.point_y.ToString();
str+=","+fieldSet[7]+"='"+rendition+"'";
str+=","+fieldSet[8]+"="+geoloc+"";
str+=" WHERE MI_PRINX="+prinx;
OracleConnection myConn = new OracleConnection(connectString);
OracleCommand myOracleCommand = new OracleCommand(str);
myOracleCommand.Connection = myConn;
myOracleCommand.ExecuteNonQuery();
public void ModifyUserSymbol(string featureKey,double X,double Y,string layerName)
//修改图元属性,layerName为viewlayer层的name
layer=axMap1.Layers._Item(layerName);
FeatureInfo featureInfo=new FeatureInfo ();
GetFeaturePropertyByFeatureKey(layerName,ref featureInfo,featureKey);
MapXLib.Feature selectedFeature=layer.GetFeatureByKey(featureInfo.featureKey );
if (selectedFeature==null) return;
MapXLib.Dataset ds=axMap1.DataSets._Item("ds"+layerName);
MapXLib.RowValues rowValues=ds.get_RowValues(selectedFeature);
MapXLib.RowValue rowValue=rowValues._Item("MI_PRINX");
string prinx=rowValue.Value.ToString();//取得该图元在数据库中行的索引值
MapXLib.Style style=selectedFeature.Style;
if (featureInfo.identity=="0")
style.SymbolBitmapColor=(uint)MapXLib.ColorConstants.miColorBlue;
style.SymbolBitmapOverrideColor=true;
else if(featureInfo.identity=="1")
style.SymbolBitmapColor=(uint)MapXLib.ColorConstants.miColorGreen;
style.SymbolBitmapOverrideColor=true;
style.SymbolBitmapColor=(uint)MapXLib.ColorConstants.miColorRed ;
style.SymbolBitmapOverrideColor=true;
rendition="symbol ("+"\""+featureInfo.symbolFileName +"\""+","+
style.SymbolBitmapColor+","+style.SymbolBitmapSize+","+style.SymbolType+")";
geoloc="MDSYS.SDO_GEOMETRY(2001,NULL,MDSYS.SDO_POINT_TYPE("+
featureInfo.point_x.ToString()+","+featureInfo.point_y.ToString()+","+"NULL),"+
MapXLib.Fields fields=new MapXLib.FieldsClass();
fields=axMap1.DataSets._Item("ds"+layerName).Fields;
string [] fieldSet=new string[fieldCount+1];
for(int i=1;i<=fieldCount;i++)
fieldSet[i-1]=fields._Item(i).Name;
fieldSet[fieldCount-1]="GEOLOC";
string tableName=layerName.Substring(0,layerName.Length-6);
string str="UPDATE SYSTEM."+tableName +" SET ";
str+=fieldSet[0]+"='"+featureInfo.source+"'";
str+=","+fieldSet[1]+"='"+featureInfo.name+"'";
str+=","+fieldSet[2]+"='"+featureInfo.identity+"'";
str+=","+fieldSet[3]+"='"+featureInfo.description+"'";
str+=","+fieldSet[4]+"='"+featureInfo.foundTime+"'";
str+=","+fieldSet[5]+"="+featureInfo.point_x.ToString();
str+=","+fieldSet[6]+"="+featureInfo.point_y.ToString();
str+=","+fieldSet[7]+"='"+rendition+"'";
str+=","+fieldSet[8]+"="+geoloc+"";
str+=" WHERE MI_PRINX="+prinx;
OracleConnection myConn = new OracleConnection(connectString);
OracleCommand myOracleCommand = new OracleCommand(str);
myOracleCommand.Connection = myConn;
myOracleCommand.ExecuteNonQuery();
public void DataSetRefresh(string layerName)
MapXLib.Layer layer=axMap1.Layers._Item(layerName+"FromDB");
ds=layer.DataSets._Item("ds"+layerName+"FromDB");
rendition="symbol ("+"\""+featureInfo.symbolFileName +"\""+","+
MapXLib.Fields fields=new MapXLib.FieldsClass();
fields=axMap1.DataSets._Item("ds"+layerName).Fields;
string [] fieldSet=new string[fieldCount+4];
for(int i=1;i<=fieldCount;i++)
fieldSet[i-1]=fields._Item(i).Name;
fieldSet[fieldCount+1]="MI_REDITION";
fieldSet[fieldCount+2]="MI_PRINX";
fieldSet[fieldCount+3]="GEOLOC";
string str="INSERT INTO "+layerName +"(";
str+=",MI_RENDITION,MI_PRINX,GEOLOC) Values(";
str+="'"+featureInfo.source+"','"+featureInfo.name+"','"+featureInfo.identity+"','"+
featureInfo.description+"','"+featureInfo.foundTime+"',"+featureInfo.point_x.ToString()+
","+featureInfo.point_y.ToString()+",'"+rendition+"',"+prinx+","+geoloc+")";
OracleConnection myConn = new OracleConnection(connectString);
OracleCommand myOracleCommand = new OracleCommand(str);
myOracleCommand.Connection = myConn;
myOracleCommand.ExecuteNonQuery();
//*********************************************
//从Oracle Spatial加载空间数据以生成新的图层
//*********************************************
public void OracleToLayer(string tableName)
//tableName为oracle数据库表名与其对应的图层名一样
for(int i=1;i<=axMap1.DataSets.Count ;i++)
if(axMap1.DataSets._Item(i).Name =="ds"+tableName+"FromDB")
getSymbolStyle(tableName+"FromDB");
string querystr="select * from SYSTEM."+tableName.ToUpper();
MapXLib.LayerInfo LayerInfoObject=new MapXLib.LayerInfoClass();
LayerInfoObject.Type=MapXLib.LayerInfoTypeConstants.miLayerInfoTypeServer;
LayerInfoObject.AddParameter("name",tableName+"FromDB");
LayerInfoObject.AddParameter("ConnectString",ConnStringForLayerInfo);
LayerInfoObject.AddParameter("Query",querystr);
LayerInfoObject.AddParameter("toolkit","ORAINET");
LayerInfoObject.AddParameter("AutoCreateDataset",1);
LayerInfoObject.AddParameter("DatasetName","ds"+tableName+"FromDB");
layer=axMap1.Layers.Add(LayerInfoObject,1);
axMap1.DataSets._Item("ds"+tableName+"FromDB").Refresh();
this.getSymbolStyle(tableName+"FromDB");
public void getSymbolStyle(string layerName)
MapXLib.Dataset ds=axMap1.DataSets._Item("ds"+layerName);
MapXLib.Fields fldsUserLayer=ds.Fields;
new featureRefreshProp [axMap1.Layers._Item(layerName).AllFeatures.Count ];
foreach(MapXLib.Feature fea in axMap1.Layers._Item(layerName).AllFeatures)
string symbol=rv.Value.ToString();
if (symbol.Substring(0,3)=="sym")
int startindex=symbol.IndexOf("\"")+1;
int lastindex=symbol.LastIndexOf("\"");
int len=lastindex - startindex;
string bitmapfile=symbol.Substring(startindex,len);
startindex=symbol.IndexOf(",")+1;
for(i=startindex;symbol[i]!=',';i++)
uint SymbolBitmapColor=(uint)Convert.ToInt32(str);
bool SymbolBitmapOverrideColor=true;
SymbolBitmapColor=(uint)Convert.ToInt32(str);
SymbolBitmapOverrideColor=true;
SymbolBitmapOverrideColor=false;
string SymbolBitmapName=bitmapfile;
bool SymbolBitmapTransparent=true;
fea.Style .SymbolBitmapName =SymbolBitmapName;
fea.Style.SymbolBitmapTransparent =SymbolBitmapTransparent;
fea.Style.SymbolBitmapOverrideColor =SymbolBitmapOverrideColor;
fea.Style .SymbolBitmapColor =SymbolBitmapColor;
private void getSymbolStyle(string layerName,string featureKey)//层名与表名一致
MapXLib.Dataset ds=axMap1.DataSets._Item("ds"+layerName);
MapXLib.Fields fldsUserLayer=ds.Fields;
MapXLib.Feature fea=axMap1.Layers._Item(layerName).GetFeatureByKey (featureKey);
string symbol=rv.Value.ToString();
if (symbol.Substring(0,3)=="sym")
int startindex=symbol.IndexOf("\"")+1;
int lastindex=symbol.LastIndexOf("\"");
int len=lastindex - startindex;
string bitmapfile=symbol.Substring(startindex,len);
startindex=symbol.IndexOf(",")+1;
for(int i=startindex;symbol[i]!=',';i++)
uint SymbolBitmapColor=(uint)Convert.ToInt32(str);
bool SymbolBitmapOverrideColor=true;
SymbolBitmapColor=(uint)Convert.ToInt32(str);
SymbolBitmapOverrideColor=true;
SymbolBitmapOverrideColor=false;
string SymbolBitmapName=bitmapfile;
bool SymbolBitmapTransparent=true;
fea.Style .SymbolBitmapName =SymbolBitmapName;
fea.Style .SymbolBitmapTransparent =SymbolBitmapTransparent;
fea.Style .SymbolBitmapOverrideColor =SymbolBitmapOverrideColor;
fea.Style .SymbolBitmapColor =SymbolBitmapColor;
public void DeleteAllfeatures(string layerName)
layer=axMap1.Layers._Item(layerName);
foreach(MapXLib.Feature feature in axMap1.Layers._Item(layerName).AllFeatures)
axMap1.Layers._Item(layerName).DeleteFeature(feature);
axMap1.Layers._Item(layerName).Pack(MapXLib.LayerPackConstant.miPackAll);
private void axMap1_SelectionChanged(object sender, System.EventArgs e)
MapXLib.Layer layer=axMap1.Layers._Item(layerName+"FromDB");
MapXLib.Dataset ds=axMap1.DataSets._Item("ds"+layerName+"FromDB");
foreach(MapXLib.Feature ftr in layer.Selection)
selectedFeatureKey=ftr.FeatureKey;
for(int j=1;j<=ds.Fields.Count;j++)
layer.KeyField =ds.Fields._Item(j).Name;
toolTip1.SetToolTip(this.axMap1,msg);
public void GetSymbolPropertyOnUserLayer(string layerName,ref FeatureInfo featureInfo)
layer=axMap1.Layers._Item(layerName);
ds=axMap1.DataSets._Item("ds"+layerName);
foreach(MapXLib.Feature ftr in layer.AllFeatures )
featureInfo .featureKey =ftr.FeatureKey ;
featureInfo .point_x =ftr.CenterX ;
featureInfo .point_y =ftr.CenterY ;
featureInfo .symbolFileName =currentFeatureInfo.symbolFileName;
featureInfo.source =rif.netStatu.localNetIndex.ToString () ;
featureInfo .identity =currentFeatureInfo.identity ;
featureInfo .foundTime =DateTime.Now .ToString ();
public void GetSelectedFeatureProperty(string layerName,ref FeatureInfo []featureInfo)
//获取和数据库关联的图层的所有选中图元的属性(数据库相关)
layer=axMap1.Layers._Item(layerName);
ds=axMap1.DataSets._Item("ds"+layerName);
int count=layer.Selection .Count ;
featureInfo =new FeatureInfo [count];
foreach(MapXLib.Feature ftr in layer.Selection)
featureInfo [i].featureKey =ftr.FeatureKey ;
featureInfo [i].point_x =ftr.CenterX ;
featureInfo [i].point_y =ftr.CenterY ;
eatureInfo [i].symbolFileName =ftr.Style .SymbolBitmapName;
layer.KeyField=fields._Item(1).Name;
featureInfo [i].source =ftr.KeyValue.ToString();
layer.KeyField=fields._Item(2).Name;
featureInfo [i].name =ftr.KeyValue.ToString();
layer.KeyField=fields._Item(3).Name;
featureInfo [i].identity =ftr.KeyValue.ToString();
layer.KeyField=fields._Item(4).Name;
featureInfo [i].description =ftr.KeyValue.ToString();
layer.KeyField=fields._Item(5).Name;
featureInfo [i].foundTime =ftr.KeyValue.ToString();
string symbol=rv.Value.ToString();
int startindex=symbol.IndexOf("\"")+1;
int lastindex=symbol.LastIndexOf("\"");
int len=lastindex - startindex;
string bitmapfile=symbol.Substring(startindex,len);
featureInfo[i].symbolFileName =bitmapfile;
public void GetAllFeatureProperty(string layerName,ref FeatureInfo []featureInfo)
layer=axMap1.Layers._Item(layerName);
ds=axMap1.DataSets._Item("ds"+layerName);
int count=layer.AllFeatures .Count ;
featureInfo =new FeatureInfo [count];
foreach(MapXLib.Feature ftr in layer.AllFeatures )
featureInfo [i].featureKey =ftr.FeatureKey ;
featureInfo [i].point_x =ftr.CenterX ;
featureInfo [i].point_y =ftr.CenterY ;
featureInfo [i].symbolFileName =ftr.Style .SymbolBitmapName;
layer.KeyField=fields._Item(1).Name;
featureInfo [i].source =ftr.KeyValue.ToString();
layer.KeyField=fields._Item(2).Name;
featureInfo [i].name =ftr.KeyValue.ToString();
layer.KeyField=fields._Item(3).Name;
featureInfo [i].identity =ftr.KeyValue.ToString();
layer.KeyField=fields._Item(4).Name;
featureInfo [i].description =ftr.KeyValue.ToString();
layer.KeyField=fields._Item(5).Name;
featureInfo [i].foundTime =ftr.KeyValue.ToString();
string symbol=rv.Value.ToString();
int startindex=symbol.IndexOf("\"")+1;
int lastindex=symbol.LastIndexOf("\"");
int len=lastindex - startindex;
string bitmapfile=symbol.Substring(startindex,len);
featureInfo[i].symbolFileName =bitmapfile;
layer=axMap1.Layers._Item(layerName);
ds=axMap1.DataSets._Item("ds"+layerName);
MapXLib.Feature ftr =layer.GetFeatureByKey (featureKey);
featureInfo.featureKey =ftr.FeatureKey ;
featureInfo.point_x =ftr.CenterX ;
featureInfo.point_y =ftr.CenterY ;
layer.KeyField=fields._Item(1).Name;
featureInfo.source =ftr.KeyValue.ToString();
layer.KeyField=fields._Item(2).Name;
featureInfo.name =ftr.KeyValue.ToString();
layer.KeyField=fields._Item(3).Name;
featureInfo.identity =ftr.KeyValue.ToString();
layer.KeyField=fields._Item(4).Name;
featureInfo.description =ftr.KeyValue.ToString();
layer.KeyField=fields._Item(5).Name;
featureInfo.foundTime =ftr.KeyValue.ToString();
string symbol=rv.Value.ToString();
int startindex=symbol.IndexOf("\"")+1;
int lastindex=symbol.LastIndexOf("\"");
int len=lastindex - startindex;
string bitmapfile=symbol.Substring(startindex,len);
featureInfo.symbolFileName =bitmapfile;
public void DeleteUserSymbol(string layerName,string selectedFeatureKey)
//删除viewlayer层图元,layerName为viewLayer图层的name
layer=axMap1.Layers._Item(layerName);
MapXLib.Feature selectedFeature=layer.GetFeatureByKey(selectedFeatureKey);
if (selectedFeature==null) return;
MapXLib.Dataset ds=axMap1.DataSets._Item("ds"+layerName);
MapXLib.RowValues rowValues=ds.get_RowValues(selectedFeature);
MapXLib.RowValue rowValue=rowValues._Item("MI_PRINX");
string prinx=rowValue.Value.ToString();
string str="delete from system."+layerName.Substring(0,layerName.Length-6);
str+=" where MI_PRINX="+prinx;
OracleConnection myConn = new OracleConnection(connectString);
OracleCommand myOracleCommand = new OracleCommand(str);
myOracleCommand.Connection = myConn;
myOracleCommand.ExecuteNonQuery();
public void DeleteDBLayerSelectedFeature()
layer=axMap1.Layers._Item(userLayerName+"FromDB");
foreach(MapXLib.Feature selectedFeature in layer.Selection )
DeleteUserSymbol(userLayerName+"FromDB",selectedFeature .FeatureKey );
public void DeleteDBLayerAllFeature()
layer=axMap1.Layers._Item(userLayerName+"FromDB");
foreach(MapXLib.Feature selectedFeature in layer.AllFeatures)
DeleteUserSymbol(userLayerName+"FromDB",selectedFeature .FeatureKey );
OracleToLayer (userLayerName);
public void AddSymbolTool(string layerName,string bitmapFileName,string Identity)
currentFeatureInfo.identity =Identity;
currentFeatureInfo.symbolFileName =bitmapFileName;
layer=axMap1.Layers._Item(layerName);
MapXLib.Style style=new MapXLib.StyleClass();
style.SymbolType =MapXLib.SymbolTypeConstants.miSymbolTypeBitmap;
style.SymbolBitmapName=bitmapFileName;
style.SymbolBitmapTransparent=true;
axMap1.Layers.InsertionLayer=layer;
axMap1.CurrentTool=MapXLib.ToolConstants.miAddPointTool;
private void menuItemChangeGST_Click(object sender, System.EventArgs e)
bool flag=OpenGeoset(ref geoset1);
rif.mapInfoSet .GeoSet =geoset1;
mapSmall.GeoSet =geoset1.Substring (0,geoset1.Length -4)+"eye.gst";
private void menuItemSaveGST_Click(object sender, System.EventArgs e)
private void menuItemLayerCTL_Click(object sender, System.EventArgs e)
private void axMap1_MouseDownEvent(object sender,
AxMapXLib.CMapXEvents_MouseDownEvent e)
System.Drawing .Point pt=new System.Drawing .Point ((int)e.x ,(int)e.y);
private void axMap1_MouseUpEvent(object sender,AxMapXLib.CMapXEvents_MouseUpEvent e)
if(e.button ==1 && axMap1 .CurrentTool ==MapXLib.ToolConstants.miAddPointTool)
FeatureInfo featureInfo=new FeatureInfo ();
GetSymbolPropertyOnUserLayer(userLayerName ,ref featureInfo);
AddUserSymbol(ref featureInfo ,userLayerName);
OracleToLayer (userLayerName );
public void SetDBLayerSelectable()
foreach(MapXLib.Layer layer1 in axMap1 .Layers )
MapXLib.Layer layer=axMap1 .Layers ._Item (userLayerName+"FromDB");
private void GetSelectedFeatureKey(string layerName,ref string []featureKey)
layer=axMap1.Layers._Item(layerName);
int count =layer.Selection .Count;
featureKey =new string [layer.Selection .Count ];
foreach(MapXLib.Feature selectedFeature in layer.Selection )
featureKey [i]=selectedFeature .FeatureKey ;
private void SetSelectedFeatureKey(string layerName,string []featureKey)
layer=axMap1.Layers._Item(layerName);
for(int i=0;i<featureKey .Length ;i++)
feature=layer.GetFeatureByKey (featureKey[i]);
public void SetEyeMap(AxMapXLib.AxMap mapEye)
m_Layer=mapSmall.Layers.CreateLayer("RectLayer",@"d:\mapSmall",1,
"\\mapSmall.tab",1,32,mapSmall.NumericCoordSys);
m_Layer = mapSmall.Layers.Add(Application.StartupPath+"\\mapSmall.tab",1);
private void axMap1_MapViewChanged(object sender, System.EventArgs e)
MapXLib.Feature tempfea=new MapXLib.FeatureClass();
MapXLib.Style tempsty=new MapXLib.StyleClass();
MapXLib.FeatureFactory feaFact;
MapXLib.Feature m_fea=new MapXLib.FeatureClass();
feaFact=mapSmall.FeatureFactory;
tempsty.RegionPattern=MapXLib.FillPatternConstants.miPatternNoFill;
tempsty.RegionBorderColor=255;
MapXLib.PointsClass ps=new MapXLib.PointsClass ();
MapXLib.PointClass p=new MapXLib.PointClass ();
float d=(float)axMap1.Height ;
axMap1.ConvertCoord(ref a,ref c ,ref x,ref y,MapXLib.ConversionConstants .miScreenToMap );
axMap1.ConvertCoord(ref b,ref c ,ref x,ref y,MapXLib.ConversionConstants .miScreenToMap );
axMap1.ConvertCoord(ref b,ref d ,ref x,ref y,MapXLib.ConversionConstants .miScreenToMap );
axMap1.ConvertCoord(ref a,ref d ,ref x,ref y,MapXLib.ConversionConstants .miScreenToMap );
tempfea = feaFact.CreateRegion(ps, tempsty);
m_fea=m_Layer.AddFeature(tempfea,new MapXLib.RowValuesClass());
m_fea.Parts._Item(1).RemoveAll();
float d=(float)axMap1.Height ;
axMap1.ConvertCoord(ref a,ref c ,ref x,ref y,MapXLib.ConversionConstants .miScreenToMap );
m_fea.Parts ._Item (1).AddXY (x,y,1);
axMap1.ConvertCoord(ref b,ref c ,ref x,ref y,MapXLib.ConversionConstants .miScreenToMap );
m_fea.Parts ._Item (1).AddXY (x,y,2);
axMap1.ConvertCoord(ref b,ref d ,ref x,ref y,MapXLib.ConversionConstants .miScreenToMap );
m_fea.Parts ._Item (1).AddXY (x,y,3);
axMap1.ConvertCoord(ref a,ref d ,ref x,ref y,MapXLib.ConversionConstants .miScreenToMap );
m_fea.Parts ._Item (1).AddXY (x,y,4);
m_fea.Update (true,new MapXLib.RowValuesClass());
第七章 分发基于.net平台的MapX应用程序
7.1 .NET Framework 概述
.NET Framework 是一种新的计算平台,它简化了在高度分布式 Internet 环境中的应用程序开发。.NET Framework 旨在实现下列目标:
提供一个一致的面向对象的编程环境,而无论对象代码是在本地存储和执行,还是在本地执行但在 Internet 上分布,或者是在远程执行的。
提供一个保证代码(包括由未知的或不完全受信任的第三方创建的代码)安全执行的代码执行环境。
下面的插图显示公共语言运行库和类库与应用程序之间以及与整个系统之间的关系。该插图还显示托管代码如何在更大的结构内运行。
7.2 .NET Framework 的主要组件和功能
7.2.1公共语言运行库
公共语言运行库管理内存、线程执行、代码执行、代码安全验证、编译以及其他系统服务。这些功能是在公共语言运行库上运行的托管代码所固有的。至于安全性,取决于包括托管组件的来源(如 Internet、企业网络或本地计算机)在内的一些因素,托管组件被赋予不同程度的信任。这意味着即使用在同一活动应用程序中,托管组件既可能能够执行文件访问操作、注册表访问操作或其他须小心使用的功能,也可能不能够执行这些功能。
运行库强制实施代码访问安全。例如,用户可以相信嵌入在 Web 页中的可执行文件能够在屏幕上播放动画或唱歌,但不能访问他们的个人数据、文件系统或网络。这样,运行库的安全性功能就使通过 Internet 部署的合法软件能够具有特别丰富的功能。
运行库还通过实现称为通用类型系统 (CTS) 的严格类型验证和代码验证基础结构来加强代码可靠性。CTS 确保所有托管代码都是可以自我描述的。各种 Microsoft 和第三方语言编译器生成符合 CTS 的托管代码。这意味着托管代码可在严格实施类型保真和类型安全的同时使用其他托管类型和实例。
此外,运行库的托管环境还消除了许多常见的软件问题。例如,运行库自动处理对象布局并管理对对象的引用,在不再使用它们时将它们释放。这种自动内存管理解决了两个最常见的应用程序错误:内存泄漏和无效内存引用。
运行库还提高了开发人员的工作效率。例如,程序员可以用他们选择的开发语言编写应用程序,却仍能充分利用其他开发人员用其他语言编写的运行库、类库和组件。任何选择以运行库为目标的编译器供应商都可以这样做。以 .NET Framework 为目标的语言编译器使得用该语言编写的现有代码可以使用 .NET Framework 的功能,这大大减轻了现有应用程序的迁移过程的工作负担。
尽管运行库是为未来的软件设计的,但是它也支持现在和以前的软件。托管和非托管代码之间的互操作性使开发人员能够继续使用所需的 COM 组件和 DLL。
运行库旨在增强性能。尽管公共语言运行库提供许多标准运行库服务,但是它从不解释托管代码。一种称为实时 (JIT) 编译的功能使所有托管代码能够以它在其上执行的系统的本机语言运行。同时,内存管理器排除了出现零碎内存的可能性,并增大了内存引用区域以进一步提高性能。
最后,运行库可由高性能的服务器端应用程序(如 Microsoft® SQL Server™ 和 Internet 信息服务 (IIS))承载。此基础结构使您在享受支持运行库宿主的行业最佳企业服务器的优越性能的同时,能够使用托管代码编写业务逻辑。
7.2.2 .NET Framework 类库
.NET Framework 类库是一个与公共语言运行库紧密集成的可重用的类型集合。该类库是面向对象的,并提供您自己的托管代码可从中导出功能的类型。这不但使 .NET Framework 类型易于使用,而且还减少了学习 .NET Framework 的新功能所需要的时间。此外,第三方组件可与 .NET Framework 中的类无缝集成。例如,.NET Framework 集合类实现一组可用于开发您自己的集合类的接口。您的集合类将与 .NET Framework 中的类无缝地混合。
正如您对面向对象的类库所希望的那样,.NET Framework 类型使您能够完成一系列常见编程任务(包括诸如字符串管理、数据收集、数据库连接以及文件访问等任务)。除这些常见任务之外,类库还包括支持多种专用开发方案的类型。例如,可使用 .NET Framework 开发下列类型的应用程序和服务:
控制台应用程序
.Windows GUI 应用程序(Windows 窗体)
.ASP.NET 应用程序
.XML Web services
.Windows 服务
例如,Windows 窗体类是一组综合性的可重用的类型,它们大大简化了 Windows GUI 的开发。如果要编写 ASP.NET Web 窗体应用程序,可使用 Web 窗体类。
7.3 安装 .NET Framework
为 .NET Framework 编写的应用程序和控件要求 .NET Framework 安装在运行它们的计算机上。Microsoft 提供了可再发行的安装程序 (Dotnetfx.exe),其中包含运行 .NET Framework 应用程序所必需的公共语言运行库和 .NET Framework 组件。可以从Microsoft MSDN下载中心或Microsoft windows update web 站点下载 Dotnetfx.exe 的最新版本。如果您以前安装了 .NET Framework SDK 或 Microsoft Visual Studio .NET,则不需要安装 Dotnetfx.exe。
尤其要注意的是,您无法在运行 Microsoft Windows 95 操作系统的计算机上安装 .NET Framework。如果达不到最低配置要求,Dotnetfx.exe 安装程序将停止安装可再发行组件包。
7.4 Map客户安装
要使MapX应用程序能够在客户机器上运行,必须安装MapX支撑文件,通常有以下两种方法在客户端安装:
(1) 安装程序自动安装的文件
运行MapX控件安装程序将在默认的 MapX 安装目录中安装以下内容:
C:\Program Files\MapInfo\MapX 5.0
• MapX 控件 mapx50.dll
• 它的支持的 dll
• 光栅和网格 dll 以及处理程序
• 默认的数据集驱动程序
这是最简单的分发方法, MapX 开发人员只需进行非常少的工作,因为某些过程和任务已自动化。
(2) 在用户端注册必须的文件
将MapX DLL 及其相关 DLL数据集驱动程序(用于数据绑定)及其它所有支撑文件拷贝到用户机器上然后运行 regsvr32.exe 实用程序进行注册。
7.5 制作安装程序
创建windows 安装项目,建立安装程序,请参照MSDN中windows应用程序安装部署一节。
转载于:https://www.cnblogs.com/songling/p/4122738.html
用MapX与C#开发地理信息系统相关推荐
- 地理信息系统比较牛的网站(原创)---之可以丰富你的GIS知识
1.http://bbs.esrichina-bj.cn/ 不用多说吧 2.http://www.gisempire.com/bbs/ 这个网站是中国图强地理信息有限公司2003年主办的GIS ...
- 地理信息系统软件测试培训,地理信息系统软件测试方法技术方案
本发明专利技术涉及一种软件测试方法.更具体地说,本发明专利技术涉及一种地理信息系统软件测试方法,包括:编写测试用例文档并脚本化形成测试脚本:结合路径分析方法设置测试用例,按照测试用例配套至少一组测试原 ...
- 《ArcGIS Engine 地理信息系统开发从入门到精通(第二版)》——6.7 本章小结
本节书摘来自异步社区<ArcGIS Engine 地理信息系统开发从入门到精通(第二版)>一书中的第6章,第6.6节,作者: 邱洪钢 , 张青莲 , 熊友谊 更多章节内容可以访问云栖社区& ...
- M3D GIS三维数字沙盘可视化交互地理信息系统开发教程第44课
M3D GIS三维数字沙盘可视化交互地理信息系统开发教程第44课 设置system.ini 如下内容 Server=122.112.229.220 user=GisTest Password=chin ...
- M3DGIS三维电子沙盘数字沙盘可视化交互地理信息系统开发教程第4课
M3DGIS三维电子沙盘数字沙盘可视化交互地理信息系统开发教程第4课 虚拟三维数字沙盘开发教程第4课 下面介绍怎样在地球上增加自己的FrameworkElement,因为FrameworkElemen ...
- M3DGIS三维数字沙盘电子沙盘地理信息系统开发教程第10课
三维数字沙盘电子沙盘M3DGIS地理信息系统开发教程第10课 设置system.ini 如下内容 Server=122.112.229.220 user=GisTest Password=chinam ...
- 三维数字沙盘电子沙盘人工智能地理信息系统开发教程第14课
三维数字沙盘电子沙盘人工智能地理信息系统开发教程第14课 很久没有写了,主要前段时间在针对怎么显示高精度的 倾斜数据而努力,现在终于实现了效果不错.以前的版本显示倾斜数据控制不太好.最近SDK也改动了 ...
- 电子沙盘数字沙盘大数据可视化交互地理信息系统开发教程第8课
多点触摸三维电子沙盘可视化交互地理信息系统(M3D GIS)(平衡+极简+实用)TREND MTOUCH 3D GIS(English)自主知识产权的通过手势多点触摸控制的大型二.三维一体化地理信息系 ...
- [新书推荐]Autodesk地理信息系统解决方案——FDO、MapGuide、AutoCAD® Map 3D二次开发指南...
MapGuide及其相关技术一直缺乏中文资料,针对这种现状,最近Autodesk上海研究院出版了一本新书,系统的介绍了Autodesk地理信息系统解决方案,包括FDO.MapGuide.Map3D等等 ...
- 地理信息系统学习笔记——地图开发相关介绍
最近看了一些地图开发的文章,在此做一下记录. 估计很大一部分人认为地图开发就是基于高德地图.百度地图.腾讯地图结合自己的业务进行二次开发,这只是一个方面.在这些地图上做的二次开发仅仅是方便用户导航到自 ...
最新文章
- java中局部变量和成员变量_Java中局部变量和成员变量可以转换么?
- mongodb数据库磁盘碎片整理。
- 岭南六少个人独立博客开通啦
- 蓝桥杯java第七届决赛第四题--路径之谜
- 傅雷家书摘抄:怎么脱单
- Java 面试必考难点,这一个教程全搞定
- windows git 更改为unix模式换行符决解方法
- SuperEdge正式成为CNCF沙箱项目,腾讯云携手六家厂商在边缘计算领域踏入新篇章
- IDEA/Tomcat 原理:如何将 Tomcat 集成到 IDEA?实现由传统部署延伸到热部署 Java EE 项目?
- c/c++教程 - 总集1. c基础语法
- Linux下配置两个或多个Tomcat启动
- 极光IM JAVA后台对接
- 打印出从1到1000的罗马数字
- jupyter怎么换背景颜色
- 阿里云对象存储OSS怎么收费?
- C#,《数值算法:科学计算的艺术,Numerical Recipes: The Art of Scientific Computing》
- webuploader上传文件夹总结
- 三星 android 4.4 kitkat 刷机包,三星 Galaxy S III LTE(i9305) 刷机包 CM11 KitKat 安卓Android4.4 非官方版...
- 江苏大学 操作系统 知识点提纲 期末考试/考研 复习
- 互联网摸鱼日报(2023-04-30)