ImageVerifierCode 换一换
格式:DOCX , 页数:21 ,大小:25.56KB ,
资源ID:10536764      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10536764.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(SuperMap Objects开发中的小技巧.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

SuperMap Objects开发中的小技巧.docx

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