mapx讲义 (来自skyma)

地图数据与属性数据的关联——MapX核心技术剖析(八) 二、 地图数据与属性数据的关联  开发过程中涉及的数据主要包括两个来源:一部分是Geoset中包含的地图数据文件,即Djqh.tab、Djs.tab和Gq.tab;其它所有的非几何数据即属性数据均由MS SQL Server管理。因此,要实现图文互动,必须建立几何数据和属性数据之间的关系。  MapX支持的外部数据  在MapX中可以引用多种类型的外部数据。  (1)、 地图数据:如果用户已经购买 阅读详情

MapX应用讲义

 

一、加载地图数据 

 

1、 TAB的数据分为两种数据:地图数据(Layers)、属性数据(Datasets)。关系:不可

分割的一个数据集的两部分. 

2、 数据加载:GST文件由GeosetManager40.exe程序生成。在程序使用gsT文件:Map1.Ge

oset=Filepath+FileName 

3、 问题:GST文件加载后,只是默认将地图数据加载,属性数据另外需要使用单独的命令

进行加载,否则对属性数据的操作全部非法。加载:Map1.Datasets.ADD 属性数据集名称

 

4、 另一种加载方式:使用LayerInfo 对象,这种方式下加载地图数据源的地图集和属性

集均可直接使用。示例: 

dim LayerInfo as MapXLib.LayerInfo 

dim Lyr as Mpxlib.layer 

 

LayerInfo.Type = miLayerInfoTypeTab    ‘加载表的类型 

LayerInfo.AddParameter "FileSpec", FilePath + LayerName + ".TAB"      ‘加载表

的全路径名 

LayerInfo.AddParameter "NAME", LayerName   ‘地图集的别名 

LayerInfo.AddParameter "AutoCreateDataset", 1    ‘是否加载属性数据集 

LayerInfo.AddParameter "datasetname", LayerName   ‘属性数据集别名 

 

MainMap.Layers.Add LayerInfo    ‘加载到指定的MapX对象中,立即可直接使用 

 

5、 第三种加载数据方式:GST文件+ LayerInfo方式。示例: 

     使用两个MapX对象:MainMap、TempMap 

TempMap.Geoset=GST文件 

MainMap.geoset=”” 

TempMap.Refresh 

 

For I=1 to TempMap.Layers.Count 

FileName=TempMap.Layers.Item(I).Filespec 

‘直接引用LayerInfo方式加载地图数据到MainMap 

Next 

 

 

二、创建地图对象 

 

必要:创建地图对象,必须使用FeatureFactory对象 

1、 创建一个点对象 

点对象有一个坐标点(X,Y),点对象变量是Point类型,点对象的样式(Style)是符号

样式。 

Dim Pnt AS MapXLib.Point 

Dim FeaFac AS MapXLib.FeatureFactory 

Dim Lyr AS MapXLib.Layer 

Dim Ftr AS MapXLib.Feature 

Dim NewStyle AS MapXLib.Style 

 

‘绑定 

SET Lyr=MainMap.Layers.Item(LayerName) 

SET FeaFac=mainmap.featurefactory 

‘设置点对象样式 

With NewStyle 

    .SymbolType = miSymbolTypeBitmap 

    .SymbolBitmapSize = 24 

    .SymbolBitmapTransparent = False 

    .SymbolBitmapName = "YIEL2-32.BMP" 

End With 

Mainmap.AutoRedraw=False     ‘禁止自动刷新 

Lyr.Editable=True              ‘置当前图层为可写状态 

‘创建点对象 

pnt.set X1,Y1 

‘添加进当前图层 

Set Ftr=FeaFac. CreateSymbol (Pnt,Newstyle)   ‘创建符号 

‘Set Ftr=FeaFac. CreateSymbol (Pnt,MainMap.DefaultStyle) 

‘添加 

Lyr.AddFeature Ftr 

Lyr.Refresh 

Mainmap.AutoRedraw=True 

Lyr.Editable=False 

‘释放 

SET Pnt = Nothing 

SET FeaFac  = Nothing 

SET Lyr  = Nothing 

SET Ftr  = Nothing 

‘以上代码放在MapX的ToolUsed事件下 

 

单独修改某个图元的样式:SET Ftr.Style=NewStyle,再用Update 即可 

2、 创建一个线矩形 

Dim Pnts AS MapXLib.Points 

 

With NewStyle 

    .LineColor=Rgb(0, 0,255) 

End With 

‘第一个点 

Pnt.Set X1,Y1 

Pnts.add Pnt 

‘第二个点 

Pnt.Set X2,Y1 

Pnts.add Pnt 

‘第三个点 

Pnt.Set X2,Y2 

Pnts.add Pnt 

‘第四个点 

Pnt.Set X1,Y2 

Pnts.add Pnt 

‘第五个点 

Pnt.Set X1,Y1 

Pnts.add Pnt 

 

‘创建线矩形 

SET Ftr=FeaFac.CreateLine(Pnts,NewStyle) 

Lyr.AddFeature Ftr 

Lyr.Refresh 

 

3、 上面创建对象中存在的问题:并未对其数据数据进行赋值 

创建对象的同时创建其数据集合 

Dim Pnt AS MapXLib.Point 

Dim FeaFac AS MapXLib.FeatureFactory 

Dim Lyr AS MapXLib.Layer 

Dim Ftr AS MapXLib.Feature 

Dim NewStyle AS MapXLib.Style 

Dim ds AS MapXLib.Dataset 

Dim Flds AS MapXLib.Fields 

 

 ‘绑定 

SET Lyr=MainMap.Layers.Item(LayerName) 

SET ds=Lyr.Datasets.Item(1) 

Set Flds=ds.Fields 

SET FeaFac=mainmap.featurefactory 

‘设置点对象样式 

With NewStyle 

    .SymbolType = miSymbolTypeBitmap 

    .SymbolBitmapSize = 24 

    .SymbolBitmapTransparent = False 

    .SymbolBitmapName = "YIEL2-32.BMP" 

End With 

Mainmap.AutoRedraw=False     ‘禁止自动刷新 

Lyr.Editable=True              ‘置当前图层为可写状态 

‘创建点对象 

pnt.set X1,Y1 

‘创建图形 

Set Ftr=FeaFac. CreateSymbol (Pnt,Newstyle)   ‘创建符号 

‘Set Ftr=FeaFac. CreateSymbol (Pnt,MainMap.DefaultStyle) 

‘设置属性 

For I=1 to Flds.Count 

Lyr.KeyFields=Flds.Item(i).Name 

Ftr.KeyValue=ValueStr(I)   ‘这里并没有对字段类型进行判断 

Next 

‘另外一种方法:使用RowValues和RowValue对象 

‘添加 

Lyr.AddFeature Ftr 

Lyr.Refresh 

Mainmap.AutoRedraw=True 

Lyr.Editable=False 

‘释放 

SET Pnt = Nothing 

SET FeaFac  = Nothing 

SET Lyr  = Nothing 

SET Ftr  = Nothing 

 

SET ds = Nothing 

SET Flds  = Nothing 

4、 创建表 

(1) 临时表: 

A、用MainMap.Layers.CreateLayer方法创建临时表。但这个临时表只有一个字段:GeoNa

me( Char 24)。程序运行过程中该表存放位置为系统临时文件夹下 

B、使用LayerInfo对象创建临时表,可以指定字段。示例: 

 

  Dim Lyr As MapXLib.Layer 

  Dim LayerInfo As New MapXLib.LayerInfo 

  Dim Flds As New MapXLib.Fields 

   

‘字段定义 

  Flds.AddStringField "ID", 12 

  Flds.AddStringField "Name", 50 

  Flds.AddNumericField "Deptch", 12, 2 

  Flds.AddIntegerField "Length" 

   

  ´ 

  LayerInfo.Type = miLayerInfoTypeTemp 

  LayerInfo.AddParameter "FileSpec", FileName 

  LayerInfo.AddParameter "NAME", LayerName 

  LayerInfo.AddParameter "Fields", Flds 

   

  Set Lyr = MainMap.Layers.Add(LayerInfo, 1) 

   

  Set Lyr = Nothing 

  Set LayerInfo = Nothing 

 

(2) 创建永久表 

  Dim Lyr As MapXLib.Layer 

  Dim LayerInfo As New MapXLib.LayerInfo 

  Dim Flds As New MapXLib.Fields 

   

  Flds.AddStringField "ID", 12 

  Flds.AddStringField "Name", 50 

  Flds.AddNumericField "Deptch", 12, 2 

  Flds.AddIntegerField "Length" 

   

  ´ 

  LayerInfo.Type = miLayerInfoTypeNewTable 

  LayerInfo.AddParameter "FileSpec", FilePath + "" + FileName 

  LayerInfo.AddParameter "NAME", LayerName 

  LayerInfo.AddParameter "Fields", Flds 

   

  Set Lyr = MainMap.Layers.Add(LayerInfo, 1) 

   

  Set Lyr = Nothing 

  Set LayerInfo = Nothing 

 

 

5、 创建工具句柄 

系统已经定义工具句柄都以整数(包括16进制)常数存在,句柄号大于1000和小于12基本

都为系统使用。 

A. 定义常数:必须为全局变量 

Global Const CreateSymbolTool = 13   ´创建节点 

Global Const CreateLineTool = 15     ´创建管线 

Global Const InfoTipTool = 16        ´信息工具 

Global Const MoveFeature = 17        ´移动地图 

Global Const ScaleDistanceTool = 18  ´测量两点间的距离 

 

B. 使用CreateCustomTool创建新的工具句柄: 

MainMap.CreateCustomTool CreateSymbolTool, miToolTypePoint, miSymbolCursor 

MainMap.CreateCustomTool CreateLineTool, miToolTypeLine, miCrossCursor 

MainMap.CreateCustomTool InfoTipTool, miToolTypePoint, miCrossCursor 

MainMap.CreateCustomTool MoveFeature, miToolTypeLine, miPanCursor 

MainMap.CreateCustomTool ScaleDistanceTool, miToolTypeLine, miPanCursor 

C. 如何使用?  

在Map对象的ToolUsed事件的ToolNum参数为当前所激活的工具 

使当 

前操作指向某行为:MainMap.CurrentTool=工具句柄号,如放大:MainMap.CurrentTool=

miZoomInTool,移动图元:MainMap.CurrentTool=MoveFeature 

操作具体的工具句柄时,执行该捕捉到的工具句柄的代码: 

在ToolUsed事件中: 

 

Select Case ToolNum 

   Case MoveFeature 

      ‘执行代码 

End Select 

 

删除图元:Lyr.DeleteFeature Ftr 

 

 

三、查询 

 

1、 属性查找。Find、Search方法:注意的是Find方法只支持TAB表文件,不支持空间数据

表。 

Find :与FoxPro中Locate定位命令想类似。 

Search:支持SQL语句。写法:仅指SQL语句的WHERE 部分,且From语句中只能有一个表—

—仅对单表进行操作:Select * from LayerName WHERE ID LIKE “%北京%” 

示例: 

A、查找 

Dim Ftrs AS MapXlib.Features     ‘图元集合 

 

SET Ftrs=Lyr.Search(“ID LIKE ““%北京%”””) 

For I=1 to Ftrs.Count 

   ‘执行语句 

Next 

B、高亮显示 

Lyr.Selection.Replace Ftrs    ‘将当前查询所得的结果集全部高亮显示(隐含执行:

Lyr.ClearSelection语句)——加入selection集合 

闪烁:不能用Selection,否则会对整个屏幕进行整个刷新(抖动)。使用更新Style的方

法进行选定图元的闪烁。 

记载图元的老样式:Set Oldsytle=Ftr.Style 

 

Lyr.Selection.Add Ftrs    ‘将当前查询所得的结果集添加到已有的结果集中,再全部

高亮显示 

C、对查询的结果集进行属性修改 

示例程序:完成的是Professional中信息工具功能 

Dim ds AS MapXlib.Dataset 

Dim Flds AS MapXlib.Fields 

Dim Ftr AS MapXlib.Feature 

 

Set Lyr=MainMap.Layers.Item(LayerName) 

Set ds=Lyr.Datasets.item(1) 

Set Flds=ds.Fields 

‘查找 

SET Ftrs=Lyr.Search(“ID LIKE ““%北京%”””) 

If Ftrs.count=0 then exit sub 

 

‘读取属性值 

For I=1 to Ftrs.Count 

   Set Ftr=Ftrs.Item(I) 

   For j=1 to Flds.count 

FldsName(J)=Flds.Item(J).Name    ‘字段列表 

Lyr.KeyField=FldsName(J) 

  ValueStr(I,J)=Ftr.KeyValue        ‘值列表 

   Next 

Next 

 

‘修改属性 

MainMap.AuyoRedraw=False 

Lyr.Editable=True 

 

For j=1 to Flds.count 

Lyr.KeyField= Flds.Item(J).Name 

Ftrs.Item(j).KeyValue =ValueStr(J)     ‘更新值列表 

Ftrs.Item(j).Update True 

Next 

 

Lyr.Refresh 

Lyr.Editable=False 

MainMap.AuyoRedraw=True 

 

‘修改样式 

Dim NewStyle AS MapXlib.Style 

 

With NewStyle 

‘设置样式 

End With 

 

MainMap.AuyoRedraw=False 

Lyr.Editable=True 

 

For i=1 to Ftrs.count 

Set Ftr =Ftrs.Item(I) 

SET Ftr.Style=NewStyle        ‘更新样式 

Ftr.Update True 

Next 

 

Lyr.Refresh 

Lyr.Editable=False 

MainMap.AuyoRedraw=True 

 

2、 空间查找 

² 点查找:SearchAtPoint,结果集为Features类型 

Dim Pnt AS MapXlib.Point 

 

Pnt.Set X,Y 

Set Ftrs=Lyr.SearchAtPoint(Pnt,miSearchResultAll) 

For I=1 to Ftrs.Count 

   ‘执行语句 

Next 

注意:点查找时,一般情况下结果集在一个以上的图层都存在。所以取值时应分别提取 

 

 

² 园查找:在临时图层上画一个不保存的圆,然后查找被这个圆所包含的所有图层的

图元对象。 

Dim Pnt AS MapXlib.Point 

Dim TempCir AS MapXlib.Feature 

Dim FeaFac AS MapXLIB.featurefactory 

 

Pnt.Set X,Y 

Set tempcir=FeaFac.CreateCircularRegion(miCircleTypeMap ,Pnt,1, MainMap.MapUni

t,,) 

 

‘miSearchTypeCentroidWithin :中心点包含 

‘miSearchTypePartiallyWithin :部分包含 

‘miSearchTypeEntirelyWithin :全部包含 

 

Set Ftrs=Lyr.SearchWithinFeature (TempCir, miSearchTypePartiallyWithin) 

 

For I=1 to Ftrs.Count 

   ‘执行语句 

Next 

 

SET Pnt =Nothing 

set TempCir =Nothing 

set FeaFac =Nothing 

 

3、 相交 

判断两个图元是否有交点以及交点坐标信息。 

(1)判断是否相交 

IF Lyr.IntersectionTest( ftr1, ftr2, miIntersectFeature ) THEN 

   ‘交点 

END IF 

 

(2)获取相交点坐标信息 

‘交点 

Dim Ftr AS MapXlib.Feature 

 

SET Ftr=MainMap.FeatureFactory. IntersectFeatures(Ftr1,Ftr2) 

‘交点坐标信息 

For J=1 to Ftr.parts.item(1).count 

    X1= Ftr.parts.item(1).Item(J).X 

    Y1= Ftr.parts.item(1).Item(J).Y 

Next 

 

4、 测距 

使用Map对象的Distance方法。如何测量任意多边形的周长? 

使用累加的方法,还要使用图元节点集合。 

DistanceValue=0 

‘第一个点 

Pnt.Set Ftr.Parts.Item(1).Item(1).X, Ftr.Parts.Item(1).Item(1).Y 

For j=2 TO Ftr.Parts.Item(1).Count 

   ‘累加 

   X1= Ftr.Parts.Item(1).Item(j-1).X 

   Y1= Ftr.Parts.Item(1).Item(j-1).Y 

   X2= Ftr.Parts.Item(1).Item(j).X 

Y2= Ftr.Parts.Item(1).Item(j).Y 

   DistanceValue = DistanceValue +MainMap.Distance(X1, Y1, X2, Y2) 

Next 

‘多边形周长 

Msgbox DistanceValue+” ”+MainMap.MapUnit 

 

 

四、对象编辑 

 

(1)、对属性的编辑 

主要使用Fields对象。示例: 

Dim Flds AS MapXlIB.Fields 

 

‘修改当前图层的每一个字段 

For J=1 to Flds.Count 

Lyr.KeyField= Flds.Item(j).Name ‘使当前图层指向J字段 

  ‘更新当前图元的J字段值 

  Ftr.KeyValue=NewValueStr(J) 

  Ftr.Update True    ‘并未写入硬盘 

Next 

Lyr.Refresh      ‘保存修改到硬盘 

 

(2)、移动地图 

首先创建一个移动工具句柄 

MainMap.CreateCustomTool MoveFeature, miToolTypeLine, miPanCursor 

在Map对象的ToolUsed事件的ToolNum参数为当前所激活的工具 

捕捉MoveFeature工具句柄 

‘传过来的参数:X1,Y1,X2,Y2 

Select case ToolNum 

   …….. 

   Case  MoveFeature 

Dim Lyr AS MapXlib.Layer 

Dim Ftr AS MapXlib.Feature 

Dim Ftrs AS MapXlib.Features 

 

Dim Xe,Ye AS Double     ‘坐标偏移量 

 

Xe=X2-X1 

Ye=Y2-Y1 

 

Set Lyr=Mainmap.Layers.Item(LayerName) 

Set Ftrs=Lyr.Selection.Clone      ‘将当前图层中选定的集合复制到Ftrs变量中 

MainMap.AutoRedraw=False 

Lyr.Editable=True 

For J=1 to Ftrs.Count 

   Set Ftr=Ftrs.Item(J) 

   Ftr.Offset Xe,Ye 

   Ftr.Update True 

Next 

Lyr.Refresh 

Lyr.Editable=False 

MainMap.AutoRedraw=True 

 

SET lyr=Nothing 

SET Ftr=Nothing 

End Select 

(3)、样式更新 

 Dim NewStyle AS MapXLib.Style 

 

‘初始赋值 

Set Lyr=MainMap.Layers.Item(LayerName) 

Set Ftrs=Lyr.AllFeatures 

Set NewStyle=Ftrs.Item(1).Style 

‘设置样式 

With NewStyle 

    .SymbolType = miSymbolTypeBitmap 

    .SymbolBitmapSize = 24 

    .SymbolBitmapTransparent = False 

    .SymbolBitmapName = "YIEL2-32.BMP" 

End With 

‘更新 

MainMap.AutoRedraw=False 

Lyr.Editable=True 

SET Ftr.Style=NewStyle 

Ftr.Update True 

Lyr.Refresh 

Lyr.Editable=False 

MainMap.AutoRedraw=True

 

 

五、输出 

 

1、属性的输出   输出到EXCEL表: 

For I=1 to Flds.Count 

Lyr.KeyFields=Flds.Item(i).Name 

Excel(1,I).Cell=Ftr.KeyValue 

Next 

2、复制、粘贴 

Global CopyFtrs AS MapXlib.Features 

 

Set lyr=mainmap.Layers.item(LayerName) 

Set Ftrs=Lyr.Selection.Clone      ‘复制选中集合 

‘复制 

For I=1 to Ftrs.Count 

CopyFtrs.add Ftrs.Item(I) 

Next 

 

‘粘贴(图形) 

Set lyr_1=mainmap.Layers.item(LayerName_1) 

Mainmap.AutoRedraw=False 

Lyr_1.Editabled=True 

For J=1 to CopyFtrs.Count 

   Lyr_1.AddFeature CopyFtrs.Item(J) 

Next 

Lyr_1.Refresh 

Mainmap.AutoRedraw=True 

Lyr_1.Editabled=False 

 

3、地图的打印 

  Dim iScaleMode As Integer 

 

  iScaleMode = MainMap.Container.ScaleMode 

  MainMap.Container.ScaleMode = 6 

 

  On Error GoTo PrinterError 

   

  Printer.Print " " 

  Printer.CurrentX = 0 

  Printer.CurrentY = 0 

  MainMap.PrintMap Printer.hDC, 0, 0, MainMap.Width * 100, MainMap.Height * 10

0 

  Printer.NewPage 

  Printer.EndDoc 

  MainMap.Container.ScaleMode = iScaleMode 

  Exit Sub 

   

PrinterError: 

  If Err.Number = 482 Then 

     On Error Resume Next 

     CommonDialog1.Flags = &H40 

     CommonDialog1.ShowPrinter 

  Else 

     MsgBox "    打印机存在错误,请更正后重试。错误号:" + (Str(Err.Number)), 

, "失败" 

  End If 

   

 

4、另存为图片文件 

MainMap.ExportMap(App.Path+”Images”, miFormatJPEG)   ‘输出当前地图窗口 

参数设置:MainMap.ExportSelection=True   ‘将选中部分以不同于其他未选中地图部分

形式输出

 

六、专题图 

 

6种专题图:除独立值专题图绑定的字段类型可以是字符的以外,都必须是数字类型。与其

他数据源绑定时,使用ODBC 

调用ThemeDlg对话框可以让用户自己定义专题图。示例: 

For Each ftr In lyr.Selection 

 ' The children of the layer are the individual 

 ' features 

 

 Set ftrNode = QueryTree.Nodes.Add(lyrNode, tvwChild,lyr.Name _ 

 

 & ftr.Name & Str$(ftr.FeatureID), ftr.Name) 

 

 For Each fld In ds.Fields 

 

  ' Each feature has data attached to it; add  this data as a child of the feature 

 

  lyr.KeyField = fld.Name 

 

  QueryTree.Nodes.Add ftrNode, tvwChild, , lyr.KeyField _ 

 

  & ": " & ftr.KeyValue 

 

 Next 

 

Next   

七、在MapX下紧缩表 

 

在Professional里面,紧缩表用 Pack Table 语句完成。而在MapX中则需要使用临时图层

,并用复制技术来完成。示例: 

‘紧缩当前Map对象中的所有图层 

   Dim LayerInfo As New MapXLib.LayerInfo 

   Dim Lyr As MapXLib.Layer 

   Dim LyrTemp As MapXLib.Layer 

   Dim Flds As MapXLib.Fields 

   Dim Ds As MapXLib.Dataset 

    

   Dim I As Integer 

   Dim LayerName, FilePath As String 

    

   On Error Resume Next 

    

   For I = MainMap.Layers.Count To 1 Step -1 

      ´复制源表数据到临时表 

      Set Lyr = MainMap.Layers.Item(I) 

      Set Ds = Lyr.Datasets.Item(1) 

      Set Flds = Ds.Fields 

       

      LayerName = Lyr.Name 

       

      LayerInfo.Type = miLayerInfoTypeTemp 

      LayerInfo.AddParameter "FileSpec", LayerName 

      LayerInfo.AddParameter "NAME", LayerName 

     LayerInfo.AddParameter "Features", Lyr.AllFeatures‘复制所有有效图元 

      LayerInfo.AddParameter "Fields", Flds    ’复制字段列表 

       

      LayerInfo.AddParameter "AutoCreateDataset", 1 

      LayerInfo.AddParameter "datasetname", LayerName 

Set LyrTemp = MapTemp.Layers.Add(LayerInfo, 1)    ‘复制到另外Map对象 

       

      ´删除源表 

      Set Lyr = Nothing 

      FilePath = MainMap.Layers.Item(I).Filespec 

      LayerName = Mid(FilePath, InStr(1, FilePath, "Maps") + 6, Len(FilePath) 

- InStr(1, FilePath, "Maps")) 

      FilePath = Mid(FilePath, 1, InStr(1, FilePath, "Maps") + 5) 

      LayerName = Mid(LayerName, 1, Len(LayerName) - 4) 

       

      MainMap.Layers.Remove (I) 

      MainMap.Refresh 

       

      Kill FilePath + LayerName + ".TAB" 

       

      ´复制临时表数据到源表 

      Set LyrTemp = MapTemp.Layers.Item(LayerName) 

 

      LayerInfo.Type = miLayerInfoTypeNewTable 

      LayerInfo.AddParameter "FileSpec", FilePath + LayerName + ".TAB" 

      LayerInfo.AddParameter "NAME", LayerName 

      LayerInfo.AddParameter "Features", LyrTemp.AllFeatures 

      LayerInfo.AddParameter "Fields", Flds 

         

      LayerInfo.AddParameter "AutoCreateDataset", 1 

      LayerInfo.AddParameter "datasetname", LayerName 

      Set Lyr = MainMap.Layers.Add(LayerInfo, 1) 

       

      ´删除临时表 

      MapTemp.Layers.Remove (MapTemp.Layers.Count) 

      MapTemp.Refresh 

   Next 

       

   Set Lyr = Nothing 

   Set Ds = Nothing 

   Set Flds = Nothing 

   Set LayerInfo = Nothing 

 

八、如何和大型数据库关联 

 

 

系统是混合结构:对地图的访问使用的是文件访问方式,对属性数据的访问使用的是大型

数据库形式使用ID关联:在TAB表和数据库中有ID字段,两个字段作为唯一值关联字段。(

一对一的关系)。示例: 

 

Lyr.KeyField=”ID” 

Set Ftr=Ftrs.Item(J) 

 

‘SQL语句查找对应的属性信息 

SampleAdo.RecordSource =”Select a.id as id,b.name as name from Table1 a, Tabl

e2 b WHERE (a.id=b.id) AND ( a.id LIKE ‘%“ +Ftr.KeyValue+“%’)”

 

九、空间数据库 

 

’空间数据库中的索引技术用的是R_Tree技术,而不是原来一般意义上的B_Tree索引

技术。 

’空间数据在Spatial中以地理属性信息形式存放。 

’在Oracle的版本中有如下需要注意事项: 

a) Oracle 8.1.5这个版本中,首次引入Spatial组件。使用上非常不好:图形的样式非常

单一,且为黑白的而非彩色,上载地图数据时,数据丢失非常严重。存取数据时非常慢。

在Spatial中自动创建prinx字段作为地图索引主关键字段 

b) Oracle 8.1.6版本:图形为彩色的,增加了样式的支持,但不支持同一图层下的多样式

(主要指点对象)。创建地图数据时,地图的坐标常发生偏移。属性数据更新时,需要两

次刷新才能完整提交;地图数据数据提交时,其坐标发生偏移:向原点偏移,需要认为地

单独将其移动到其初始创建位置。存取速度上还是比较慢,离实用尚有一定距离。在Spat

ial中自动创建mi_prinx字段作为地图索引主关键字段 

² Oracle 8.1.7版本:支持多样式,数据上载丢失非常小(只有文本对象存在丢失的

记录)。在地图数据存取不是很大的时候,速度上可以被用户接受。 

² 如何将MapInfo 的TAB表内容上传到Oracle 中? 

a) 免费工具:easyloader6.7(Oracle 8.1.7),下载地址:www.mapinfo.com.cn 

b) 如何上载?注意:上载之前对Tab表进行紧缩。 

c) 在程序中如何使用空间数据库中的地图数据? 

d) 添加地图时,必须指定字段mi_prinx的明确值,且该值不能为表中已存在的值。写入地

图数据时,应将其全部NOT NULL 字段值赋给,否则保存失败。 

e) 示例:Tab表+空间数据表 的数据分布形式。 

 

 

十、GIS应用的分发 

 

1、 制作你自己的系统的安装盘:可执行文件、必要系统文件、运行库文件、其他数据文

件。 

2、 单独的MapX安装盘:MapInfo MapX Runtime安装程序,实际上是MapX控件安装程序(

存在于MapX sdk包) 

3、 注册:安装完成以后,运行GeosetManager40.exe程序获得硬件ID号,然后通过EMAIL

的形式将该ID号发送到MapX产品供应商申请正式的许可文件(mapx40.lic)。获得后覆盖

原mapx40.lic文件即可。注意:硬盘格式化后该ID号失效。

 

十一、构造一个GIS应用系统 

 

需求:鹰眼功能、拓扑关系、不同图形不同颜色表现、数据绑定、系统性能。 

 

结构分析:做基于TAB文件的GIS系统 

1、 鹰眼功能 

(1) 建立两个Form对象,将两个Map对象分别放在这两个窗口对象中。 

(2) 一个小窗口作为鹰眼窗口,大 窗口作为主地图窗口。鹰眼窗口中的Map对象的视野

应很大,而主地图窗口的视野根据需要设置。 

(3) 两个窗口中加载不同的GST文件。需要的是主地图窗口的显示范围应为鹰眼窗口中某

个矩形所包含的地图对象范围。 

(4) A、在鹰眼窗口中画一个矩形(Rect为矩形对象),B、主地图窗口执行 Set MainM

ap.Bounds = Rect 

(5) 需要注意的是:鹰眼窗口与主地图窗口两者间的坐标投影系统应完全一致。 

 

2、 拓扑关系 

实际上就是图元与图元的空间关系。说历史:原来建立拓扑关系使用的是属性关联。 

点查询、圆查询、矩形查询、多边形查询等这些是属于简单空间关系的对比。而对拓扑关

系的查询多数情况下使用Parts对象来解决。 

Ftr1与另一个Ftr2的空间关联:先找到Ftr1的其止节点,然后以这个节点为中心画一个非

常小的圆,在这个圆范围内的某个设备可认为与该Ftr1相连。 

判断某个图元在指定图层上的相交对象集合: 

Set Ftrs=Lyr.SearchWithinFeature (SearchFtr, miSearchTypePartiallyWithin) 

 

3、 不同图形不同颜色表现 

(1)更新样式   再结合临时图层就可以很好解决(使用图层刷新)。而且刷新时不会引

起整个Map对象的刷新(屏幕抖动) 

(2)专题图   存在更新属性值后不能实时刷新专题图的问题。 

4、 数据绑定 

对未绑定的属性集合使用 MainMap.Datasets.ADD 

地图集合和属性集合为一个数据集合的不可分割的两个部分 

5、 系统性能 

速度是否为用户所接受、系统是否稳定(界面要求)、修改数据数据的时候是否存在数据

一致性维护问题、造价是否合理。 

(1)速度:使用数据分布可以较好地解决:地图数据:地形图数据以文件形式存放,业务

地图数据存放在空间数据库中;属性数据:全部存放在大型数据库中。 

 

(2)系统是否稳定(界面要求):A、字段全部用英文,B、地图拓扑关系在进入系统以前

进行必要的验证,C、文件地图数据中字段数减少到最小,可使访问属性频率大大减少,可

有效保证其他用户访问时不会大量出现访问拒绝的现象;D、数据提交时尽可能采用事务机

制: 事务开始:          Lyr.BeginAccess,事务结束:Lyr.EndAccess;E、数据修改

提交时尽可能采用批量提交。至于界面要求,应主要满足从地图对象获取相关的要求。 

 

(3)数据一致维护:遵循图元优先的原则。图形对象必须首先存在,其他相关信息在此基

础上建立。注意: 

² 修改时应先修改地图对象,后提交属性信息 

² 删除时应先删除其他信息,最后删除图形信息 

(4)造价  这里主要指平台费用。A、现有数据格式,B、功能要求:空间分析是否复杂、

地图图层是否分散、系统中地图输出的质量要求、系统中统计分析复杂程度是否较繁琐、

直接的平台使用用户数(并发数)。

GIS开发方式的选择:MapX核心技术剖析 通过学习MapX的核心技术并应用实际项目中,开发人员能够更好地理解和掌握GIS开发,并实现高效、可靠的地理信息系统。MapX是一种基于.NET平台的GIS开发框架,提供了丰富的功能和工具,用于构建各种地理信息应用程序。MapX支持多种地图和数据格式,并提供了强大的地图渲染和空间分析功能。除了上面示例中的基本操作外,MapX还提供了许多其他功能,例如图层管理、空间查询、地图符号化、地图编辑等。通过深入研究MapX的文档和示例,开发人员可以充分利用这些功能,构建出功能强大的GIS应用程序。方法来运行应用程序。 阅读详情

相关推荐

深入学习MapX核心技术及应用

本文还有配套的精品资源,点击获取 简介:MapX是一个由Borland公司开发的地图控件,它为Windows应用程序提供了集成地图显示和GIS功能。本学习资料详细解读了MapX的核心技术特点,包括地图显示、地理坐标转换、数据集成、对象模型、事件处理、服务接口、地图服务、地图分析、打印和导出以及自定义样式和符号库。这些内容有助于GIS程序员深入理解和掌握MapX,以开发出具有...

weixin_32099703的博客 1520

MapX工具概述

MapX工具概述 内置工具 使用MapX,你能够轻松地把普通的工具栏按钮应用到你的应用中。MapX 为多个常用地图化工具提供了内置支持,其中包括: 用户更改地图的比例和/或位置的导航工具(放大、缩小、漫游、居中)。Ÿ 用户单击地图图元来进行标注的标注工具。Ÿ 给予用户不同的方式来选择地图图元的选择工具集合。Ÿ 对象创建工具,可创建地图图元。 选择工具为修改键(SHIFT 键

shiwaxinbin的专栏 2244

MapX中文教材--从入门到精通:全面技术教程

MapX 是一款功能强大的地图软件开发包(SDK),适用于各种地理信息系统(GIS)应用程序的开发。它提供了丰富的地图渲染、空间分析以及数据操作功能。MapX 不仅能够轻松集成到桌面应用程序中,还支持 WebGIS 开发,便于开发者在不同平台上创建动态的地图应用。在设计MapX应用时,首先需要考虑的是应用程序的架构。架构设计是应用程序开发的基础,它决定了应用的可维护性、可扩展性和性能。

weixin_28895791的博客 874

mapinfo二次开发之:MapX和MapXtreme区别

MapX和MapXtreme区别2:MapX需将控件装入开发环境。MapX软件开发主要针对单机软件开发,web网页版需要注册activex控件,比较麻烦。MapX和MapXtreme区别1:MapXtreme是 MapX的升级版。MapX发展到MapX5.0后不再升级,由MapXtreme代替。mapx软件和mapxtreme软件共同点:都是MapInfo公司的程序开发软件。mapxtrem软件开发的网页版,客户可以直接浏览,不需要再安装任何插件。

zhang13772562635的专栏 1261

MapX地图控件开发指南:从入门到替代方案解析

在地理信息系统(GIS)的桌面应用场景中,ActiveX地图控件曾是最经典的组件化方案。通过将地图引擎封装为可直接拖拽的控件,开发者无需依赖浏览器或网络服务,即可在Windows桌面程序中实现地图显示、图层管理与空间查询。这种离线能力极强的技术形态,让老旧的内网业务系统至今仍在使用相关组件。MapX作为其中的代表性产品,以轻量级部署、稳定的Tab格式支持和完整的二次开发接口,长期服务于电力、水务、园区管网等行业的C/S架构系统。随着WebGIS与开源技术栈的成熟,如何在维护存量系统与迁移新项目之间做出合理选

weixin_42631411的博客 247

MAPX南京地图详细分析与应用指南

本文还有配套的精品资源,点击获取 简介:MAPX南京地图是一个专门为南京及其周边区域设计的GIS数据资源,采用GST地图格式,包含地理信息如道路、建筑等。它允许开发者将其集成到应用程序中,提供多种功能。该地图数据集图层数量丰富,覆盖范围有限,适合城市规划、交通分析和环境研究。数据以MapInfo矢量格式存储,可进行空间分析和地图制图。用户需注意数据时效性,并可能需要更新数据...

weixin_30481539的博客 630

C#进行MapX二次开发之MapX基础知识

MapX的主要技术特点(1)、 以表(Table)的形式组织信息每一个表都是一组MapInfo文件,这些文件组成了地图文件和数据库文件。为使用MapInfo,就需要有组成表的用户数据和地图文件。这些文件可以来自MapInfo或者由用户创建。用户要想在MapInfo中工作,就必须打开一个或多个表。MapInfo通过表的形式将数据与地图有机地结合在一起。当用户在MapInfo中打开数据文件时,MapI...

weixin_34148508的博客 379

mapx5.0-32-64

1、将mapx文件夹拷到C盘(直接考到C盘,不要放在任何其他文件夹里) 2、打开cmd或者powershell(按win键+R调出运行,输入cmd,然后按回车键) 3、win10用户直接将“破解文档”里面的文本全选,复制到cmd或者powershell(一条一条复制也可以);win7/8如果不可以复制,自己手动一条一条输入,输完每一条敲回车键。【如果提示Regsvr32为找不到的命令,请将C:\Windows\System32设置为环境变量,(百度上有教程)】 4、在“GeosetManager50.exe - 快捷方式”上单击右键,选择属性,在兼容模式里勾选以兼容性运行这个程序(xindowsXP Server Pack3),勾选以管理员身份运行。确定后将其复制或者剪切到桌面,双击打开看看是否已经可以使用。 tip:默认的地图在C:\MapX\Maps文件夹里。

简道云学习笔记

目前简道云中有25个字段供我们选择使用,分为基础字段、增强字段和部门成员字段三个类别。选择合适的字段类型非常重要,关系到函数、联动、关联等高级功能是否可用,对表单设计、数据收集、数据分析都有很大的影响。概念公式:给表单中的某个字段编辑公式后,在填写表单或修改表单数据时,可以使该字段的值根据公式自动计算出来,不需要再手动填写。应用场景单行文本、多行文本、数字和日期时间。进入表单设计,选中要编辑公式的字段,在「字段属性>>默认值」处设置默认值为公式编辑,点击下方「编辑公式」,即可开始公式编辑。

qq_52144597的博客 2372

MapX的官方中文帮助

MapX的官方中文帮助,很实用。在编程时按F1即可。

Word | 简单可操作的快捷公式编号、右对齐和引用方法

在理工科论文的写作中,涉及到大量的公式输入,我们希望能够按照章节为公式进行编号,并且实现公式居中,编号右对齐的效果。网上有各种各样的方法来实现,操作繁琐和简单的混在一起,让没有接触过公式编号的人感觉比较混乱。笔者自己博览相关博客,亲身实践,总结出一套自认为比较简便的公式编号、对齐和引用方法,在这里分享给大家~

qq_43466146的博客 3万+

MapX应用讲义

MapX应用讲义 一、加载地图数据  1、 TAB的数据分为两种数据:地图数据(Layers)、属性数据(Datasets)。关系:不可分割的一个数据集的两部分. 2、 数据加载:GST文件由GeosetManager40.exe程序生成。在程序使用gsT文件:Map1.Geoset=Filepath+FileName 3、 问题:GST文件加载后,只是默认将地图数据加载,属性数据另外需要使用

skyma的专栏 1434

matlab内读取文件目录时斜杠和反斜杠的使用

@matlab内读取文件目录时斜杠和反斜杠的使用TOC matlab内读取文件目录时,斜杠和反斜杠的使用 最近被斜杠和反斜杠弄晕了,于是总结了一下,在此和大家分享一下。 代码 clear; clc; close all; I1= imread('..\zs1.jpg'); %和代码文件夹同目录的图片 (纯反斜杠) I2= imread('../zs2/zs2.j...

weixin_44456694的博客 6574

[转载]Mapx常见问题

1、 TAB的数据分为两种数据:地图数据(Layers)、属性数据(Datasets)。关系:不可分割的一个数据集的两部分. 2、 数据加载:GST文件由GeosetManager40.exe程序生成。在程序使用gsT文件:Map1.Geoset=Filepath+FileName 3、 问题:GST文件加载后,只是默认将地图数据加载,属性数据另外需要使用单独的命令进行加载,否则对属性数据...

weixin_33860147的博客 369

Android开发- (2)MediaProjection API实战:构建高效屏幕共享与远程控制方案

本文深入探讨了Android开发中利用MediaProjection API实现高效屏幕共享与远程控制方案的实战方法。文章从权限申请、虚拟屏幕创建讲起,详细解析了图像捕获、编码压缩、Socket网络传输的核心流程,并进一步介绍了如何构建双向控制通道及关键的性能优化与避坑指南,为开发者构建稳定可用的远程协作应用提供了完整路径。

weixin_29207533的博客 451

注册电气工程师详细教材

注册电气工程师详细教材

qq_40844444的博客 4253

MapX 简介

MapInfo MapX      进行MapInfo的开发,即使是使用OLE Automation方式,也需要熟悉MapBasic。在有几千个点的装机数或要制作CD-ROM地图集的情况下,用户也希望以较低的价格获得。MapX是一个基于ActiveX(OCX)技术的可编程控件。它使用与MapInfo Professional一致的

开心果的专栏 3436

CSR-DCF视频目标跟踪源码运行笔记

论文基本信息 论文标题:Discriminative Correlation Filter with Channel and Spatial Reliability 论文作者:Alan Lukezic等 论文出处:CVPR 2017 文章链接:https://arxiv.org/abs/1611.08461 补充材料:https://www.semanticscholar.org/paper/D...

越野者的博客 3400

MapX八个技巧

八个mapx技巧汇总 一、在mapx中查找对象的方法 两种方式: 1.使用Find对象的Search方法。 在mapx3.5中只能作到完全匹配查找,在MapX4.0中SearchEx方法则可以找到多个匹配的记录,其结果由FindResult.Matches获取。详细请参看 有关Find.SearchEx 方法的文档以及示例。 2. 使用Layer 对象的OBJECT.S...

weixin_30249203的博客 290

出个AI8051U的PWM例程 | 3相互补SPWM变频驱动,PWMA-3个相位差120度的PWM互补输出

通道2输出: P2.2, PWMA2P输出, P2.3, PWMA2N输出, PWMA2相对PWMA1滞后120度相位.通道3输出: P2.4, PWMA3P输出, P2.5, PWMA3N输出, PWMA3相对PWMA1滞后240度相位.先别修改程序, 直接下载"Objects"里的"pwm.hex"测试, 下载时选择主频24MHz.主频32.768MHz, PWM周期1422, 刷新频率23040Hz,死区0.5us,通道1输出: P2.0, PWMA1P输出, P2.1, PWMA1N输出。

USB_CAN_8051的博客 691

innovus中如何设置cts参数

上面是设置cts的一般设置,如果需要对某些skew group或者某些clock tree设置不一样的参数,如需要对clk1这个clock设置不一样的inverter,可以使用。需要查询已经设置过的ccopt参数,可以使用get_ccopt_property去查询,方法和set_ccopt_property一致。言归正传,cts的设置命令是set_ccopt_property,获取命令是get_ccopt_property。另外,set_ccopt_property提供一套命令查询方法。

芯冰乐 544

Mapx加载gst文件,自定义图层,Mapx画自定义样式矩形,圆形,椭圆形

很久没有写博文了,也是第一次写关于Gis方面的博文。今天就和大家分享一个Mapx的一个简单的例子。 1、安装mapx 5.0安装包。 2、在VS工具箱中添加Mapx控件。 3、下面来看一下具体实现: using System; using System.Collections.Generic; using System.ComponentModel; using System.Dat

胡耕永的专栏 5686

【数据同化第一期】基本概念介绍

【数据同化第一期】基本概念介绍

WW、forever的博客 1904

再谈MAPX打包以及MAPX的安装

先谈MAPX打包:以前MAPX打包的时候一直没有问题,但这次昨天晚上打到现在都没有成功,安装了打包后的软件基本上是提示1165错误。想来想去,试了很多方法都没有成功。刚开始的时候以为是GeoDict.DCT没有打包进去,于是把GeoDict.DCT放进去,但1165错误依然。师弟说,装了MAPX以后就可以运行软件了。我一直认为不是MAPX的问题。最后没有办法了,卸载MAPX再装MAPX试试,发现软...

weixin_34000916的博客 357

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

上一篇: Framework感悟 (堕落兽人)
下一篇: 21世纪遥感与GIS的发展
ghner
博客等级 码龄21年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值