鹭燕医药:使用MapX开发实现若干小功能

来源:百度文库 编辑:九乡新闻网 时间:2024/04/29 11:17:09
一、 前言 我用MapInfo公司的MapX开发过几个项目。在项目的开发过程中,也接触了一些使用相同技术的公司和开发人员,感觉到他们的开发过程常常被一些问题所困扰,却得不到很好的解决。在这里,我把我在开发过程中积累的一些经验写出来,希望能起到抛砖引玉的作用。二、开发经验 1、如何在MapX下读取属性值,这里介绍三种方法:1)由Layer对象的KeyField属性来设立要读取属性值的字段名。接着,由Feature对象的keyValue读取此行的属性值。2)将图层加入到Datasets,由Dataset对象的Valuex,y)属性,通过设置行号,列号来获得属性值。3)将图层加入到Datasets之后由RowValues(ftr)获取整行的值。Dim ds As MapXLib.Dataset, lyr As MapXLib.layerDim ftrs As FeaturesDim ftr As FeatureDim rv As RowValueDim rvs As RowValuesDim DsName As String '数据集名Dim DsRows As Long, DsCols As LongDim i As Long, j As LongSet ds = Formmain.Map1.Datasets.Item(DsName)Set lyr = ds.layerSet ftrs = lyr.AllFeaturesDsCols = ds.Fields.CountDsCols = DsCols + 1 DsRows = ftrs.CountGrid1.Rows = DsRows + 1Grid1.Cols = DsColsGrid1.Row = 0For i = 0 To DsCols - 1Grid1.Col = iGrid1.Text = ds.Fields.Item(i + 1).NameNext iGrid1.Col = DsCols - 1Grid1.Text = "Fkey"lyr.BeginAccess miAccessReadi = 1For Each ftr In ftrsSet rvs = ds.RowValues(ftr)j = 0For Each rv In rvsIf Not IsNull(rv.Value) Then Grid1.TextArray(i * DsCols + j) = Trim(rv.Value)j = j + 1NextGrid1.TextArray(i * DsCols + j) = ftr.FeatureKeyi = i + 1Nextlyr.EndAccess miAccessEndSet ftr = NothingSet ftrs = NothingSet ds = NothingSet rv = NothingSet rvs = NothingSet lyr = Nothing注意:BeginAccess,以及EndAccess可以明显的提高属性读取的速度。2、自定义范围专题图MapX的专题图用户可以进行完全的定制,下面是自定义范围专题图的例子。Dim ds As New MapXLib.DatasetDim thm As New MapXLib.ThemeSet ds = Formmain.Map1.Datasets(ToolBars.Combo2.Text)Set thm = ds.Themes.add(0, "aa", "aa", False)thm.Legend.Compact = Falsethm.AutoRecompute = False'thm.ComputeTheme = Falsethm.DataMax = 700thm.DataMin = 100thm.ThemeProperties.AllowEmptyRanges = Truethm.ThemeProperties.NumRanges = 7thm.ThemeProperties.DistMethod = miCustomRangesthm.ThemeProperties.RangeCategories(1).Max = 150thm.ThemeProperties.RangeCategories(1).Min = 50thm.ThemeProperties.RangeCategories(2).Max = 250thm.ThemeProperties.RangeCategories(2).Min = 150thm.ThemeProperties.RangeCategories(3).Max = 350thm.ThemeProperties.RangeCategories(3).Min = 250thm.ThemeProperties.RangeCategories(4).Max = 450thm.ThemeProperties.RangeCategories(4).Min = 350thm.ThemeProperties.RangeCategories(5).Max = 550thm.ThemeProperties.RangeCategories(5).Min = 450thm.ThemeProperties.RangeCategories(6).Max = 650thm.ThemeProperties.RangeCategories(6).Min = 550thm.ThemeProperties.RangeCategories(7).Max = 750thm.ThemeProperties.RangeCategories(7).Min = 650'thm.ComputeTheme = Truethm.AutoRecompute = Truethm.Visible = True3、在Mapx中查找对象有两种方式1)使用Find对象的Search方法。在MapX3.5中只能作到完全匹配查找,在MapX4.0SearchEx方法则可以找到多个匹配的记录,其结果由 FindResult.Matches获取。详细请参看有关Find.SearchEx 方法的文档以及示例。2)使用Layer 对象的OBJECT.Search (strWhere)方法。其参数为SQL查询的WHERE子句。例如:Set ftrs = lyr.Search("Character_Name = ""北京市""") Set ftrs = lyrUSA.Search("TOTPOP > 1000000")注意:1)字符串外加两个双引号;2)首先将图层加入数据集Datasets 才能使用查询。模糊查询最方便的方法是使用第二种方法,例如:Set ftrs = lyr.Search("Character_Name like ""%""") 4、在MapX中如何紧缩表Mapx4.51下可以使用LayerInfo 的创建带结构的临时表和新表的功能来完成紧缩:Set lyr = Formmain.Map1.Layers(ToolBars.combo1.Text)Set ds = Formmain.Map1.Datasets.add(6, lyr) '获取被紧缩表的路径及表名filespec = Formmain.Map1.Layers.Item(ToolBars.combo1.Text).filespeclayername = lyr.Name '将表临时存放于内存 LayerInfo.Type = 6 'miLayerInfoTypeTempLayerInfo.AddParameter "TableStorageType", "MemTable" '临时文件保存在磁盘上还是内存。LayerInfo.AddParameter "Name", "lyrpack"LayerInfo.AddParameter "Fields", ds.FieldsLayerInfo.AddParameter "Features", lyr.AllFeaturesFormmain.Map1.Layers.add LayerInfo, LayerPos Set LayerInfo = Nothing '从地图窗口删除原表Formmain.Map1.Datasets.Remove (ds.Name)Formmain.Map1.Layers.Remove (lyr.Name)Formmain.Map1.RefreshSet lyr = NothingSet ds = Nothing Set lyr = Formmain.Map1.Layers("lyrpack")Set ds = Formmain.Map1.Datasets.add(6, lyr)'从磁盘删除原表Kill filespec5、在MapX中如何使用自定义栅格符号使用自定义符号首先需要设定style.SymbolType miSymbolTypeBitmap,然后指定SymbolBitmapName 为栅格图像名即可。下面的代码演示了如何在delphi中使用自定义的栅格符号首先调用自定义工具画点Procedure TForm1.new1Click(Sender: TObject);Beginmap1.ControlInterface.CurrentTool :=111;End;tooluses事件中如下:procedure TForm1.Map1ToolUsed(Sender: TObject; ToolNum: Smallint; X1, Y1,X2, Y2, Distance: Double; Shift, Ctrl: WordBool;var EnableDefault: WordBool);varssymbol :cmapxstyle;p: CMapXPoint;f: cmapxfeature;beginssymbol:=costyle.create;ssymbol.SymbolType :=1;ssymbol.SymbolBitmapSize:=25;{请注意将test.bmp文件考到mapx “共有文件路径”+\CUSTSYMB”路径下,例如C:\Program Files\Common Files\MapInfo Shared\MapX Common MapX 共有文件的缺省安装路径}ssymbol.SymbolBitmapName:='test.BMP';p := CoPoint.Create;f :=cofeature.Create ;p.Set_(x1,y1);if toolnum=111 then beginf:=map1.ControlInterface.FeatureFactory.CreateSymbol(p,ssymbol);map1.ControlInterface.Layers.Item(1).AddFeature(f,EmptyParam);end;end;6、在MapX中如何使用自定义鼠标MapX4.0,及以上版本中允许用户自定义鼠标。程序如下:Map1.MousePointer = miCustomCursorMap1.MouseIcon = "c:\windows\cursors\globe.ani" MapX中还对鼠标滚动轮提供支持,属性如下:Map.MouseWheelSupport=miMousewheelNoAutoScroll