作者:皇皇
问:运行VB范例程序出现资源不足的问题,如何解决?
答:VB范例程序在VB 6 + SP5的环境下可以正常使用。
问:SuperMap Objects不能正确卸载,无法重新安装?
答:按照正常的方式安装SuperMap Objects是可以卸载的,如果出现特殊情况,可以手工删除注册表的内容,需要删除的是:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall目录下DisplayName为“SuperMap+版本号”,之后可以正常安装SuperMap Objects了。
问:使用开发许可调试运行程序的时候提示没有许可,怎么回事?
答:如果许可文件或者加密锁中只有开发许可,那么在配置软件许可的时候只需要配置这一个开发许可就可以,不要配置运行许可,如果已经配置过了,请打开{操作系统盘:\Program Files\Common Files\SuperMap\SuperMapLic.ini}文件,将其中关于运行许可的配置选项删除掉,可以解决这个问题。
问:打包分发程序的时候,如果不想使用许可配置工具,那如何处理许可呢?
答:可以直接修改“操作系统所在盘\Program Files\Common Files\SuperMap\”目录中的配置文件SuperMapLic.ini。
问:二次封装Objects组件后,将其放到Web页面上使用,需要运行许可吗?
答:这种方式的应用,在客户端需要安装SuperMap Objects的运行版,并且正确配置开发许可,才可以保证页面上下载的组件正常使用。
问:网络锁出现异常,软件无法运行,该怎么办?
答:软件无法运行,报告512的错误代码,往往是由于无法正确读取许可信息,请按照如下步骤排除错误:(一)检查许可服务是否启动,在服务列表中可以找到Sentinel Protection Server;(二)检查加密锁是否损坏,可以将加密锁当作单机锁使用,看看是否能够支持相应软件正常运行;(三)服务器的6001和6002端口是否开放;(四)客户端是否能连接到服务器。
问:开发版和运行版有什么区别?
答:开发版面向的是二次开发人员,主要用于GIS应用系统的开发建设。运行版面向应用系统的最终用户,它不能用于系统开发,是用于支持基于SuperMap Objects开发的应用系统运行的。
问:在VC、Delphi中怎样快捷地加载SuperMap Objects组件?
答:对于Delphi,Objects的安装包提供了dpk包,在开发环境中打开dpk,编译加载即可;对于VC,Objects的安装包提供了包裹类,在工程中包含包裹类的头文件即可。dpk包和包裹类都在“安装目录\Bin\InterfaceClass”目录中。
问:VC中加载组件,以Cso为首命名的类和以Iso为首命名的类在使用上有何区别?
答:以Iso为首命名的类为接口类,SuperMap Objects中,两种类在使用上基本相同。有些类没有包含在以Cso为首命名的类中,而是包含在以Iso为首的类中,这些类需要手动加载到系统中:使用菜单项【View】->【ClassWizard】。在VC中开发,比较推荐的方式是使用包裹类,在工程中包含包裹类头文件即可。
问:在VS .NET 2005环境下使用图例控件的ShowThemeWizard方法显示的专题图对话框,各个专题风格项看不到。
答:解决办法是,创建一个文件命名为filename.exe.manifest,且设置相关内容后即可。
问:在SuperLegend控件中如何让右键菜单中的“可编辑”菜单不显示或不可用?
答:SuperLegend.PopupMenu属性可以控制右键菜单是否可用,但是不能针对子菜单的可用进行设置。要实现单独控制可以自定义封装一个类似的组件,对图层的操作接口在Objects中全部开放了,即SuperLegend的功能都可以通过二次开发来实现。
问:从哪里可以获得在VC下使用SuperLegend控件的例子?
答:可以在Objects安装目录下的Sample Code Library找到VC下使用SuperLegend的示范程序。
问:SuperLegend控件中图层名为“数据集名@数据源别名”,可以修改这个名称吗?
答:可以。SuperLegend的列表中显示的是soLayer.Caption,默认与soLayer.Name相同,Caption可以修改,修改结果也可以保存在地图和工作空间中。
问:可以定制自己的工作空间管理控件吗?
答:可以的,SuperWkspManager中封装好的功能都可以通过Objects的接口来自定义实现,比如获取数据源列表、数据集列表、地图列表等。
问:如何设置SuperWkspManager的当前活动项为“地图”?如何控制SuperWkspManager的可见选项卡?
答:设置SuperWkspManager的当前活动项通过ActiveTab属性来实现,具体代码为:SuperWkspManager1.ActiveTab = scsMap。控制SuperWkspManager的可见选项卡通过设置DataTab、MapTab、LayoutTab、ResourceTab(分别对应于数据、地图、布局、资源页)属性为True或False(是否可见)来实现。
问:属性表中显示的字段名都是英文,是否可以为中文?
答:有两个方法可以实现:
(1)查询获取记录集时,Query方法的第三个参数可以这样设定返回的字段名是什么,例如:
Dim objStrs As New soStrings
objStrs.Add “smid as 编码”
objStrs.Add “name as 名称”
(2)字段有名称(soFieldInfo.Name)和别名(soFieldInfo.Caption)两个属性,一般字段名都使用英文,而字段别名使用中文,显示在GridView中的是字段别名。
问:如何实现按字段排序?
答:Query查询的时候最后一个参数设置为” Order by 字段A”,要注意第三个参数如果要指定返回的字段集合,一定要包括“字段A”。
问:如何对SuperGridView中的字段按照指定的顺序排列?如何让记录根据指定字段来排序呢?
答:通过soDatasetVector.Query获取soRecordset时,可以通过改变调用该方法的一些参数来达到字段排序的目的。该方法中,第三个参数objFields缺省是所有字段,并且是按照缺省的字段顺序返回的。通过改变这个参数,可以控制想要显示的字段及其顺序,这个顺序就是soStrings中各字段添加进去的顺序。对于记录排序,可以通过上述方法的第四个参数来实现,即在该参数中使用Order By关键字对结果记录集进行排序。但是有一点要注意,当 bHasGeometry为True时,Order By关键字无效。
问:地图上选择一个空间对象,SuperGridView中自动定位到对应的属性记录,如何实现?
答:在地图上选中对象后会触发SuperMap.GeometrySelected事件,在该事件中通过选择集获得记录集,进而获得选中对象的ID,然后通过SuperGridView.MoveTo方法定位到当前记录即可。
问:SuperGridView控件如何能实现属性编辑的撤销回退功能。
答:使用SuperGridView.ConnectWorkspace方法关联工作空间后即可实现属性编辑的撤销和回退功能。
问:使用SuperGridView控件进行属性数据浏览时,如何仅显示指定的字段?
答:(一)不显示以SM开头的系统字段,可以通过设置SuperGridView.sysFieldVisible = False来实现;(二)对其它非系统字段的显示控制。在使用soDatasetVector.Query方法查询获得soRecordset时,第三个参数objFields可以指定查询出的记录集的字段列表。
问:如何更改SQL Server数据库中数据库对应的数据文件的路径?
答:可以通过以下几个步骤实现:(一)备份数据库;(二)将原数据库删除;(三)新建一个同名数据库,在新建时指定新的数据文件目录;(四)从设备恢复数据库就可以了。
问:SDX+ For Oracle引擎与SDX+ For Oracle Spatial引擎有什么区别?
答:主要是数据结构不同。SDX+ For Oracle引擎的空间数据库结构是SuperMap自定义的,可以存放SuperMap各种类型的数据;而SDX+ For Oracle Spatial引擎的空间数据库结构是Oracle公司定义的Oracle Spatial的结构。受结构的限制,该引擎只能存储点、线、面数据集,不能存放文本、影像、网络等数据集。
问:如何将SDB中的空间数据导入到空间数据库中?
答:soDataSource.CopyDataset接口可以把一个数据源的数据集复制到另一个数据源中,源数据源和目标数据源的引擎类型可以不同,复制过程中SuperMap控件会自动处理不同类型数据源之间属性表的差异,自动增删系统字段。通过复制数据集的方式可将SDB文件中的空间数据导入到空间数据库中,也可将空间数据库中的数据导出成文件数据源。
对于数据库,数据文件的大小和自动扩充参数应该设置得大一些,因为如果数据文件的初始大小小于要导入的数据,那么当数据文件装满时,数据文件会自动扩充,扩充的大小为设置的自动扩充参数,默认为原文件大小的10%,而这些操作都是非常耗时间的。通常,数据库中剩余空间一定要大于要导入的数据占的空间,日志文件大小应为导入数据的1/4以上。数据转换的速度不但与软件的速度有关,还与服务器的设置有关系,对于SQL Server来说,如果数据库的数据文件小,它需要经常性的增大文件,会导致性能下降。此外,数据库的日志文件与事务处理有关,也会影响性能,所以在转换数据时,建议先增加数据库容量和日志大小。
问:不同的空间数据库(数据源)与相应关系数据库之间有什么对应关系?
答:SQL Server中,一个空间数据源对应一个数据库,一个数据集对应该数据库中的一个表;Oracle中,一个空间数据源对应于一个用户,一个数据集对应该用户下的一个表。要建立一个空间数据源,对SQL Server数据库,直接使用SuperMap的SDX+引擎就可以;对Oracle数据库,需要先在数据库中建一个新的用户,才能通过SDX +引擎在该用户下创建数据源。
问:空间数据库引擎的数据源可以直接连接数据库进行修改吗?
答:不建议直接对空间数据库进行操作,SuperMap使用了很多系统表和系统字段对空间数据进行管理,如果绕开SuperMap直接对这些数据进行操作,很有可能由于表间不一致导致数据损坏。不过如果仅对属性数据进行操作,那是可以的,只要不修改SM开头的系统字段即可。
问:怎样取得TIN的每个三角网格的三个顶点?
答:soDatasetVector.SubDataset是用来获取矢量数据集的子数据集,可以通过它取得TIN数据集的节点子数据集。SubDataset还经常用在网络数据集中,用该对象来获取网络数据集的节点子数据集。
问:如何计算三维淹没面积?
答:计算三维淹没面积需要DEM影像数据集,使用so3DAnalyst.Flood计算出淹没的范围(返回soGeoRegion对象),再使用so3DAnalyst.SurfaceArea计算淹没的表面积。
问:怎么计算挖土方量?
答:SuperMap提供了三个接口来计算填挖方,分别是soGridAnalyst.Volume、soSurfaceOperator.CutFill和soSurfaceOperator.CutFillEx,详细的接口参数请参考《SuperMap Obejcts联机帮助》。
问:如何获得等高线数据集上任意点(点在屏幕上选取)的高程?
答:首先需要将等高线数据集构建DEM(数字高程模型),然后将DEM数据集显示在地图窗口中,在SuperMap_MouseMove事件中,通过返回的屏幕坐标,将这个屏幕坐标通过SuperMap.PixelToMapX和SuperMap.PixelToMapY转换成地理坐标,最后获取当前位置的高程值有两种方法:(一)通过so3DAnalyst.GetPointInfo获取高程值dZValue;(二)通过soDatasetRaster.Value接口来获得指定行列数格子的特征值,在调用Value接口之前需要将地理坐标转换成行列数。
问:程序中如何构建三维飞行的路径?
答:三维飞行的路径可以有很多种获取办法,比如从二维地图窗口中获取线对象,再比如在二维窗口中手工绘制一条线,然后得到这条线的点串,再给定高程值,添加到三维点串中,构建飞行路径。
问:如何得到三维中选择对象的属性?
答:3D控件中提供了GeometrySelected事件,通过这个事件,你可以由Super3D.Selection获取选择集,将选择集转换为记录集,继而由记录集得到属性信息。
问:Super3D的Fly方法中张角指的是什么?视点如何获得?
答:Super3D的Fly方法中张角指的是视角,视点可以在程序中定义,也可以通过Super3D的HitTest方法用鼠标点击窗口来获取。
问:打开工作空间中保存好的三维场景,显示不出贴图,为什么?
答:造成这个问题的原因可能是程序没有找到图片的路径,请通过Super3D的AddResourceLocation方法来设置图片路径。
问:属性到地图查询在3D中如何实现?
答:通过数据集的查询获取到记录后,得到几何对象,继而获取坐标信息,然后通过使用3D提供的CAMERA对象来定位到相应位置。
问:网络分析所得的路线能否作为飞行的路线使用?
答:可以的,网络分析返回的路线是soGeoLineM,通过soGeolineM.GetPartAt得到构成路径的点串,这些点都是二维点,高程需要自己根据情况设定,根据二维点的坐标创建一个三维点串soPoint3Ds,传入Super3D.RouteFly方法飞行。
问:请问如何实现三维浏览的升降场景?
答:通过设置Super3D.Action为sca3DCameraMoveZ可以实现三维场景的升降操作操作。
问:在三维窗口中如何显示DEM数据集?为什么有时候显示一团漆黑?
答:先将DEM数据集在二维地图窗口中打开并保存为地图,然后通过Super3D.OpenMap3D方法打开这个地图,就可以显示三维场景了。在三维窗口中打开三维地图后有时候出现漆黑一片,这可能是因为所显示的DEM数据集是采用经纬度坐标系,因为经纬度的坐标值都比较小,而高程却很大,从而导致高程比例严重失调而显示为一团漆黑。
问:如何给三维城市景观贴图?
答:进行贴图的操作步骤如下:(一)在数据集上创建两个文本类型的字段,字段名称分别是TEXTURE和HEADTEXTURE;(二)将要贴在三维实体上的图片复制到当前目录下,即正在操作的数据源所在的目录下;(三)将要贴在实体侧面的图片文件名保存到TEXTURE字段中,要贴在实体顶部的图片文件名保存到HEADTEXTURE字段中,例如 AAA.bmp;(四)在三维窗口中打开该数据。
问:在网络数据集中选中了一条线,如何得到这条线两端的节点编号呢?
答:可以通过属性查询获取节点编号,网络数据集的属性表中有两个字段SmFNode和SmTNode,这两个字段记录了这条线的两个端点的编号。
问:网络数据集中如何设置节点数据集的属性?
答:先取得网络数据集,然后利用soDatasetVector.SubDataset接口可以取得节点数据集,它也是一个soDatasetVector对象,取得这个对象后就可以象设置普通数据集那样设置其数据集属性了。
问:对网络数据集编辑时能否自动维护拓扑关系?
答:可以。网络数据集可以通过SuperTopo控件由线数据集自动创建。创建好的网络数据集在SuperMap窗口中打开并开始编辑后,SuperMap将自动维护网络数据集中的对象的拓扑关系。
问:SuperTopo控件建立网络拓扑以后SmTopoError中值分别代表什么含义?
答:拓扑错误码对应如下:0 – 没有错误;1 – 线段的起点是悬节点;2 – 线段的终点是悬节点;3 – 线段的起点和终点都是悬节点。
问:SuperLayout的LayoutSetup和PageSetup有什么区别?
答:LayoutSetup设置的是布局控件里的带格网的纸,PageSetup设置的是打印时的纸张大小。
问:SuperLayout控件中如何实现分页打印的功能?
答:通过SuperLayout.LayoutSetup方法弹出的布局设置对话框中可以设置布局横向的页数和纵向的页数,通过此设置实现整幅地图的分页打印。
问:SuperLayout.PageSetup方法直接弹出的页面设置对话框,不支持大页面例如A3等,那怎样打印大图?
答:SuperLayout.PageSetup方法显示的纸面信息是Windows注册的默认打印机支持的纸面信息,如果要打印大的纸面,可以安装一个支持大纸面的打印机,并把它设为默认打印机即可。
问:在布局中可以自己创建图例吗?
答:可以的,从地图中获取各个图层及风格信息,然后根据图层类型以及风格等信息动态创建布局元素添加到布局窗口中。
问:图例元素里面的内容可以修改吗?
答:可以。用soLytElements.CreateLegend创建的图例对象是一个组合对象soLytGroup,如果需要对其中的条目进行修改的话可以利用soLytSelection.Ungroup方法将其打散,然后修改子元素。
问:如何在布局窗口中只打印指定范围内的地图?
答:有两种方法可以实现这个功能。(一)通过交互式的方式在布局窗口中对布局地图元素中的地图进行锁定,然后对锁定后的地图通过交互式的方式进行缩放和平移到想要打印的范围;(二)用代码实现。先获取到打印范围,可以根据该范围用代码按比例创建好用来放置地图的soLytMap对象,并且调用其CenterAt方法和MapScale属性将地图调整到打印的范围即可。
问:如何在程序里更改SuperLayout页面方向?
答:SuperLayout.PaperOrientation是控制页面朝向的。
问:SuperLayout.Modified 和SuperLayout.ContentChanged 有什么区别?
答:SuperLayout.Modified属性可以反应布局中的任何变化,包括布局的页面属性修改、元素增减、元素的位置发生变化等,而SuperLayout.ContentChanged仅可以反应布局上元素的增减。
问:SuperLayout的PageWidth与PaperWidth有什么区别?
答:PageWidth是设置显示在布局中的纸张页面宽度,而PaperWidth是返回打印的纸张的实际宽度,实际打印的纸张大小不一定与布局中显示的纸张大小相同。
问:把SuperLayout控件的Action设置为17(绘制图例),但是不能在布局上绘制?
答:在布局窗口中,由于图例元素和比例尺元素不能脱离地图元素而单独存在,也就是说图例元素和比例尺元素必须Connect一个地图元素才能正确显示,所以利用Action在布局窗口中绘制图例和比例尺时,当前布局窗口中应该必须有一个选中的地图元素才能成功创建图例和比例尺。
问:什么是Tin数据集?
答:Tin数据集是矢量数据集的一种,Tin 是Triangular Irregular Network 的简写,其跟Grid数据同属于数字高程模型,用于三维显示分析,点、线数据集可以转换为TIN数据集。
问:一个工程中加载的工作空间个数有限制吗?
答:一个工程中只能加载一个工作空间控件,一个工作空间可以管理多个数据源、地图、布局和资源库,它是一个工作环境,没有必要在一个工程中使用多个工作空间控件。
问:怎样采用数据库管理工作空间?
答:通过SuperWorkspace.SaveAs方法可以将工作空间保存成文件,也可以将其保存到数据库中。保存到数据库中的方法在SaveAs接口的第一个参数上指定连接数据库的参数即可,在数据库中用SmWorkspace表来保存工作空间的内容以及相关的版本信息,具体使用方法可以参考《SuperMap Objects联机帮助》的接口说明。
问:关于紧缩表和重建空间索引,在什么时候使用?
答:对于数据库来说,删除记录的时候都是标记性删除,没有物理删除,占用的硬盘空间也没有释放掉,那紧缩的作用就是能把这些标记性删除的记录物理删除掉,以释放磁盘空间。不过不紧缩不会引起查询定位出错;在进行大量编辑之后,空间索引可能会不完整,这样有可能会导致查询结果不正确,有时候会出现有些位置的数据显示不出来,所以在进行了大量的编辑操作之后,建议重建空间索引。
问:如何将符号库中的符号显示到指定的容器中显示?
答:资源库对象提供了Draw方法,利用这个Draw方法可以将资源库中的指定符号画到指定的容器上,相应的接口是:soSymbolLib.Draw、soLineStyleLib.Draw、soFillStyleLib.Draw。
问:为什么使用soStyle.PenColor来改变符号颜色有时候不起作用?
答:对符号设置颜色不起作用的原因主要有两个:(一)使用栅格符号,这种符号是不支持修改颜色的;(二)制作符号时对符号设置了“固定颜色”,设置方法是:在符号编辑器中双击要修改的符号,将符号显示在右边的编辑区中,然后将鼠标设置为【选择画笔】的状态,双击想要修改颜色模式的笔画,在弹出的对话框中可以找到该属性的设置选项。
问:符号编辑器中绘制的点是否可以调整大小?
答:可以调整,方法是:在符号编辑器中将需要修改的符号添加到右侧编辑区,点击下方工具栏上的“选择”按钮来切换鼠标动作,双击要修改的笔画,在弹出的对话框中设定其“宽度”即可,宽度默认是1,最大可设置为15。
问:对地图上的点使用符号渲染后,很难选中,该如何解决?
答:可以通过两种办法来解决:(一)修改SuperMap.SelectionTolerance,该属性是选择容限,默认为3,像素单位;(二)SuperMap提供了多种选择方式,除了点选,还有框选、圆选和多边形选,针对点对象,可以使用这些区域的方式来选择,使用更方便。
问:如何实现面对象的透明填充效果?
答:有两种方法设置面对象的透明效果:(一)将面对象的填充风格设置为空填充,即soSylte.BrushStyle=1;(二)将面对象的显示风格soStyle.BrushBackTransparent设置为True,同时将soStyle.BrushStyle设置为非实填充的模式。对于第二种办法应注意,BrushBackTransparent对图片填充无效。
问:用AddSymbol方法将soGeoCompound对象转化成符号时的注意事项?
答:(一)如果指定objBound参数,那么转为符号的时候就会这个范围调整为255x255,如果不传入objBound参数,那么转换的时候会自动计算,只有当传入的范围大于Geometry.Bounds,这个传入的范围才起作用;(二)符号库目前还不支持旋转的文本,所以当objCompound对象中有旋转的文本的时候,转过去的符号中的文本角度会丢失。
问:SuperMap的资源库是怎么保存的?
答:资源库有两种保存方法:(一)保存在工作空间中,符号是用来渲染GIS数据的,它和地图有密切的关系,资源和地图同时被保存在工作空间smw文件中;(二)以单独的资源文件保存,在需要用的资源的时候,可以使用资源库提供的import方法将资源文件导入到工作空间中。
问:ICO图标和BMP文件可以导入符号库中作为点符号使用吗?该如何做?
答:可以直接添加到符号库中使用,方法是:通过soSymbolLib.ShowEditor方法弹出符号编辑器,点击对话框下方的工具栏最右侧的【栅格符号】按钮,可以将ICO和BMP文件选择到符号库中来。可使用的文件不能超过300K。
问:soSymbolLib.Draw方法的第一个参数是传入设备句柄,在VB .NET中要将符号绘制到PictureBox上,如何实现?
答:请参考如下代码:
Dim graphic As System.Drawing.Graphics
Dim hdc As System.IntPtr
graphic = PictureBox1.CreateGraphics()
hdc = graphic.GetHdc()
将这里返回的hdc传入Draw方法即可。
问:桌面软件上对数据集设置压缩编码为SDC和SWC,对应Objects的接口是什么?
答:seEncodedType.scEncodedDWORD对应SDC,seEncodedType.scEncodedWORD对应SWC。
问:数据集连接与从其他表追加有何区别?
答:(一)从其他表追加:将一个数据集A的记录追加到另一个同类型的数据集B中,追加后数据集B中包括了A和B两个数据集的记录的并集,是追加行的操作。如果A和B的表结构相同,那结果数据集B的表结构不变;如果A与B的表结构不同,那结果数据集B的字段列表是A和B字段列表的并集。(二)数据集连接:将两个数据集通过关联字段连接到一起,是一个查询结果,原始两个数据集的数据都不会发生变化,这个查询结果的字段列表是关联的两个数据集字段的并集。
问:soFieldInfos.Add和soDatasetVector.CreateField创建字段有什么区别?
答:soFieldInfos.Add方法是在字段集合中添加一个成员,而并没有在矢量数据集中真正添加了字段,只有在调用了soDatasetVector.CreateFields方法后才创建了一组字段;soDatasetVector.CreateField是直接对矢量数据集创建字段。要正确创建字段,必须先关闭该数据集,并且释放所有对该数据集的引用。
问:将数据源复制到另外的电脑上,其中的ECW数据集打开后显示为空白,为什么?
答:ECW数据集是采用文件关联的方式连接到数据源中的,数据源中只保存了ECW数据集所对应的ECW文件的位置信息而并没有保存实际的图像数据,这一点与普通的影像数据集不同。因此,复制数据源文件的时候要同时复制相应的ECW文件,并且保证数据源文件和ECW文件的相对文件路径关系不变,这里提醒一点,如果两个文件在同一个磁盘分区中,数据源中保存的是ECW文件的相对路径,如果是不同的磁盘分区,数据源中保存的是ECW文件的绝对路径。
问:如何使用DGN对象的Linkage进行查询?
答:SmDgnLink字段的类型scfDgnLink比较特殊,不能按照一般字段的方法进行SQL查询,必须指明使用Linkage的哪个参数进行查询。例如,要查找Entity=5并且mslink=123的记录,传入Query方法的第一个参数查询条件应该是:SmDgnLink.Entity = 5 and SmDgnLink.MsLink = 123”。
问:为什么soDatasetVector.Query的Group By不能返回正确结果?
答:Group By关键字是用于分类统计查询的,使用的时候需注意:(一)分类统计的时候仅可以对属性操作,因此Query方法的第二个参数是否查询空间对象应设置为False;(二)要指定分类统计返回的结果字段列表;(三)指定对哪个字段进行分类。例如:要根据SMUserID进行分类,对人口字段进行统计,VB的示范代码如下:
Dim fields As New soString
fields.Add(“人口”)
fields.Add(“count(*)”)
Set rs = Ds.Query “”, False, fields, “group by SmUserID”
问:Delphi中为何数据集对象不能赋值于矢量数据集对象?
答:数据集(sodataset)分为矢量数据集(soDatasetVector)和栅格数据集(soDatasetRaster)两类,在VB中可以直接用一个soDatasetVector类型的变量去接收一个soDataset类型的返回结果,VB会隐性转换。但是在Delphi中必须显性转换,正确的赋值代码如下:objDV:=SuperMap.layer[1].Dataset as soDatasetVector。
问:soDatasetVector.Query()的第二个参数,用False和True有什么不同?
答:soDatasetVector.Query方法的第二个参数是bHasGeometry,如果是True,查询结果中即包括属性,又包括相应的几何对象;如果是False,查询结果中只有属性。如何设置该参数主要取决于对查询结果的要求,当然在有些情况下该参数与功能也有关系,比如要使用soRecordset.Delete方法来删除记录,那查询获得该soRecordset的时候必须属性和空间对象同时查询才可以;再比如要用Group By进行分类统计的时候,bHasGeometry参数必须是False,仅对属性进行查询。
问:打开数据集时,数据集中的数据是否全部调入内存中?
答:是否将数据调入内存与数据源的引擎类型有关,当使用sceMicrostation和sceAutoCAD引擎打开DGN/DWG/DXF数据时,空间数据会被调入到内存中,其他数据源引擎不会。
问:是否有方法来判断指定的字段名是否合法?
答:soDatasetVector.IsAvailableFieldName。
问:数据集追加时会自动去掉重复的记录吗?
答:数据集追加的结果是两个数据集的和,不会自动去掉相同的记录。
问:如何获得影像数据集的四个角点的坐标?
答:通过soDatasetRaster.Bounds属性可以获得影像数据集的矩形范围soRect,通过它可以计算出影像数据集的四个角点的坐标。其中左上角坐标点是soRect.TopLeft,右下角坐标点是soRect.BottomRight。
问:Grid中是否可以修改每个栅格值?一个Grid是否可以存两种特征值?
答:可以通过soDatasetRaster.Value来修改每个单元格的特征值。一个Grid只能存储一个特征值。
问:创建数据源的时候如何设置坐标系?
答:通过soDataSource.PJCoordSys属性返回数据源的坐标系对象soPJCoordSys,进而设置该对象的坐标系参数。
问:如何将SQL Server中的数据保存为SDB数据源?
答:首先,使用CreateDataSource创建一个SDB数据源,然后使用CopyDataset方法将SQL Server数据源中的数据集复制到SDB数据源中。
问:为什么刻录在光盘上的数据源不能用?
答:刻在光盘上的数据是只读的,如果要直接在光盘上打开该数据源,在打开数据源的时候,OpenDatasource方法最后一个参数bReadOnly是否只读应该设置为True,这样就可以只读方式打开光盘上的数据文件了。
问:使用SDX+ for SqlServer数据源,如何控制用户不能修改数据?
答:在SqlServer的企业管理器中这样操作,在“安全性-〉登录”中,创建新的登录名,在“数据库访问”中设置数据源所在库该用户的角色为db_datareader,然后使用这个新登录名打开数据源,这时仅可以浏览数据,不能进行任何修改。
问:.sdb和.sdd文件为何越用越大?
答:这两个文件是随着数据源中数据集个数以及数据集中对象的增多而逐渐增大的,而且在删除数据集和删除数据集中的对象时,数据源文件并没有释放存储空间,这个时候建议紧缩一下数据源,以便释放空闲的数据空间。紧缩数据源的接口是soDataSource.Compact。
问:为什么移除数据源总是失败?
答:要成功地移除数据源,必需:(一)使用SuperMap.Layers.Remove方法移除该数据源中所有正在被打开的数据集;(二)释放所有对该数据源或数据源中的数据的引用的变量。
问:如何查询电线上开关的属性?
答:首先在电线层上通过查询获取到目标电线,然后使用soDatasetVector.QueryByDistance方法查询线周围的点,进而获取点的属性信息。
问:如何实现多个图层中满足条件的对象一起闪烁?
答:依次对多个图层进行查询,利用在跟踪层上添加/删除对象实现闪烁的效果,实现过程可以参考范例程序库中的相关程序。
问:使用SetGeometry更改了几何对象后为什么刷新地图没有变化?
答:在使用SetGeometry之前,需要使用soRecordset对象的Edit方法进行锁定,然后使用Update方法进行提交。
问:如何实现将圆选和多边形选的结果添加到ListBox中?
答:将选择集转换成记录集soRecordset,然后通过GetFieldInfo得到字段信息,再通过GetFieldValue得到字段值,然后依次添加到ListBox中即可。
问:如何实现”select distinct(” & strField & “) from ” & strDataset查询?
答:soDatasetVector.Query接口,定义一个soStrings变量,将“Distinct(字段)”添加到soStrings中传给Query的第3个参数,这里要注意的是,分类统计的时候不能查询空间对象,所以Query方法的第二个参数一定要设置为False。
问:对记录集的修改时哪些情况下需要调用soRecordset.Edit方法?哪些情况又需要调用soRecordset.Update呢?
答:对记录集中的某行记录进行修改时需要调用soRecordset.Edit方法,锁定该记录进行编辑。一般来说,对记录集中的记录的修改主要是指修改几何对象(用soRecordset.SetGeometry)或修改字段值(soRecordset.SetFieldValue),进行这些操作前都需要调用soRecordset.Edit方法,且操作后必须调用soRecordset.Update。soRecordset的Edit方法和Update方法必须成对出现,而且是针对每一行记录都要分别调用一次soRecordset.Edit和soRecordset.Update方法。调用soRecordset.AddNew方法增加几何对象前不需要调用soRecordset.Edit方法,但是使用AddNew之后应该调用一下Update方法。
问:SuperMap Objects纯属性表(scdTabular)与外部数据表有什么区别?如何对SuperMap Objects 纯属性表进行操作?
答:SuperMap Objects纯属性表与外部数据表没有实质上的区别,都是以关系型数据库二维表格的形式存储的。所不同的是,SuperMap的纯属性表是由SuperMap数据源来创建和管理的,因此最好是通过SuperMap Objects提供的对象和接口来对其进行操作。由于SuperMap Objects纯属性表是一种特殊的矢量数据集,因此其记录集与普通的记录集也不完全一样。例如,在SuperMap Objects纯属性表中增加一行记录的代码可以写成:objRecordset.AddNew Nothing。此外,应该注意不要使用一些针对空间数据集的方法或参数来对纯属性表进行操作,例如下列语句对纯数据表所对应的数据集操作就会出错:Set objRs=objDtv.Query(“”,TRUE),出错的原因是其中的第二个参数表示是否要取空间数据被设置为True,而纯属性表是没有空间数据的。所以类似的语句应该写成:Set objRs=objDtv.Query(“”,FALSE)。还有比如要避免对纯属性表类型的Recordset使用如下方法:objRs.GetGeometry、objRs.SetGeometry。
问:为什么采用soRecordset的FindFirst、FindNext等接口查询时不能得到相应的记录?
答:这几个查询定位记录的接口的使用只对属性数据有效,查询出的记录如果只有图形而没有属性数据的话,调用这几个方法将无效。因此,对于采用soSelection.ToRecordset方法得到的Recordset,其参数必须设置为False。
问:删除记录集中数据的两个接口的用法和功能有什么区别?
答:删除数据集中的记录的接口主要有:(一)删除当前记录:Boolean soRecordset.Delete();(二)保留表的结构,删除表中的数据:Boolean soDatasetVector.Truncate();(3)清除表中当前记录集的所有记录: Boolean soRecordset.DeleteAll()。使用Delete方法可以循环删除所有的记录。Truncate方法和DeleteAll方法可以直接删除数据集中的所有数据记录,但在使用效率方面有区别。采用DeleteAll方法删除时,如果记录数很多,执行速度会很慢,要消耗大量的日志空间。而且只是物理性地删除数据,不会自动回收释放的空间以供重新利用。这样会导致的sdd文件或数据库数据文件的大小不断地增长。使用soDatasetVector.Truncate方法删除的效率较高,执行速度非常快,甚至比删除数据库中的表(如Oracle中Drop Table)还要快。此外,采用Truncate方法删除不需要日志空间,在执行完后会自动释放空间以供重新利用。但是,当只需要删除数据集中的部分记录时,只能采用soRecordset.Delete或DeleteAll方法进行删除。
问:如何实现模糊查询?
答:SuperMap中的查询是遵循SQL标准的,例如查询地址字段(字段名为address)中包含“中华大街”的记录,Query方法的第一个参数应该为:address like ‘中华大街‘,这里需要注意的是通配符,如果使用文件数据源的话,通配符是*,如果使用数据库型数据源,通配符是%。
问:使用soRecordset.GetFieldValue(index As Variant)方法得到字段值后如何判断是否为空?
答:在VB中这样判断:If varType(objRs.GetFieldValue(i))=vbNull Then,在Delphi中这样判断:If varType(objRs.GetFieldValue(i))=varNull Then。
问:如何将工作空间文件以及数据源中的内容移植到数据库中,保证地图正常显示。
答:(1)将工作空间文件在SuperMap Deskpro中打开,同时打开一个别名与已存在的数据源的别名不同的数据库型的数据源。(2)将文件型数据源中的数据集复制到数据库型数据源中,复制完成后关闭两个数据源。(3)将数据库型数据源,以与原来文件型数据源相同的别名打开,此时可以打开工作空间中已有的地图,如果地图可以正常打开,那么这一步就成功了。(4)将工作空间另存到数据库中。
问:在Delphi中,为何加入SuperWkspManager1.Connect(SuperWorkspace1)编译后出现“找不到成员”的错误提示?
答:正确的代码应该是SuperWkspManager1.Connect(SuperWorkspace1.Handle。
问:OpenDatasource时,“事务,只读,独占,密码”各有什么意义?
答:只读:只能对数据源中的数据集进行浏览,不能对空间和属性数据进行编辑,也不能创建和删除数据集。对SDB数据源,以只读方式打开的数据源可以同时被多个用户以只读的方式打开。 事务:以事务方式打开的数据源可对数据集进行编辑,但是只有对事务进行了提交后才能保存编辑的结果,否则编辑结果不保存。独占:以独占方式打开的数据源不能同时被另外一个用户打开;当使用 SDX 或者 SDE 引擎时,忽略该参数,bExclusive 自动设为 False。加密:对SDB数据源,当新建数据源对其进行了加密时,打开时就只能以加密的方式打开。
问:怎样判断工作空间是否打开?
答:通过SuperWorkspace.GetWorkspaceName()来返回工作空间的名称,如果为空则为关闭状态。
问:如何列出SqlServer数据库上已经保存过的所有工作空间?
答:用ADO访问数据库中的SMWorkspace数据表,获取所有工作空间的记录。
问:是否可以新建Oracle或者SqlServer的工作空间?
答:使用SuperWorkspace.Create方法可以新建文件型的工作空间,对于数据库型的工作空间,需要使用SuperWorkspace.SaveAs的方法另存到数据库中去。
问:如何修改工作空间中的数据源连接信息等内容?
答:将工作空间另存成sxw格式,然后使用记事本打开该文件,修改其中的数据源连接信息,保存即可。
问:把地图输出为bmp文件时,能否输出地图可视范围(ViewBounds)以外的部分?
答:可以,有以下几种方法:(一)使用SuperMap.OutputMapToBMP()方法;(二)使用SuperMap.OutputMapToFile()方法,设置其最后一个参数true,并选择输出类型为BMP;(三) 先用SuperMap.OutputMapEx()方法把此地图转为一个栅格数据集,再将数据集使用DataPump导出为.bmp文件。
问:打开工作空间后上次做的地图不见了,为什么?
答:该问题很有可能是因为地图没有“保存”的原因。地图是随工作空间一起保存下来的,很多人误以为只要保存工作空间就能把地图保存下来了,其实不是这样的。地图是以工作空间文件的形式存储于物理磁盘中的。对于新地图及修改过的地图,一定要先保存地图(调用SuperMap.SaveAs或Save方法)后,再保存工作空间(SuperWorkspace.Save(As))才能将地图保存下来,两步缺一不可。
问:要替换地图中的某个数据集但又不希望重新作一次地图配色的工作,有什么好的办法?
答:利用SuperWorkspace.SaveAs方法可以将工作空间另存为XML标准的*.sxw文件,这种文件可以在记事本中直接打开并修改里面的数据。