1、SuperMap Objects开发中的小技巧开发中的小技巧实际的开发过程中经常会遇到一些很细节的功能问题。为了尽量避免这些小问题给我们带来的困扰,也为了提起很多SuperMap开发者的兴趣,今后大家可以将自己在开发时灵光一现,或者自己觉得很满意的小技巧,小方法贴出来,大家一起分享一下。在这里先做个抛砖引玉吧。首先介绍三个小技巧,当然如果有更好的方法欢迎大家一起讨论。=问:在SuperMap Objects中如何实现反选?答:假设选择了若干对象的SMID分别为2,4,5,7,10实现反选时,设置查询条件SMiD not in (2,4,5,7,10),再对此图层数据集查询出的记录集转换为选择集
2、,实现的效果就是选中了除了这几个ID之外的对象了。=问:在SuperMap Objects中如何绘制岛洞多边形?答:以选中的两个面对象为例,先用union方法得到这两个面的并集,再使用Intersect得到它们的交集,用这个交集面去Erase并集面,最后的结果就是岛洞多边形了。=问:为什么有时候绘制对象会失败?分析原因:当向一个数据集上绘制几何对象出现画不上的问题,如果通过重新计算范围和重建空间索引不能解决问题,请检查一下该数据集的属性字段是否存在必填字段,而且该字段没有设置缺省值,这个就是问题所在。解决办法:新建字段,使用“更新列”将原始字段值复制过来;删除原有字段,重新建立一个同名字段并设
3、置缺省值,再更新复制回该列的值,删除中间字段即可。再介绍一个制作一个快速的如Deskpro数据追加列的功能。*说明:A,B两个数据集,将A中存在而B中不存在的字段添加到B数据集中,然后根据公共字段值相等的字段值也添加到B中。Private Sub btnComfirm_Click() Dim setOK As Boolean Dim oRecF As soRecordset Dim oRecT As soRecordset Dim oDtF As soDatasetVector Dim oDtT As soDatasetVector Dim oFldsF As soFieldInfos Dim
4、 oFldsT As soFieldInfos Dim oFldInfo As soFieldInfo Dim oDss As soDataSources Dim UpID As Integer Dim crtFldOk As Boolean Dim i As Integer Dim j As Integer Dim m As Integer Dim a As Integer Dim n() As String Dim fldVF As String Dim fldVT As String Dim fldPub As String Dim StrSqlT As String Dim oErr
5、As New soError On Error Resume Next Set oDss = FrmEnterMap.SuperWorkspace1.Datasources If oDss.Count = 0 Then Exit Sub Set oDtF = oDss.Item(Trim(cmbDsFrom.text).Datasets(Trim(cmbDtFrom.text) Set oDtT = oDss.Item(Trim(cmbDsTo.text).Datasets.Item(Trim(cmbDtTo.text) Set oRecF = oDtF.Query(, True, Nothi
6、ng, )得到原数据集的记录集 Set oFldsF = oRecF.GetFieldInfos Set oRecT = oDtT.Query(, False, Nothing, )得到目标数据集的数据集,第二个参数为False,否则不能使用之后的FindFirst方法 Set oFldsT = oRecT.GetFieldInfos fldPub = Trim(cmbPubFlds.text) 返回公共字段不能为空 ReDim n(oFldsF.Count) Dim BfFldCount As Integer Dim FindOk As Boolean 返回FindFirst是否成功 BfF
7、ldCount = oRecF.FieldCount For i = 1 To oFldsF.Count先完成创建字段的功能 If oDtT.IsAvailableFieldName(oFldsF(i).name) Then条件为True则可以添加该字段 oDtT.ClearRecordsets crtFldOk = oDtT.CreateField(oFldsF(i) If crtFldOk=True Then n(a) = oFldsF(i).name用数据组记录下创建的字段名 a = a + 1 End If End If Next i Set oRecT = oDtT.Query(,
8、False, Nothing, ) If BfFldCount = oRecT.FieldCount Then MsgBox oErr.LastErrorMsg Set oRecT = Nothing Set oRecF = Nothing Set oFldsF = Nothing Set oFldsT = Nothing Set oErr = Nothing Set oDtF = Nothing Set oDtT = Nothing Set oDss = Nothing Exit Sub Else oRecF.MoveFirst oRecT.MoveFirst For i = 1 To oR
9、ecF.RecordCount 以源数据集做循环 StrSqlT = fldPub & = & oRecF.GetFieldValue(fldPub)根据公共字段查询将游标移动到该位置 FindOk = oRecT.FindFirst(StrSqlT) If FindOk = True Then For m = 1 To a 循环添加的字段值 oRecT.Edit setOK = oRecT.SetFieldValue(n(m - 1), oRecF.GetFieldValue(n(m - 1) UpID = oRecT.Update Next m End If oRecF.MoveNext
10、Next i End If Set oRecT = Nothing Set oRecF = Nothing Set oFldInfo = Nothing Set oFldsF = Nothing Set oFldsT = Nothing Set oErr = Nothing Set oDss = Nothing Set oDtF = Nothing Set oDtT = NothingEnd Sub这段代码测试22000多条记录添加4列属性,时间在1分钟左右。如果有更快更好的方法欢迎介绍一下。再介绍一个制作一个快速的如Deskpro数据追加列的功能。*说明:A,B两个数据集,将A中存在而B中不
11、存在的字段添加到B数据集中,然后根据公共字段值相等的字段值也添加到B中。Private Sub btnComfirm_Click() Dim setOK As Boolean Dim oRecF As soRecordset Dim oRecT As soRecordset Dim oDtF As soDatasetVector Dim oDtT As soDatasetVector Dim oFldsF As soFieldInfos Dim oFldsT As soFieldInfos Dim oFldInfo As soFieldInfo Dim oDss As soDataSource
12、s Dim UpID As Integer Dim crtFldOk As Boolean Dim i As Integer Dim j As Integer Dim m As Integer Dim a As Integer Dim n() As String Dim fldVF As String Dim fldVT As String Dim fldPub As String Dim StrSqlT As String Dim oErr As New soError On Error Resume Next Set oDss = FrmEnterMap.SuperWorkspace1.D
13、atasources If oDss.Count = 0 Then Exit Sub Set oDtF = oDss.Item(Trim(cmbDsFrom.text).Datasets(Trim(cmbDtFrom.text) Set oDtT = oDss.Item(Trim(cmbDsTo.text).Datasets.Item(Trim(cmbDtTo.text) Set oRecF = oDtF.Query(, True, Nothing, )得到原数据集的记录集 Set oFldsF = oRecF.GetFieldInfos Set oRecT = oDtT.Query(, Fa
14、lse, Nothing, )得到目标数据集的数据集,第二个参数为False,否则不能使用之后的FindFirst方法 Set oFldsT = oRecT.GetFieldInfos fldPub = Trim(cmbPubFlds.text) 返回公共字段不能为空 ReDim n(oFldsF.Count) Dim BfFldCount As Integer Dim FindOk As Boolean 返回FindFirst是否成功 BfFldCount = oRecF.FieldCount For i = 1 To oFldsF.Count先完成创建字段的功能 If oDtT.IsAva
15、ilableFieldName(oFldsF(i).name) Then条件为True则可以添加该字段 oDtT.ClearRecordsets crtFldOk = oDtT.CreateField(oFldsF(i) If crtFldOk=True Then n(a) = oFldsF(i).name用数据组记录下创建的字段名 a = a + 1 End If End If Next i Set oRecT = oDtT.Query(, False, Nothing, ) If BfFldCount = oRecT.FieldCount Then MsgBox oErr.LastErro
16、rMsg Set oRecT = Nothing Set oRecF = Nothing Set oFldsF = Nothing Set oFldsT = Nothing Set oErr = Nothing Set oDtF = Nothing Set oDtT = Nothing Set oDss = Nothing Exit Sub Else oRecF.MoveFirst oRecT.MoveFirst For i = 1 To oRecF.RecordCount 以源数据集做循环 StrSqlT = fldPub & = & oRecF.GetFieldValue(fldPub)根
17、据公共字段查询将游标移动到该位置 FindOk = oRecT.FindFirst(StrSqlT) If FindOk = True Then For m = 1 To a 循环添加的字段值 oRecT.Edit setOK = oRecT.SetFieldValue(n(m - 1), oRecF.GetFieldValue(n(m - 1) UpID = oRecT.Update Next m End If oRecF.MoveNext Next i End If Set oRecT = Nothing Set oRecF = Nothing Set oFldInfo = Nothing
18、 Set oFldsF = Nothing Set oFldsT = Nothing Set oErr = Nothing Set oDss = Nothing Set oDtF = Nothing Set oDtT = NothingEnd Sub这段代码测试22000多条记录添加4列属性,时间在1分钟左右。如果有更快更好的方法欢迎介绍一下。当在第一个地图中只想对一定小范围内对空间对象做SQL条件查询,比如自定义圈定一个多边形范围内进行查询。可以使用QueryEx(geometry as soGeometry,nSpatialQueryModeas seSpatialQueryMode,st
19、rFilter as string)方法.geometry是自己在跟踪层上添加的多边形,即查询的区域范围。nSpatialQueryMode是选择合适的空间查询方式一般可以用Containing,strFilter为查询的SQL条件语句,相当于Where 当使用IDW方法进行查值得时候,所有参数是正确的,而且进度条也正常运行。但是如果跟踪一下结果,发现定义的soDatasetRaster对象的实例并没有值。更奇怪的是,重新打开这个数据源,发现结果数据集就在那里,而且是正确的。不要觉得奇怪,不是Bug,也没有见鬼。你一定丢掉了一句重要的代码:在初始的时候:SuperAnalyst.connect
20、(SuperWorkspace.Handle) 就OK了。今天发现一个小问题,挺有意思。在使用工作空间管理器控件时,如果只想使用地图的选项卡,只用来显示地图,那么开始的时候可能会遇到这样的问题。就是打开工作空间之后,显示在控件地图选项卡中的是数据而不是地图,但是如果点击一下地图的标签的时候就刷新显示地图名称了。有点奇怪开始怀疑是缺陷,但实际上并不是。这时候需要设置另一个相关的属性SuperWkspManager.ActiveTab=2;因为默认的每一个Tab都是有索引的,数据为1,地图为2,布局为3,资源为4。如果设置了某些Tab为False那么就会默认顺序递推。所以在设置某些Tab为Fals
21、e之前要先设置但前默认打开时显示的Tab的索引。 SuperWkspManager1.ActiveTab = 2默认激活状态的Tab索引为2,即地图Tab SuperWkspManager1.DataTab = False SuperWkspManager1.LayoutTab = False SuperWkspManager1.ResourceTab = False SuperWkspManager1.SenceTab = False注意:SuperWkspManager1.ActiveTab = 2 一定要写在最前面,如果写在后面也是没有效果的。有兴趣的可以试试,这个原理还是很好理解的。提
22、供两个文件型和数据库行数据在开发时要注意的区别。 (一)设置点对象属性问题。 在新版本的数据引擎中,SuperMap将点数据集的空间坐标从空间信息中提取出来,作为了两个属性字段来存放,即SmX和SmY。那么在开发的时候如果设计一些自动添加记录,设置属性字段值的时候,就要考虑到SetFieldValue(index as VARIANT,.)这个索引问题。 如果选择使用整型索引,那么就要判断好数据引擎类型。因为同一属性字段数据库型要比文件型+2。如果使用字段名作为索引的话是比较安全一点。当然,这需要根据实际数据条件而定。(二)设置SQL语句进行查询问题。 在设置SQL查询条件的时候,经常会设置模
23、糊查询语句,即使用“Like”. 而在设置Like后面的查询值时,需要设置通配符。如*市。 但是在数据库中使用的是%市,文件型使用的则是*市。 这个小问题,大家可以注意区分一下。程序中也有必要判断一下,避免数据源类型改变后,查询功能失灵。(二)设置SQL语句进行查询问题。 在设置SQL查询条件的时候,经常会设置模糊查询语句,即使用“Like”. 而在设置Like后面的查询值时,需要设置通配符。如*市。 但是在数据库中使用的是%市,文件型使用的则是*市。 这个小问题,大家可以注意区分一下。程序中也有必要判断一下,避免数据源类型改变后,查询功能失灵。关于soTreeView的几点注意。1.在Sup
24、erWkspaceManager里面如果设置右键菜单,并不会直接设定右键点击的节点为选中状态。而是根节点为选中。这时候就可以利用MouseUp事件参数中提供的x,y坐标,使用soTreeView.GetNodeAt方法返回一个soTreeNode对象。用它设置SuperWkspaceManager.TreeView.SelectedNode就算可以了。2.在SuperLegend中也可以得到soTreeView对象。可以利用它设置所有的图例节点的Text等等。也可以移除指定的节点,主要就是显示指定图层的图例。但是这个是全部添加节点再移除。所以如果使用VisualStudio的TreeView写
25、起来可能会方便些。在导入jpg影像数据的时候,为了设置影像地理坐标范围,需要使用影像地理坐标配置文件。如果得到的配制文件是.jgw格式的,那么SuperMap是不支持直接导入的。这个时候只要看一下这个文件的内容就会发现,格式和.tfw是一样的。那么改变一下文件格式,通过.tfw格式导入就可以了。效果是没有差别的。是对.jgw的简单介绍。以下是.tfw的格式10/地图中一个象素在X方向上的X分辨率0/X方向旋转量0/Y方向旋转量-10/地图中一个象素在Y方向 上的Y分辨率的負值18263450.000000/象素1,1中心位置的X坐标3658590.000000/象素1,1中心位置的Y坐标提供一
26、个网线分析的小例子:在有的网线分析中,确定了终止点,要进行路径分析,路线的选择。这个功能要用到网络分析soNetWorkAnalystEx.Path等类似的方法。但是,有些业务中,对于两点间的路径如果是直接连通的,即两点之间只有一条弧段相连且没有任何中间节点。这种情况不论该路线是否为最短都要作为第一选择方案。所以,针对这个问题可以使用soNetWorkAnalyst.FindConnectEdges(objNetworkDataset As soDatasetVector,nNode As Long,nDirection As sePathFindingDirection,nLevel As Long) 方法求得起点的临近边。nNode:起始节点。nDirection:scdForward 只有正方向。nLevel:1因为只求直接相连的弧段。这样返回的是一个soSelection对象,下面要使用soRecordset soSelection.ToRecordset(false)得到记录集,soRecordset.GetFieldValue(SmTNode)得到这条弧段的SmTNode字段。这个字段就是终结点的ID。对记录集的每条记录循环,返回该字段值,与最开始确定的终结点ID比较。如果相等就说明从起点到终点间存在一条直通的弧段。那么这就是所需要的结果了,如果不存在再使用P
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1