380 likes | 596 Views
MapX4.5 新功能培训教程. 创建新表. 数据类型 字符串 miTypeString = 0 数字 miTypeNumeric = 1 日期 miTypeDate = 2 整型 miTypeInt = 3 短整型 miTypeSmallInt = 4 浮点型 miTypeFloat = 5 逻辑类型 miTypeLogical = 6.
E N D
创建新表 • 数据类型 字符串miTypeString = 0 • 数字 miTypeNumeric = 1 • 日期 miTypeDate = 2 • 整型 miTypeInt = 3 • 短整型 miTypeSmallInt = 4 • 浮点型 miTypeFloat = 5 • 逻辑类型 miTypeLogical = 6
增加字段的方法Fields.Add method - 增加字段 Fields.AddDateField method - 增加日期类型字段 Fields.AddFloatField method - 增加浮点类型的字段 Fields.AddIntegerField method - 增加浮点类型的字段 Fields.AddLogicalField method - 增加整数类型的字段 Fields.AddNumericField method - 增加数字类型的字段 Fields.AddSmallIntField method - 增加短整数类型的字段 Fields.AddStringField method - 增加字符类型的字段 • 删除字段Fields.Remove method - 删除一个字段 Fields.RemoveAll method - 删除所有字段
创建新表 - LayerInfo对象 LayerInfo.type常数 miLayerInfoTypeTemp = 6 - 临时表 miLayerInfoTypeNewTable = 7 - 磁盘表
创建新表 LayerInfo参数layerinfotype ; parameter ; required ; type miLayerInfoTypeTemp: Name: No; String; Name of the added layer ; Default: "LayerX”。Fields:No ; Fields collection ; Specifies the column(s) the table will have。Features:Yes, if no fields ; Features collection ; Specifies the rows to fill the table with ; Default: none。TableStorageType:No ; String ; Default: Native,Valid options: Native(临时tab表), MemTable(存在于内存)。
miLayerInfoTypeNewTabFileSpec:Yes ; String ; Name of .tab file for new table.Name:No ; String ; Name of the added layer ; Default: built on filespec. Fields:No ; Fields collection ; Specifies the column the table will have.Features:Yes,if no Fields ; Features collection; Specifies the rows to fill the table with ; Default: NONE .
示例For i = 1 To Grid1.Rows - 1 If InStr(StrType, "字符型") > 0 Then • flds.AddStringField StrName, NumWidth • ElseIf InStr(StrType, "整型") Then • flds.AddIntegerField StrName • ElseIf InStr(StrType, "短整型") Then • flds.AddSmallIntField StrName • ElseIf InStr(StrType, "浮点型") Then • flds.AddFloatField StrName • ElseIf InStr(StrType, "十进制型") Then • flds.AddNumericField StrName, NumWidth, NumDec • ElseIf InStr(StrType, "日期型") Then • flds.AddDateField StrName • ElseIf InStr(StrType, "逻辑型") Then • flds.AddLogicalField StrName • End If • Next i
If Check2.Value = 1 Then‘创建新表 • LayerInfo.Type = 7 'miLayerInfoTypeNewTab • LayerInfo.AddParameter "filespec", filespec • ElseIf Check2.Value = 0 Then’创建临时表 • LayerInfo.Type = 6 'miLayerInfoTypeTemp • 'LayerInfo.AddParameter "TableStorageType", "MemTable" '临时文件保存在磁盘上还是内存。 • End If • LayerInfo.AddParameter "Name", layername • LayerInfo.AddParameter "Fields", flds • If Option_AddToDataset = True Then ’加入数据集 • LayerInfo.AddParameter "AutoCreate", 1 • LayerInfo.AddParameter "DatasetName", Text1.Text • End If
支持日期类型 • MapX4.5支持Date类型的字段,还有 Numeric 和 String类型的字段.也就是说,若从外部数据源引入数据到数据集时,日期类型的字段将作为日期类型被引入,而不是以字符串类型引入,或者不引入。日期的格式由控制面板上区域设置中的日期来定义。
Dim DateFld As Date • ‘定义数据源 • OdbcQueryInfo.ConnectString = "odbc;" • OdbcQueryInfo.DataSource = “gcgl” ‘oracle数据库 • OdbcQueryInfo.SqlQuery = "select * from team" • ‘定义绑定层 • bindlayer.layername = "Team" • bindlayer.LayerType = miBindLayerTypeXY • bindlayer.RefColumn1 = "lng" '坐标字段-经度 • bindlayer.RefColumn2 = “lat” ‘坐标字段-纬度 • ‘绑定 • Set ds = Formmain.Map1.Datasets.add(miDataSetODBC, OdbcQueryInfo, "team", "Team", , bindlayer) • DateFld = ds.Value(1, ds.Fields.Count)’读出第一行日期值 • MsgBox DateFld
紧缩 • 在Mapx4.0下作紧缩时,只能事先创建一个带结构的空表。然后将记录加入到空表中。在Mapx4.5下可以使用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).filespec • layername = lyr.Name'将表临时存放于内存
紧缩 • LayerInfo.Type = 6 'miLayerInfoTypeTemp • LayerInfo.AddParameter "TableStorageType", "MemTable" '临时文件保存在磁盘上还是内存。 • LayerInfo.AddParameter "Name", "lyrpack" • LayerInfo.AddParameter "Fields", ds.Fields • LayerInfo.AddParameter "Features", lyr.AllFeatures • Formmain.Map1.Layers.add LayerInfo, LayerPos ‘注意: Set LayerInfo = Nothing
紧缩 • '从地图窗口删除原表 • Formmain.Map1.Datasets.Remove (ds.Name) • Formmain.Map1.Layers.Remove (lyr.Name) • Formmain.Map1.Refresh • Set lyr = Nothing • Set ds = Nothing • Set lyr = Formmain.Map1.Layers("lyrpack") • Set ds = Formmain.Map1.Datasets.add(6, lyr) • '从磁盘删除原表 • Kill filespec
紧缩 • ‘创建新表 • LayerInfo.Type = 7 'miLayerInfoTypeNewTab • LayerInfo.AddParameter "filespec", filespec • LayerInfo.AddParameter "Name", layername • LayerInfo.AddParameter "Fields", ds.Fields • LayerInfo.AddParameter "Features", lyr.AllFeatures • Formmain.Map1.Layers.add LayerInfo, LayerPos
紧缩 • 从地图窗口删除临时表 • Formmain.Map1.Datasets.Remove (ds.Name) • Formmain.Map1.Layers.Remove (lyr.Name) • Formmain.Map1.Refresh • '注意: • Set ds = Nothing • Set lyr = Nothing • Set LayerInfo = Nothing
SQL查询 • Layer.search方法,使用Where子句,查询定位所需数据。 • Variable 对象和Variables集合: MapX4.5 在表达式中支持变量替换.通过Variable 对象和 Variables集合,一个表达式中将包含对任意变量的引用,如字符串类型,feature对象类型的数据。Layer.search将之作为一个可选参数。
地理运算符的使用 object1 CONTAINS object2:object2的中心点在object1中 object1 CONTAINS_ENTIRE object2:object2完全在object1中. • object1 CONTAINS_PART object2:object1与object2相交. • object1 ENTIRELY_WITHIN object2:object1完全在object2中. • object1 INTERSECTS object2:object1与object2相交 • object1 PARTIALY_WITHIN object2:object1与object2相交. • object1 WITHIN object2:object1的中心点在object2中.
Dim f As MapXLib.Feature • Dim v As New MapXLib.Variables • 查找州中的某一个城市 • Set f = Map1.Layers.Item(“states”).Selection.Item(1) ‘选择州 • ‘ 将’城市‘的图层加入数据集 • Map1.Datasets.Add miDatasetLayer, Map1.Layers("us cities"), "citiesds". • v.Add “var1”, f ‘ 加入 feature 变量 • v.Add “svar”, “TX” ‘加入string 变量 • v.Add “dvar”, Date ‘ 加入 date 变量 • ‘ 查找并将结果放入features collection • Set ftrs = Map1.Layers.Item("us cities").Search("obj within var1 and year(dvar) = 2000 and state <> svar ", v) • ‘ 高亮显示 • Map1.Layers.Item("us cities").Selection.Replace ftrs
节点编辑 • 编辑条件: 1、具有节点的对象,如点(point),线(line),折线(polyline),区域(region)。节点可选择的对象有点,线,折线,区域。节点可增加的对象有点,线,面。不具有节点的对象有弧段(Arc),圆域(ellipse/circle),矩形(rectangle),圆角矩形(round rect),文本(text) 2、对象处于被选中且可编辑状态。 3、Map控件处于获得焦点状态。
选择节点: 选择工具(miSelectTool) 1. Click鼠标,选择一个 2. Ctrl+Click:在选择与不选择间切换;选择多个;或选择范围的首点 3. Shift+Click: 选择范围的尾点,离首点距离最短 4. Shift+Ctrl+click:选择范围的尾点,离首点距离最长
编辑模式:由Map1.FeatureEditMode来设置图元编辑模式 - 拖动四个句柄,改变图元的形状:Map1.FeatureEditMode = miEditModeFeature,默认值节点编辑模式: Map1.FeatureEditMode = miEditModeNode 移动或删除重叠的节点模式:Map1.FeatureEditMode = miEditModeNode | miMoveDuplicateNodes | miDeleteDuplicateNodes 增加节点模式: Map1.FeatureEditMode = miEditModeNode | miEditModeAddNode
FeatureEditMode的常量设置miEditModeFeature = 0x1 miEditModeNode = 0x2 miMoveDuplicateNodes = 0x4 miDeleteDuplicateNodes = 0x8 miEditModeAddNode = 0x40
增加节点 • Private Sub Command1_Click() • Map1.Layers.Add "c:\program files\mapinfo\mapx 4.0\maps\usa.tab" • Map1.Layers.Item(1).Editable =True • Map1.Layers.Item(1).ShowNodes = True • Map1.CurrentTool = miSelectTool • Map1.FeatureEditMode = miEditModeNode Or miEditModeAddNode • End Sub
移动或删除单个图元上的节点,而与之邻接的图元上的节点并不移动或删除。移动或删除单个图元上的节点,而与之邻接的图元上的节点并不移动或删除。 • Formmain.Map1.FeatureEditMode = miEditModeNode • Formmain.Map1.SetFocus '获取焦点
移动相邻图元重叠(重合)的节点 • Formmain.Map1.FeatureEditMode = miEditModeNode or miMoveDuplicateNodes • Formmain.Map1.SetFocus '获取焦点
删除相邻图元重叠(重合)的节点 • Formmain.Map1.FeatureEditMode = miEditModeFeature or miDeleteDuplicateNodes • Formmain.Map1.SetFocus '获取焦点
新加函数 • 用于创建专题图,标注,SQL的表达式 • Buffer • DeformatNumber$ • Format$ • FormatDate$ • FormatNumber$ • StringCompare • StringCompareIntl • StringToDate • ObjectType
以buffer为例 [region object=] Buffer( inputobject, resolution, width, unit_name ) • Private Sub BufferState_Click() • Dim ftr As MapXLib.Feature • Dim ftrs As MapXLib.Features • Dim vars As New MapXLib.Variables • ’获取第一个州 • Set ftr = Map1.Layers.Item("USA").AllFeatures.Item(1) • vars.Add "varFirstState", ftr • ‘对图层 “USA”中每个对象做距离为 10 英里的buffer • Set ftrs = Map1.Layers.Item("USA").Search _ • ("buffer(obj, 4, 10, ""mi"") contains entire varFirstState", vars) • MsgBox ftrs.Count • End Sub
其他 • 支持DAO 3.6
连接Oracle8.1.6—VB6.0 • 使用LayerInfo对象加入oracle8i数据。 Dim lInfo As Object • Set lInfo = CreateObject("mapx.layerinfo.4") • lInfo.Type = 4 Dim ConnectStr As String • ConnectStr = "SRVR=" + Combo1 + ";UID=" + txtUserName.Text + ";PWD=" + txtPassword.Text
连接Oracle8.1.6 • lInfo.AddParameter "connectstring", ConnectStr • lInfo.AddParameter "name", "TempConnect" • lInfo.AddParameter "toolkit", "ORAINET" • lInfo.AddParameter "query", "select OBJECT from states where 1=0" • lInfo.AddParameter "cache", "OFF" • lInfo.AddParameter "mbrsearch", "ON" • g_map.Layers.Add lInfo • Set lInfo = Nothing
连接Oracle8.1.6——VC6.0 • CMapXLayers layers = m_ctrlMapX.GetLayers(); • CMapXLayerInfo layerInfo; • layerInfo.CreateDispatch( "MapX.LayerInfo.4"); • layerInfo.SetType(4); • if(dlg.DoModal()==IDOK) • { CString ConnectStr = "SRVR=map.mapinfo.com.cn;UID=dzn;PWD=dzn";
连接Oracle8.1.6——VC6.0 • layerInfo.AddParameter("connectstring",COleVariant(ConnectStr)); • layerInfo.AddParameter("name",COleVariant("USA"); • layerInfo.AddParameter("toolkit",COleVariant("ORAINET")); • layerInfo.AddParameter("query",COleVariant("Select * from • China")); • layerInfo.AddParameter("cache",COleVariant("ON"); • layerInfo.AddParameter("mbrsearch",COleVariant("OFF"); • layers.RemoveAll(); • layers.Add(layerInfo);
下载Oracle8i的各参数含义 缓冲区Cache ON - 下载数据放在内存和磁盘(*.map,*.id),这将有助于提高选择速度、刷新速度,平移,放大的操作的速度。缺点下载速度较OFF慢。平移若超出缓冲区所存的数据范围,将从数据库中读取数据,这将影响缩小及平移的速度。 OFF –下载速度快,选择速度慢、平移和缩小、放大慢 MBR Search ON -在从数据库载入数据时要占用一定的时间。
不同参数设置时下载时间对比 PII 333 64M 数据表为31002条记录情况下: cashe MBRsearch Time off off 0:0:56 on on 0:3:56 on off 0:2:12 off on 0:1:20
增加图元-PRINX • Dim rv As New MapXLib.RowValue • Dim rvs As New MapXLib.RowValues • Set ftr = FtrFac.CreateRegion(points, Map1.DefaultStyle) • Set rv.Dataset = Map1.Datasets.Item(1) • Set rv.Field = Map1.Datasets.Item(1).Fields("mi_prinx") • rv.Value = Str(Map1.Layers(ToolBars.Combo1).AllFeatures.Count + 1) • rvs.Add rv • lyr.AddFeature ftr, rvs