阅读:2397回复:6
MapX开发中的几点经验
MapX开发中的几点经验
标 题: [转]MapX开发中的几点经验 写作环境:Pwin98+MapInfo5.0+MapX4.01.49+VB6 声明:文章为个人理解,浅薄之处在所难免。如与权威资料冲突,以权威资料为准 。 ------------------------------------------------------------------------ -------- 一、 前言 我用MapInfo公司的MapX开发过几个项目。在项目的开发过程中,也接触了一些 使用相同技术的的公司和开发人员,感觉到他们的开发过程常常被一些问题所困扰 ,却得不到很好的解决。在这里,我把我在开发过程中积累的一些经验写出来,希 望能起到抛砖引玉的作用。 二、开发经验 1、 映射数据库中的点信息到地图 实际开发过程中,常常要把数据库中的数据Map到地图上,使之作为一个图层存 在,能够在地图界面中对数据库执行各种操作,如增删查改等。 下面假设我们把数据库ht.mdb中Customer表映射地图上,该表记录了一些客户对象 的地理位置和其他信息。假设字段信息如下: { ID Long (AutoInc), X Double, Y Double, Name string(20) } 其中X,Y分别纪录点对象的地理坐标。我们现在要使这个数据库表能被映射到地图 上。首先,要为该数据库创建一个纪录映射信息的表,这个表的名称和字段信息是 定死的。可以用SQL创建,如下: Create Table MAPINFO_MAPCATALOG ( SPATIALTYPE Float, TABLENAME Char(32), OWNERNAME Char(32), SPATIALCOLUMN Char(32), DB_X_LL Float, DB_Y_LL Float, DB_X_UR Float, DB_Y_UR Float, COORDINATESYSTEM Char(254), SYMBOL Char(254), XCOLUMNNAME Char(32), YCOLUMNNAME Char(32) ) 也可以有mapinfo带的一个小mapbasic程序实现。打开mapinfo,在工具管理器 中加载Map Catalog工具,文件名为Miodbcat.mbx。执行操作 工具 | ODBC目录, 在弹出的对话框中选择性将连接,如下图: 为系统创建一个ODBC数据源,此处创建驱动程序为microsoft access, DSN=”DemoDB”,Filename=”c:\windows\desktop\ht.mdb”。确定返回后,点击 “创建目录”,系统会提示你“表MAPINFO_MAPCATALOG已被创建”。 这时用Access打开ht.mdb就会发现已经创建了一个MAPINFO_MAPCATALOG表,且 字段信息就是前面叙述的。 下一步就是设置表MAPINFO_MAPCATALOG的值,这些字段值的设置也必须严格按 照规定来。下面简单介绍一下我的设置值:(详细的说明可参看帮助) SPATIALTYPE:4 表示映射后的图层全部都是有X/Y坐标的点数据, TABLENAME:customer 表示将被映射的数据库表,此处为customer OWNERNAME:OWNER 表示该表的所有者,一般意义不大 SPATIALCOLUMN:NULL_COLUMN 表示包含了空间实体的列名,NULL_COLUMN表示由 X/Y坐标值进行映射 DB_X_LL:0 图层边界左下角的X值,单位由下面的COORDINATESYSTEM给出 DB_Y_LL:0 图层边界左下角的Y值 DB_Y_UR:0 图层边界右上角的Y值 DB_Y_UR:0 图层边界右上角的Y值 COORDINATESYSTEM:NonEarth Units "m" Bounds (0, 0) (700,500),映射图层坐 标系定义,此处表示为非地理坐标系,单位为米,(0,0)为左下角坐标,(700, 500)为右上角坐标 SYMBOL:Symbol ("12.bmp",16744448,12,2),映射时用来标识点的图符信息,此 处表示用custsymb目录下的12.bmp文件来标识,颜色的BGR值为1674448,大小为 12。共有上形式的设置格式,要注意区别。 XCOLUMNNAME:X 对于含X/Y坐标进行映射的数据表的X坐标子段,否则填 NO_COLUMN YCOLUMNNAME:Y 对于含X/Y坐标进行映射的数据表的Y坐标子段,否则填 NO_COLUMN 到此为止,映射的准备工作就完成了。下面我们写一段代码,将数据库表 customer映射到地图上。 *************************************************************** '从数据库中映象客户图层信息 Sub initialshop() Dim LayerInfo As New MapXLib.LayerInfo '新图层的数据存取类型,必须为miLayerInfoTypeServer才能动态更新 '这是访问大型spatialware图形数据库的方法 LayerInfo.Type = miLayerInfoTypeServer '以下为图层创建信息和ODBC连接信息 '图层的名称,以后可以map1.layers("客户")进行访问 LayerInfo.AddParameter "Name", "客户" 'ODBC连接信息 LayerInfo.AddParameter "ConnectString", "DSN=htgis;UID=Admin; driver=Access" '如何retrive数据 LayerInfo.AddParameter "query", "Select * from Customer" LayerInfo.AddParameter "cache", "on" LayerInfo.AddParameter "MBRSearch", "on" LayerInfo.AddParameter "toolkit", "ODBC" '如果对应dataset不存在,则自动创建dataset图层,位于最顶端 LayerInfo.AddParameter "AutoCreateDataset", 1 'dataset名称,为“客户”,以后可以map1.datasets("客户")进行访问 LayerInfo.AddParameter "datasetname", "客户" Map1.Layers.Add LayerInfo, 1 '设置新图层的表字段及标签样式 With Map1 .AutoRedraw = False .InfotipSupport = False .InfotipSupport = True Set ds = .Datasets("客户") Set .Layers("客户").LabelProperties.Dataset = ds Set .Layers("客户").LabelProperties.DataField = “name” .Layers("客户").LabelProperties.Position = miPositionCR With .Layers("客户").LabelProperties.Style.TextFont .Name = "宋体" .Size = 9 .Bold = False .Strikethrough = False .Underline = False .Italic = False End With .Layers("客户").LabelProperties.Style.TextFontColor = &HFF0000 .Layers("客户").AutoLabel = True .Layers("客户").Selectable = True .Layers("客户").Refresh .AutoRedraw = True End With Set LayerInfo = Nothing End Sub *************************************************************** 这样,在程序执行后,数据库表就被映射到了地图上,位于最上层。对于它的 操作,与普通的图层时一样的,都是用Feature对象访问图层中的实体。关于它的 其他操作就不介绍了。 2、 如何在读取属性值 选定一个实体后,我们需要读取它的属性值,怎么办呢? 有三种方法: a. 由Layer对象的KeyField属性来设立要读取属性值的字段名。 接着,由Feature对象的keyValue读取此行的属性值。 b. 将图层加入到Datasets, 由Dataset对象的Value(x,y)属性,通过设置行号 ,列号来获得属性值。 c. 将图层加入到Datasets,之后由RowValues(ftr)获取整行的值。 Dim ds As MapXLib.Dataset, lyr As MapXLib.layer Dim ftrs As Features Dim ftr As Feature Dim rv As RowValue Dim rvs As RowValues Dim DsName As String ‘数据集名 Dim DsRows As Long, DsCols As Long Dim i As Long, j As Long Set ds = Formmain.Map1.Datasets.Item(DsName) Set lyr = ds.layer Set ftrs = lyr.AllFeatures DsCols = ds.Fields.Count DsCols = DsCols + 1 DsRows = ftrs.Count Grid1.Rows = DsRows + 1 Grid1.Cols = DsCols Grid1.Row = 0 For i = 0 To DsCols - 1 Grid1.Col = i Grid1.Text = ds.Fields.Item(i + 1).Name Next i Grid1.Col = DsCols - 1 Grid1.Text = "Fkey" lyr.BeginAccess miAccessRead i = 1 For Each ftr In ftrs Set rvs = ds.RowValues(ftr) j = 0 For Each rv In rvs If Not IsNull(rv.Value) Then Grid1.TextArray(i * DsCols + j) = Trim(rv. Value) j = j + 1 Next Grid1.TextArray(i * DsCols + j) = ftr.FeatureKey i = i + 1 Next lyr.EndAccess miAccessEnd Set ftr = Nothing Set ftrs = Nothing Set ds = Nothing Set rv = Nothing Set rvs = Nothing Set lyr = Nothing 注意:BeginAccess,以及EndAccess可以明显的提高属性读取的速度。 3、 为要打印的地图画一个边框 如果你想让要打印的地图漂亮一点,给它加上一个边框,可以参看下面的代码: Option Explicit Dim rect As New MapXLib.Rectangle Dim ftr As Feature Dim ftrs As Features Dim Styl As New Style Dim lyr As Layer Private Sub cmdPrint_Click() ScaleMode = 6 'set mode to mm Printer.CurrentX = 0 Printer.CurrentY = 0 Printer.Print " " Map1.PrintMap Printer.hDC, 0, 0, Map1.Width * 100, Map1.Height * 100 Printer.NewPage ' Send new page. Printer.EndDoc 'Printing is finished. Exit Sub End Sub Private Sub Form_Load() '画一个地图边界大小的矩形 Map1.NumericCoordSys = Map1.DisplayCoordSys Set lyr = Map1.Layers.CreateLayer("Temp", , 1) ' 设置该矩形属性 With Styl .RegionTransparent = True .RegionBorderColor = miColorBlack .RegionBorderWidthUnit = miStyleUnitPixel .RegionBorderWidth = 5 .RegionPattern = miPatternNoFill End With 'Set the rectangle rect.Set Map1.Bounds.XMin, Map1.Bounds.YMin, Map1.Bounds.XMax, Map1. Bounds.YMax ' 创建矩形并添加到实体中 Set ftr = Map1.FeatureFactory.CreateRegion(rect, Styl) lyr.AddFeature ftr End Sub 4、 MapX开发系统的发行 我一直用破解的MapX进行开发,软件开发完成后的发行曾使我很恼火,后来采 用了Wise Install,一切迎刃而解。需要打包的东西很多,软件的支持文件、数据 库和数据库引擎,mapx支持文件、自己定义的图符、字体文件、注册表设置、还有 ODBC设置等,这些工作用Visual Stadio自带的打包程序是难以完成,推荐使用 Wise 6.0。系统运行时需要那些文件支持,可使用dllshow的小工具跟踪,而且 Wise本身也提供了监测应用程序运行环境的功能。 三、结语 在写这篇东东之前,似乎脑子里充满了要写下的经验,但写的时候感觉很多都 是可意会不可言传的东西,所以写的不多,希望以后有机会能慢慢整理。如果你采 用Mapinfo公司系列产品开发地理信息型系统的话,我们可以进行深入的探讨,虽 然我不是靠GIS吃饭的。 |
|
|
1楼#
发布于:2003-12-06 18:07
哪位大侠有OPENGL的三维GIS开发示例代码?
|
|
3楼#
发布于:2003-12-11 21:39
受益匪浅
|
|
4楼#
发布于:2004-01-10 17:29
顶!
|
|
5楼#
发布于:2004-01-15 13:07
好!有了这位同仁的支持这个网站会越来越好的
|
|
6楼#
发布于:2004-04-04 18:01
这位先生(也许是位漂亮的MM)真是好,谢谢
xiexie谢谢 |
|
7楼#
发布于:2004-04-10 22:17
谢谢这位前辈了。
值得大家学习。 |
|