juaze
路人甲
路人甲
  • 注册日期2007-05-09
  • 发帖数7
  • QQ
  • 铜币136枚
  • 威望0点
  • 贡献值0点
  • 银元0个
阅读:1493回复:0

应用MapX编程两例

楼主#
更多 发布于:2007-05-16 21:02
<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>
喜欢0 评分0
游客

返回顶部