应用MapX编程两例      
                                           citylamp

0 MapX简介 
       MapX是MapInfo公司提供的具有强大地图分析功能的ActiveX控件产品。由于它是一种基于Windows操作系统的标准控件,因而能支持绝大多数标准的可视化开发环境,如Visual C++、Visual Basic、Delphi、PowerBuilder、Visual Studio.NET等。编程人员在开发过程中可以选用自己最熟悉的开发语言,轻松地将地图功能嵌入到应用中,并且可以脱离MapInfo的软件平台运行。利用MapX,能够简单快速地在软件中嵌入地图化功能,增强软件的空间分析能力。MapX采用基于MapInfo Professional相同的地图化技术,可以实现MapInfo Professional具有的绝大部分地图编辑和空间分析功能。          
       MapX的主要功能包括: 
       [1]专题地图绘制  使用专题地图绘制可以直观地表示数据。将数据与地图上的对象相关联,然后使用颜色编码(或其它样式)来直观地表现数据。可使用六种不同样式的任何一种(颜色范围、点密度、单独值、分级符号、饼图或条形图)查看数据。
       [2]逐层细化地图绘制  通过简单的点击即可详查数据。对于OLAP/DSS,可以通过点击让用户逐层细化到地图上的区域。
       [3]数据绑定  地图可以与嵌套了MapX的容器、ODBC或DAO数据源相连。MapX 提供了若干不同类型的数据绑定,包括邮政编码级别的地理编码。
       [4]注释  可以自行定义注释的显示方位。突出显示特定数据。还可加入文本、符号、表格使地图信息更加丰富直观。
       [5]图层化  可以显示和控制地图图层,使其缩放程度在预设的距离内时才显示。可以使用或创建无缝图层,从而就像处理一个表一样处理一组表。可以通过特殊图层来支持特殊的应用,这些特殊图层包括动画图层(用于实时跟踪)和UserDraw 图层(用于在地图顶部绘制特殊地图元素,例如徽标)。
       [6]栅格图像  在图层中加入一个栅格图像层作为背景可以使最终的地图更加清晰、美观。
       [7]自动标签  可以自动向地图添加标签,并可以控制其属性和显示。
       [8]选取对象  可在地图上拖动鼠标在圆、矩形或特定的点上选择一个或多个对象或记录以供分析。
       [9]特征工厂  用FeatureFactory对象可以创建、合并、缓冲或清除点、线、区域对象。
       [10]工具集  用户可以通过单击和拖放操作来与地图交互。可以使用MapX内置的导航、选择、标签、缩放工具,或者创建自定义的工具来满足程序的要求。
       [11]地图编辑  允许用户添加、修改、删除地图上的文本、编辑区域、点等特殊对象。
       [12]投影和坐标系  通过支持各种坐标系统和地图投影,MapX允许微调地图的显示并在本地坐标中处理X-Y坐标数据。
       [13]远程空间服务器连接  可以访问存储在Oracle 8i 和MapInfo SpatialWare中的远程地图数据。空间数据服务器如SpatialWare和Oracle 8i等都提供了先进的查询处理能力 ,提高了空间数据组织的性能。将空间数据存储到关系型数据库中,可以增加应用程序的灵活性和地图数据的安全性。

1 简单的GIS功能 
      对于地图缩放、平移、选取、标签等比较简单的功能,可以通过设置MapX控件对象的CurrentTool属性方便地获得。如平移功能就可以简单地用以下语句获得:
    Map1.CurrentTool = miPanTool  (假设MapX控件名字是Map1)

2 对象闪烁功能
      很多GIS系统中要用到图形对象的闪烁功能。比如:节点在状态未知时显示灰色,在接受查询时以闪烁以表明状态。这部分功能是借助定时器控件实现的。程序代码主要部分如下:
  
    '记录目前正在处理的节点图标
    Dim CurCusSym As New MapXLib.Feature
    '两个交替显示的图标
    Dim NewStyle As New MapXLib.Style, OldStyle As New MapXLib.Style
    '用于更换图标的布尔值
    Dim blnold As Boolean
    …………
 Private Sub Timer1_Timer()  (每次定时器间隔时间到时调用此函数)
    Set lyr = Map1.Layers.Item(1)
    Set FeaFac = Map1.FeatureFactory
    With NewStyle
     .SymbolType = miSymbolTypeBitmap
     .SymbolBitmapSize = 24
     .SymbolBitmapTransparent = True
     .SymbolBitmapName = "red.BMP"   (要显示的第一张图片)
    End With
   
    With OldStyle
     .SymbolType = miSymbolTypeBitmap
     .SymbolBitmapSize = 24
     .SymbolBitmapTransparent = True
     .SymbolBitmapName = "gray.BMP"   (要显示的第二张图片)
    End With
   
    Map1.AutoRedraw = False     (禁止自动刷新)
    If (blnold = True) Then     (如果正显示第一张图片,就替换为第二张图片)
    CurCusSym.Style = OldStyle
    blnold = False
    Else
    CurCusSym.Style = NewStyle  (如果正显示第一张图片,就替换为第二张图片)
    blnold = True
    End If
    CurCusSym.Update  (刷新图片)
 End Sub

3  增删站点图标功能
      在增加、减少、改动节点时会用到该功能。该部分功能是通过一个自定义工具实现的。主要实现代码如下:
      
   '在工程模块中定义增删节点的工具常数
   Public Const CreateRTUSymbolTool = 106
   Public Const DeleteRTUSymbolTool = 107
  
   '注册工具
  Private Sub Form_Load()
   …………
    Map1.CreateCustomTool CreateRTUSymbolTool, miToolTypePoint, miSizeAllCursor
    Map1.CreateCustomTool DeleteRTUSymbolTool, miToolTypePoint, miSizeAllCursor
  End Sub
  
   '工具的调用
    Private Sub Map1_ToolUsed(ByVal ToolNum As Integer, ByVal X1 As Double, ByVal Y1 As Double, ByVal X2 As Double, ByVal Y2 As Double, ByVal Distance As Double, ByVal Shift As Boolean, ByVal Ctrl As Boolean, EnableDefault As Boolean)
   ………… 
   '添加节点图标
    If ToolNum = CreateRTUSymbolTool Then
    Dim Pnt As New MapXLib.Point
    Dim FeaFac As New MapXLib.FeatureFactory
    Dim lyr As New MapXLib.Layer
    Dim ftr As New MapXLib.Feature
    Dim NewStyle As New MapXLib.Style
 
    Set lyr = Map1.Layers.Item(1)
    Set FeaFac = Map1.FeatureFactory
    '设置节点图标的样式
    With NewStyle
     .SymbolType = miSymbolTypeBitmap
     .SymbolBitmapSize = 24
     .SymbolBitmapTransparent = True
     .SymbolBitmapName = "gray.BMP"
    End With
    Map1.AutoRedraw = False   '禁止图层自动刷新
    lyr.Editable = True            '置当前图层为可写状态
    '创建点对象
    Pnt.Set X1, Y1
  
    Set ftr = FeaFac.CreateSymbol(Pnt, NewStyle)   '创建符号
    '记录目前正在处理的用户标记
    Set CurCusSym = ftr
   
    '添加节点图标进当前图层并刷新图层
    lyr.AddFeature ftr
    lyr.Refresh

Map1.AutoRedraw = True '恢复图层的自动刷新
    lyr.Editable = False
    '释放对象
    Set Pnt = Nothing
    Set FeaFac = Nothing
    Set lyr = Nothing
    Set ftr = Nothing
  End If
 
'删除节点图标
  If ToolNum = DeletePointTool Then
    Dim obj As MapXLib.Feature
    Dim selectedFtrs As MapXLib.Features
    Dim lyr As MapXLib.Layer

Set lyr = Map1.Layers.Item(1)
    Set selectedFtrs = lyr.Selection
    For Each obj In selectedFtrs
        lyr.DeleteFeature (obj)
    Next
  End If
        
End Sub

4  注意事项 
       用于显示的BMP图片必须放在MapX安装目录下的CUSTSYMB子目录下,存为不大于256色的图片,这样才可以用.SymbolBitmapName = "gray.BMP"这样的语句来调用显示。

5 MapX与.NET的结合
       由于MapX是一个AvtiveX控件,所以可以被.NET托管使用。但由于.NET对ActiveX控件托管的实现是借助一个类似“壳”的包装对象实现的,而且很多在VB6下面的ActiveX方法不再支持(如默认参数等),将MapX应用到.NET中有一些难度。当然基本功能还是比较容易实现的,如选择工具调用的语句为:axMap1.CurrentTool = MapXLib.ToolConstants.miSelectTool(axMap1为相当于VB6下面的Map1对象)。
       今年晚些时候MapInfo公司将推出MapInfo .NET,相信这个新版本将会成为 .NET平台下GIS开发的利器。

[注]  本文有关MapX控件功能的介绍内容参考了英文版的“MapX参考指南”。

应用MapX编程两例相关推荐

  1. 趣味c语言编程100例(一)

    Technorati 标签: 趣味,c语言,编程,100例 经典c程序100例==1--10 [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分 ...

  2. Python3算法基础练习:编程100例( 21~ 25)

    往期练习: Python3算法基础练习:编程100例(1~5) Python3算法基础练习:编程100例(6 ~ 10) Python3算法基础练习:编程100例(11 ~ 15) Python3算法 ...

  3. Python3算法基础练习:编程100例( 26 ~ 30)

    上期文章: Python3算法基础练习:编程100例( 21~ 25) 目录 26 递归求 20! 的阶乘 27 字符串反转 28 猜岁数 29 整数打印每一位数字 30 回文数 26 递归求 20! ...

  4. Python3算法基础练习:编程100例(6 ~ 10)

    往期练习: Python3算法基础练习:编程100例(1~5) Python3算法基础练习:编程100例(6 ~ 10) 6.斐波那契数列 7.列表复制 8.乘法口诀表 9.暂停输出 10.格式化时间 ...

  5. Python3算法基础练习:编程100例(1~5)

    Python3基础练习:编程100例(1~5) 1.无重复数字 2.发放奖金 3.完全平方数 4.判断这一天是这一年的第几天? 5.三个数从小到大输出 1.无重复数字 题目:有四个数字:1.2.3.4 ...

  6. C语言对电脑做的事儿啊,总有那么一丝恐怖,C语言操盘电脑两例

    C语言对自己电脑做的事儿啊,总有那么一丝恐怖,C语言与电脑两例 开场先抱歉,偷懒好多天了.今天分享给大家的l两例比较短小精悍,都是针对于计算机屏幕处理的两例,有兴趣的可以放到自己电脑上运行哦.绝对无害 ...

  7. 5.3linux下C语言socket网络编程简例

    原创文章,转载请注明转载字样和出处,谢谢! 这里给出在Linux下的简单socket网络编程的实例,使用tcp协议进行通信,服务端进行监听,在收到客户端的连接后,发送数据给客户端:客户端在接受到数据后 ...

  8. 两例司法实践撕开了一个口子,区块链应用落地会加速吗?

    -------- 作者:刘学习 在铺天盖地的区块链热潮中,公众更期待的其实是区块链如何改变我们的社会和生活,也就是区块链应用怎么真正的落地.那么,区块链应用落地的障碍在哪儿呢?如何克服这些路障,让区块 ...

  9. 转 shell编程100例

    shell编程100例 联系我 1.编写hello world脚本 #!/bin/bash # 编写hello world脚本 echo "Hello World!" 2.通过位置 ...

最新文章

  1. 为什么 StringBuilder 不是线程安全的?
  2. mongoDB删除某个字段(key)
  3. 如果我要....(生活版)
  4. 专栏 | 基于 Jupyter 的特征工程手册:特征选择(四)
  5. k8s单节点部署(master ,node部分)
  6. 百度地图动态显示查询结构
  7. ADB投屏_最强开源投屏神器,跨平台电脑控制+文件传输——scrcpy
  8. opencv for java HoughLinesP的使用
  9. (引)XPath 示例
  10. 阿里云高级架构师张然:混合云开放网络生态的探索与实践
  11. python wps api_WPS API操作
  12. 用python做自动化控制-python用于自动化控制编程
  13. 【运维】在阿里云服务器上给Ubuntu安装桌面系统
  14. node 压缩图片_用图压批量压缩图片就这么简单
  15. js开发:数组的push()、pop()、shift()和unshift()
  16. python生成图片
  17. ae软件安装计算机丢失,安装adobe ae等软件提示找不到msvcp110.dll、msvcp
  18. python爬虫requests和bs4引入
  19. php ziparchive(),PHP: ZipArchive - Manual
  20. mybatis-plus存数组对象,并从数据库查出这个数组

热门文章

  1. DCGAN论文改进之处+简化代码
  2. GaussDB ETCD 服务异常实例分析处理的5种方法
  3. JAVA连接SQL2005
  4. Python修改路由器WIFI账号
  5. 论文写作总结(中外文对比)
  6. 逆向思维--魔兽世界封包分析
  7. 如何改域的NETBIOS名?
  8. Java的开发架构---浅谈
  9. Latex公式字母加粗
  10. 提供数据库连接池 和数据库连接