阅读:1493回复:0
应用MapX编程两例
<P>MapX的主要功能包括: <BR> [1]专题地图绘制 <BR> 使用专题地图绘制可以直观地表示数据。将数据与地图上的对象相关联,然后使用颜色编码(或其它样式)来直观地表现数据。可使用六种不同样式的任何一种(颜色范围、点密度、单独值、分级符号、饼图或条形图)查看数据。<BR> [2]逐层细化地图绘制 通过简单的点击即可详查数据。对于OLAP/DSS,可以通过点击让用户逐层细化到地图上的区域。<BR> [3]数据绑定 地图可以与嵌套了MapX的容器、ODBC或DAO数据源相连。MapX <BR> 提供了若干不同类型的数据绑定,包括邮政编码级别的地理编码。<BR> [4]注释 可以自行定义注释的显示方位。突出显示特定数据。还可加入文本、符号、表格使地图信息更加丰富直观。<BR> [5]图层化 <BR> 可以显示和控制地图图层,使其缩放程度在预设的距离内时才显示。可以使用或创建无缝图层,从而就像处理一个表一样处理一组表。可以通过特殊图层来支持特殊的应用,这些特殊图层包括动画图层(用于实时跟踪)和UserDraw <BR> 图层(用于在地图顶部绘制特殊地图元素,例如徽标)。<BR> [6]栅格图像 在图层中加入一个栅格图像层作为背景可以使最终的地图更加清晰、美观。<BR> [7]自动标签 可以自动向地图添加标签,并可以控制其属性和显示。<BR> [8]选取对象 可在地图上拖动鼠标在圆、矩形或特定的点上选择一个或多个对象或记录以供分析。<BR> [9]特征工厂 用FeatureFactory对象可以创建、合并、缓冲或清除点、线、区域对象。<BR> [10]工具集 <BR> 用户可以通过单击和拖放操作来与地图交互。可以使用MapX内置的导航、选择、标签、缩放工具,或者创建自定义的工具来满足程序的要求。<BR> [11]地图编辑 允许用户添加、修改、删除地图上的文本、编辑区域、点等特殊对象。<BR> [12]投影和坐标系 通过支持各种坐标系统和地图投影,MapX允许微调地图的显示并在本地坐标中处理X-Y坐标数据。<BR> [13]远程空间服务器连接 可以访问存储在Oracle 8i 和MapInfo <BR> SpatialWare中的远程地图数据。空间数据服务器如SpatialWare和Oracle 8i等都提供了先进的查询处理能力 <BR> ,提高了空间数据组织的性能。将空间数据存储到关系型数据库中,可以增加应用程序的灵活性和地图数据的安全性。 </P>
<P> 1 简单的GIS功能 <BR> <BR> 对于地图缩放、平移、选取、标签等比较简单的功能,可以通过设置MapX控件对象的CurrentTool属性方便地获得。如平移功能就可以简单地用以下语句获得:<BR> Map1.CurrentTool = miPanTool (假设MapX控件名字是Map1) </P> <P> 2 对象闪烁功能<BR> <BR> 很多GIS系统中要用到图形对象的闪烁功能。比如:节点在状态未知时显示灰色,在接受查询时以闪烁以表明状态。这部分功能是借助定时器控件实现的。程序代码主要部分如下:<BR> <BR> '记录目前正在处理的节点图标<BR> Dim CurCusSym As New MapXLib.Feature<BR> '两个交替显示的图标<BR> Dim NewStyle As New MapXLib.Style, OldStyle As New MapXLib.Style<BR> '用于更换图标的布尔值<BR> Dim blnold As Boolean<BR> …………<BR> Private Sub Timer1_Timer() (每次定时器间隔时间到时调用此函数)<BR> Set lyr = Map1.Layers.Item(1)<BR> Set FeaFac = Map1.FeatureFactory<BR> With NewStyle<BR> .SymbolType = miSymbolTypeBitmap<BR> .SymbolBitmapSize = 24<BR> .SymbolBitmapTransparent = True<BR> .SymbolBitmapName = "red.BMP" (要显示的第一张图片)<BR> End With<BR> <BR> With OldStyle<BR> .SymbolType = miSymbolTypeBitmap<BR> .SymbolBitmapSize = 24<BR> .SymbolBitmapTransparent = True<BR> .SymbolBitmapName = "gray.BMP" (要显示的第二张图片)<BR> End With<BR> <BR> Map1.AutoRedraw = False (禁止自动刷新)<BR> If (blnold = True) Then (如果正显示第一张图片,就替换为第二张图片) <BR> CurCusSym.Style = OldStyle<BR> blnold = False<BR> Else<BR> CurCusSym.Style = NewStyle (如果正显示第一张图片,就替换为第二张图片) <BR> blnold = True<BR> End If<BR> CurCusSym.Update (刷新图片)<BR> End Sub <BR> 3 增删站点图标功能<BR> 在增加、减少、改动节点时会用到该功能。该部分功能是通过一个自定义工具实现的。主要实现代码如下:<BR> <BR> '在工程模块中定义增删节点的工具常数<BR> Public Const CreateRTUSymbolTool = 106<BR> Public Const DeleteRTUSymbolTool = 107 <BR> <BR> '注册工具<BR> Private Sub Form_Load()<BR> ………… <BR> Map1.CreateCustomTool CreateRTUSymbolTool, miToolTypePoint, <BR> miSizeAllCursor<BR> Map1.CreateCustomTool DeleteRTUSymbolTool, miToolTypePoint, <BR> miSizeAllCursor<BR> End Sub<BR> <BR> '工具的调用<BR> Private Sub Map1_ToolUsed(ByVal ToolNum As Integer, ByVal X1 As <BR> Double, ByVal Y1 As Double, ByVal X2 As Double, ByVal Y2 As Double, ByVal <BR> Distance As Double, ByVal Shift As Boolean, ByVal Ctrl As Boolean, <BR> EnableDefault As Boolean)<BR> ………… <BR> '添加节点图标<BR> If ToolNum = CreateRTUSymbolTool Then<BR> Dim Pnt As New MapXLib.Point<BR> Dim FeaFac As New MapXLib.FeatureFactory<BR> Dim lyr As New MapXLib.Layer<BR> Dim ftr As New MapXLib.Feature<BR> Dim NewStyle As New MapXLib.Style<BR> <BR> Set lyr = Map1.Layers.Item(1)<BR> Set FeaFac = Map1.FeatureFactory<BR> '设置节点图标的样式<BR> With NewStyle<BR> .SymbolType = miSymbolTypeBitmap<BR> .SymbolBitmapSize = 24<BR> .SymbolBitmapTransparent = True<BR> .SymbolBitmapName = "gray.BMP"<BR> End With<BR> Map1.AutoRedraw = False '禁止图层自动刷新<BR> lyr.Editable = True '置当前图层为可写状态<BR> '创建点对象<BR> Pnt.Set X1, Y1<BR> <BR> Set ftr = FeaFac.CreateSymbol(Pnt, NewStyle) '创建符号 <BR> '记录目前正在处理的用户标记<BR> Set CurCusSym = ftr<BR> <BR> '添加节点图标进当前图层并刷新图层<BR> lyr.AddFeature ftr<BR> lyr.Refresh<BR> Map1.AutoRedraw = True '恢复图层的自动刷新<BR> lyr.Editable = False<BR> '释放对象<BR> Set Pnt = Nothing<BR> Set FeaFac = Nothing<BR> Set lyr = Nothing<BR> Set ftr = Nothing<BR> End If<BR> <BR> '删除节点图标<BR> If ToolNum = DeletePointTool Then<BR> Dim obj As MapXLib.Feature<BR> Dim selectedFtrs As MapXLib.Features<BR> Dim lyr As MapXLib.Layer<BR> Set lyr = Map1.Layers.Item(1)<BR> Set selectedFtrs = lyr.Selection<BR> For Each obj In selectedFtrs<BR> lyr.DeleteFeature (obj)<BR> Next<BR> End If <BR> <BR> End Sub </P> <P> 4 注意事项 <BR> <BR> 用于显示的BMP图片必须放在MapX安装目录下的CUSTSYMB子目录下,存为不大于256色的图片,这样才可以用.SymbolBitmapName <BR> = "gray.BMP"这样的语句来调用显示。 <BR> 5 MapX与.NET的结合 <BR> <BR> 由于MapX是一个AvtiveX控件,所以可以被.NET托管使用。但由于.NET对ActiveX控件托管的实现是借助一个类似“壳”的包装对象实现的,而且很多在VB6下面的ActiveX方法不再支持(如默认参数等),将MapX应用到.NET中有一些难度。当然基本功能还是比较容易实现的,如选择工具调用的语句为:axMap1.CurrentTool <BR> = MapXLib.ToolConstants.miSelectTool(axMap1为相当于VB6下面的Map1对象)。 <BR> --------------------------------------------------<BR> MapX从数据库读取数据形成新图层(C#) <BR> 2005-5-10在C#中实现MapX从数据库读取数据形成新图层分为两个问题:1. MapX从数据库读取数据形成新图层;2. <BR> <BR> 将DataTable转换为ADO的Recordset。这里的第二个问题是由第一个问题引起的,因为MapX是一个COM控件,而且它只支持ADO的数据访问方式,而C#编程时一般会使用ADO.NET方式,为此需要在两种方式之间做一下转换。(当然也可以在C#中使用ADO方式,但这毕竟是落后的方法。该解决办法可参考文章《Visual <BR> Basic.NET中使用ADO访问数据库》)。对第二个问题的解决办法,参见作者的另一篇文章《将DataTable对象转换为Recordset对象》(<a href="http://blog.csdn.net/allentao/archive/2005/05/11/373634.aspx" target="_blank" >http://blog.csdn.net/allentao/archive/2005/05/11/373634.aspx</A>),本文章只讲述在得到了Recordset对象后,如何解决第一个问题。步骤如下:1. <BR> 创建CMapXFields对象,并对应数据库中字段添加字段;2. <BR> 创建CMapXBindLayer对象,指定其坐标值字段的序号;3. 向map.DataSets中添加数据集,从而生成新的图层;4. <BR> 指定新图层中要素的显示风格,本文采用显示位图的方式,为此需要将要显示的位图放入MapX安装目录的CUSTSYMB文件夹下。<BR> 代码如下: private void CreatNewLayerfromDB(string layerName, <BR> ADODB.Recordset rsNoPass) { <BR> this.DeleteLayerByName(layerName); //将原有层删除<BR> CMapXFields flds=new FieldsClass();<BR> // Describe the structure of the Unbound dataset <BR> flds.Add("stationid", "theid", <BR> AggregationFunctionConstants.miAggregationIndividual, <BR> FieldTypeConstants.miTypeString); <BR> flds.Add("address", "address", <BR> AggregationFunctionConstants.miAggregationIndividual, <BR> FieldTypeConstants.miTypeString); <BR> flds.Add("longitude", "longitude", <BR> AggregationFunctionConstants.miAggregationSum, <BR> FieldTypeConstants.miTypeNumeric); //经度 <BR> flds.Add("latitude", "latitude", <BR> AggregationFunctionConstants.miAggregationSum, <BR> FieldTypeConstants.miTypeNumeric); //纬度<BR> CMapXBindLayer bindLayerObject=new BindLayerClass(); <BR> bindLayerObject.LayerName=layerName; <BR> bindLayerObject.RefColumn1=3; <BR> bindLayerObject.RefColumn2=4; <BR> bindLayerObject.LayerType=BindLayerTypeConstants.miBindLayerTypeXY;<BR> CMapXDataset <BR> dataSet=map.DataSets.Add(DatasetTypeConstants.miDataSetADO, <BR> rsNoPass, layerName, "stationid", "address", <BR> bindLayerObject, flds, false );<BR> CMapXLayer layer=map.Layers._Item(layerName); <BR> layer.OverrideStyle= true; string <BR> picName="icon.BMP"; <BR> if(layer.Style.SupportsBitmapSymbols == true) { <BR> layer.Style.SymbolType = <BR> SymbolTypeConstants.miSymbolTypeBitmap; <BR> layer.Style.SymbolBitmapSize = 60; <BR> layer.Style.SymbolBitmapTransparent = true; <BR> layer.Style.SymbolBitmapName = picName; } <BR> }<BR> private void DeleteLayerByName(string layerName) <BR> { int count=map.Layers.Count; <BR> for(int i=1; i<count; i++) { <BR> if(map.Layers._Item(i).Name==layerName) <BR> map.Layers.Remove(i); } }</P> |
|