SuperMap iObject常见问题解答集锦(六)

来源:互联网 发布:商场消费数据 编辑:程序博客网 时间:2024/04/19 19:25

作者:皇皇

问:objThemeCustom.SymbolRotationField , 如想用Windd12字段的值+100作为旋转的角度值,怎么写表达式
答:可以这样写,objThemeCustom.SymbolRotationField =”Windd12 + 100”

问:怎么拉框选中多个图层上的对象
答:可以用 scaTrackRectangle 方法,然后用SuperMap.TrackedGeometry来获取,放在axSuperMap_Tracked事件里触发。用这个矩形几何对象对当前地图窗口中的每个图层做空间包含查询,然后将每个图层满足查询条件的记录集对应的Geometry取出加到TrackingLayer上显示。

问:axSuperWorkspace控件的ReadyStateChange事件不能触发
答:这个事件是微软OleControl自带的,不是SuperMap开发的,具体可参见COleControl::FireReadyStateChange(MFC) 。

问:怎么让查出的记录全幅显示?
答:可以,使用EnsureVisibleRecordset方法。

问:想实现动态移动小车,问MoveTo方法中的坐标值是屏幕单位值吗
答:soGeoEvent. MoveTo(X,Y) 中参数的单位就是地图的坐标单位,如果是经纬度坐标系,那单位就是度。

问:用程序修改系统的时间,把系统时间固定在某一天。但是用的是试用许可,这样做跑不起来。问有没有什么办法。
答:如果是试用许可,那么系统时间是绝对不能往后改的。要想解决这个问题,只有申请正式许可。

问:用Append方法将一数据集查询出的记录追加到另一数据集中去,想让追加数据集的SmID保持原来的值,目的是根据SmID来识别记录
答:SmID的值是根据被追加数据集的记录个数依次生成的,所以SmID的值一般都会变的,识别记录可以用SmUserID。

问:想查询文本型字段“地址编码”的最大值,用Max()统计,没有查出任何记录,问题文本型的字段可以用Max()统计否。
答:文本型字段是可以用Max()统计的,但是统计出的值并不一定是最大值,而是依据文本的ASCII码值从首位依次向后比较大小得出的。例如:文本型字段的两个值 90 和100 ,用Max()统计后结果是90 而不是100 。告诉客户,除了Count()外,聚合函数多用于数值型字段的统计。

问:怎么根据中心坐标、长半轴、短半轴画椭圆?
答:可以使用 soGeoEllipseOblique 斜椭圆对象。

问:想通过设置缩放比例来缩小soRect的范围,没有这个接口该怎么做?
答:soRect的范围可以通过边界属性来设置,不能设置比例缩放soRect 这样的功能soGeoRect 对象可以做到,可以通过soGeoRect对象的Bounds属性获取到soRect。

问:关联属性表多个字段做标签专题图,显示出来是右对齐,想显示成左对齐,怎么做?
答:设置标签文本的Style的Align属性为sctTopLeft 即可。

问:想用Objects实现Deskpro中配准的功能,不知用什么对象。
答:可以了解一下soTransformation 对象

问:用soGeoPie. ConvertToRegion方法转成soGeoRegion后,可不可以再转回扇面对象?
答:soGeoPie. ConvertToRegion 方法转成region 后,弧段就被近似处理成折线了,所以这个对象的范围发生了变化。如果还想转回原来的soGeoPie,只有通过已知的参数再去构造了。

问:将两个矢量数据集用Query方法查询出满足条件的对象,想将查询结果同时高亮显示出来,不知怎么做。
答:将查询出来的记录集用GetGeometry获取到几何对象,然后使用跟踪层以一定风格显示出这些对象。

问:已知原坐标系的点坐标和转换后坐标系的点坐标,怎么推算出三参数?
答:有一个办法,首先得知道至少3个控制点,这3个点在两个坐标系下都有坐标值。然后分别将这两个经纬坐标系转同一种投影系,求得这3个点的两组投影坐标值。再求得两组投影坐标的差值,将三个差值平均就算出dx、dy、dz 。这三个坐标平移量就是按照此法求得的三参数。如果要求精度不高的话,这样基本就可以满足要求。

问:SuperMap Objects 中怎么样让Query找到的属性值为不重复值?
答:soStrings objstrings = new soStrings();
objstrings.Add(“DISTINCT name”);
soRecordset objRrd = objDtV.Query(“1<2”, false, objstrings, “”);
以上代码即为查询name字段所有不同的值的记录。

问:怎么获得栅格的分辨率
答:soDatasetRaster. ResolutionX / Y

问:怎么求两个相邻面对象的公共边界?
答:先将面转成线对象,然后再用soSpatialOperator. Intersection 方法求公共边。

问:想用soGeoEllipse对象画一个有旋转角度的斜椭圆,设置了Rotate ,但是结果没起作用。
答:将soGeoEllipse转成线或者面之后,再用Rotate()旋转,就可以。或者直接使用直接用soGeoEllipseOblique对象。

问:用soGeoCircle对象画圆,打印出来看到圆不太光滑有锯齿状。
答:可以设置反走样 SuperMap. AntiAlias = True 在显示效果上改善。

问:在线数据里画一个正北方向 500米线,该怎么做
答:【1】创建两个soPoint对象,确保两个点的X、Y任意一个方向的坐标差值为500米,另一个方向为0米;
【2】新建一个soGeoLine对象把前面创建的两个点添加到线的点串中即可。

问:在地图上双击鼠标时后能,如何获得到地图的坐标
答:【1】设置一个bool型的变量bDLClick,当鼠标双击时为True,然后当DLClick为ture,MouseDown事件获取鼠标点坐标可用。 【2】在SuperMap控件的MouseDown事件中,然后通过PixelToMapX、PixelToMapY获取鼠标点击点的坐标。

问:想在三维图层中,添加点,并把这个点的风格弄成一个图标,比如风机的样式
答:向三维图层添加点对象,不能设置图标的风格。不过有个办法,客户添加文本对象,然后将文本的样式设置成TrueType字体,就可以添加自己制作的风机的样式。

问:有一系列有顺序的点,想按照这些点来画区域
答:先把这一系列点存储到soPoints中,然后在New一个soGeoRegion对象,用Addpart把sopoints对象添加到soGeoregion里。

问:几条线,有弧也有折线,连接在一块形成一个闭合的形状。想对这个闭合的形状做外缓冲区,不做内缓冲区,选择了Buffer2(),可是生成的缓冲区在两条线的连接处会出现缺口,怎么解决。
答:Buffer2()确实只能做平头缓冲区。有一个办法:①用Dissolve()将这些连在一起的线对象融合成一个线对象;②将线转成面对象,ConvertToRegion();③对面对象做缓冲区,Buffer();④用soSpatialOperator. Difference()或者Clip()方法将缓冲区面和原始面交叠部分去掉,就可以得到想要的缓冲区域了。

问:VB+ Objects如何实现鼠标查询栅格值
答:【1】获取鼠标当前点的屏幕坐标;
【2】通过SuperMap.PixelToMap坐标成地理坐标;
【3】通过坐标转换的数据公式把地理坐标转换成栅格数据集的行列号;
Row = int(Top-y)/ResolutionX;
Col = int(x-left)/ResolutionY;
【4】通过GetValue的方式获取栅格值。

问:想要将一个点数据集中的部分点保存成新的点数据集。不知该怎么做
答:首先创建一个新的点数据集,将原点数据集中满足条件的记录用Query()方法返回记录集soRecordset,然后使用新点数据集的Append方法追加这个soRecordset。满足条件的点数据集就生成了。

问:字段为seDate类型的值如何转为C#中的DateTime类型
答:先转成string,然后转成DateTime型: CultureInfo MyCultureInfo = new CultureInfo(“de-DE”); string strObj = object.ToString(); DateTime MyDT = DateTime.Parse(strObj, MyCultureInfo, DateTimeStyles.NoCurrentDateDefault);

问:wms数据源里有一个wms数据集,加入到图层上显示,想设置wms图层的某些子图层为不可见,可是获取不到子图层。
答:Objects里确实不能获取到wms图层的子图层,办法是在Deskpro中将子图层的可见性设置好后保存地图,再导入。

问:怎么在地图上禁止只用鼠标滚轮放大缩小地图呢?
答:用SuperMap控件的MiddleButtonEnable属性控制。

问:如何去除数据集中重叠的对象
答:用soTopoCheck 对象的CheckTopoError先查询出重叠的部分,然后以ErrorObjectID查询出对象,删除其记录。

问:怎么得到组成面的点串
答:使用soGeoRegion. GetPartAt() 方法

问:请问能否导出数据集中smid从0到n的对象为其他格式.
答:先用查询的方式查询出smid从0到n的对象存储在一个新的数据集中,然后导出新的数据,导出后把这个数据集删除就可以了。

问:想在内存中创建对象,并能持续的显示,在窗口关闭之前。
答:可以使用内存数据源,或者使用跟踪层。

问:做栅格图渲染,需要对一些值为0的部分设置为透明,如何做?
答:设置RasterBkTransparent设置true,设置RasterBkTolerance为合适的值、RasterBkColor为颜色值为0的颜色即可。

问:怎么删除符号库中的符号
答:用soSymbolLib. RemoveAt()方法

问:如何以日期型字段为查询的条件,SQL语句如何写?
答:SQL语句:Region.TimeStart < #2010-02-03 15:41:02#,日期用#号括起来。

问:用SuperLengend自带的专题图功能,做范围分段专题图,不能自己设置每个分段的起始值和终止值
答:Objects 2003 的SuperLengend控件自带的分段专题图确实不能自己设置分段值。建议使用Objects 2008或者更高版本。

问:添加点时就设置好点的风格样式,如何做?
答:【1】以某一个字段创建单值专题图;
【2】在添加点对象时,直接设置对象专题图字段的相应的值,即可。

问:如何通过点击SuperGridView上的记录定位到地图上
答:【1】先获取点击记录的ID;
【2】然后Query对应的对象;
【3】通过SuperMap。EnsureVisiableGeometry居中显示对象。

问:如何用Objects实现DesktopPro延伸到线段功能?
答:先求出原线段到延伸线的交点,然后判断这个点是到原线段的起点近还是终点近,若离起点近,就把起点和连线生成新的线,更新原来的线,如果离终点近,把终点和交点相连构线和原线段合并,更新原来的线。

问:如何把线平均分成10等分,并提取等分点?
答:【1】用soGeoLine.ResampleEquidistantly方法重采样线;
【2】用soGeoLine.GetPartAt方法,获取节点的坐标并构造soGeoPoint对象。

问:在地图上我选中一个对象,怎么获得此对象所在的图层名?
答:通过soSelection对象的Dataset属性,获取对象所在数据集的名称,通过soLayers[DtName@DsName]获取对象所在的图层。

问:一个图层的单值专题图,如何取得单值专题图中各个图元样式?
答:通过soThemeUnique的style属性的获取单值对象的风格。

问:如何获取正在编辑的数据集
答:通过soLayers.GetEditLayer获取正在编辑的图层,通过soLayer.Dataset获取数据集。

问:点符号库中的,显示大小的属性,在sostyle中是哪个属性?
答:没有显示大小这个属性,只能用SymbolSize控制点符号的大小。

问:请问在objects里怎样实现上一视图、下一视图的功能?
答:有两种方法: 1、记录当前地图的中心点和Bounds;存在在一个数组中, 2、用地图标签来实现soMapbarks。

问:如何更改单值专题图的单值风格?
答:通过Value的属性遍历各个单值,然后用set_Style 更改各个单值的风格。

问:使用拓扑检查的功能,不知去除重复点的常量是哪个
答:使用 seTopoRule . sctNoIdentical (去除重复点规则)

问:想往符号库中添加Bmp格式的图片符号,不知用哪个接口
答:导入的图片大小不能超过300K。 使用接口 soSymbolLib . ImportEx( ) ,seSymbolFileType . scIconBitmap .

问:另存SXW格式工作空间不成功
答:【1】查看SaveAs方法的第三个参数,是否设置为False,如果是请改为True;
【2】查看工作空间名称是否有重名;
【3】查看系统空间是否足够。

问:想查包含点对象的面,用scsContaining查询模式,查不到面,不知为何
答:应该使用scsContainedBy 查询模式。

问:用scaTrack…怎么同时选中多个图层的对象
答:首先用TrackedGeometry返回这个Track对象,然后用这个对象对指定的图层做空间查询,取到查询结果记录集对应的几何对象,最后加上一定的风格添加到跟踪层上显示。

问:地图打印的时候,在Layout中的地图的边框如何不显示?
答:设置soLytMapBorder 对象的边框模式,为seMaCornerpBorderFillStyle即可

问:一个窗体能否创建两个workspace
答:不能。建议只用一个工作空间,这样管理起来也方便。

问:设置对象半透明,并高亮如何做?
答:把查询而得到的符合条件的记录集对象转换成选择集,设置选择集的风格,使BrushOpaqueRate等于小于100的值,就可以半透明和高亮。

问:Oracle数据源不能删除数据集,如何删除?
答:【1】查看有没有权限;【2】如果是调用服务器的数据,查看网络是否断开;【3】查看数据集索引,看是否破坏;【4】如果索引破坏,可以考虑还原数据库,或者删除这个数据集(但是要保证备份数据);【5】删除方法:(以删除乡道L数据集为例)①删除数据库中的实体表——乡道L;②删除 SmRegister表中的“乡道L”相关记录;③删除以“SM_IDX_乡道L”开头的相关索引表;④删除以“SM_SEQ_乡道L”开头的相关的序列文件。然后提交,刷新数据源,查看数据集是否还在。

问:刷新地图时如何只刷新某个图层
答:用soLayer对象的usecache属性,但是这个属性只能在图层可编辑的状态下,才能只刷新当前可编辑图层,且只有当当前图层在第一层时才可以。

问:用VB这样去定义soQueryDef对象: Dim strFilter As soQueryDef ,提示“对象变量或with块变量未设置”,不知怎么回事
答:应该这样去写: Dim strFilter As New soQueryDef

问:缩放地图的时候,当放大到一定比例的时候点数据的图标也会变大,如何修改这种情况?
答:设置图层的属性符号缩放属性,SuperMap Objects对应的是soLayer对象的SymbolScalable属性。

问:插值时,矢量数据集是不规则形状的,怎么让插值的时候不按矩形生成。
答:根据矢量数据集的形状绘制一个面对像,然后用ClipEx方法裁剪插值生成的矢量数据集.

问:如果在这个窗体要使用另外一个窗体的supermap控件,应该要设置supermap控件的哪个属性?
答:【1】设置SuperMap控件的Modified属性为true(不安全);【2】创建一个关于SuperMap控件的属性,用来获取SuperMap控件。

问:默认选择的样式如何改?
答:在程序初始化的时候 ,获取SuperMap控件的Selection命名为SysSelection,修改SysSelection的style属性即可。

问:如何获取数据源中的网络数据集
答:通过soDatasets对象遍历数据源中的数据集,判断soDataset的Type属性是否是scdNetwork ,如果是则返回。

问:怎么画扇形?
答:使用soGeoPie对象

问:通过soGeoCircle对象画圆添加到面数据集中,之后怎么获取到这个圆对象的半径呢?
答:可以获取到次面对象的内点就是中心点(CentroidPoint ),然后获取到面的任何一个顶点(GetPartAt)。然后求距离,就得到了这个圆面的半径。

问:如何在地图中实现动态地显示点的移动?
答:首先,获取到点对象,然后添加到跟踪层上,设置Timer,并且每次移动前都删除以前的跟踪层上的对象。

问:如何在地图中添加一个点对象?
答:首先新建一个soGeoPoint对象,把要添加的点的坐标赋给这个点,然后把这个点通过AddNew的方式添加到点数据集中,或者直接通过AddEvent的方式添加到跟踪层。

问:带弧度的多边形怎么样绘制
答:通过soGeoPath对象的AddNode2方法构造一个几何路径对象,然后通过ConvertToRegion或者ConvertToLine转成面或者线对象添加到数据集中.

问:获取数据集的几何对象,如何设置和原图层一样的风格?
答:1、通过当前图层的Style属性获取当前图层的风格;
2、通过soRecordSet.GetGeometry() 获取的几何对象;
3、设置几何对象的style即可。

问:用SuperMap Deskpro 2008入库的Oracle Spatial数据源在SuperMap Deskpro 6打开显示正常,在SuperMap Objects 6中能打开但是不显示数据。
答:打开其他SDB的数据,看地图是否能正常显示,如果不显示地图,问题可能是没有关联控件,打开数据时是否刷新控件等情况。

问:如何在写完一串文本后自动把风格设置给这个刚写完的文本上,而不需要再次点选再设置?
答:响应AfterGeometrayAdd事件,当添加完对象后自动就触发了这个事件,在这个事件中可以将风格设置给刚天加的对象。

问:如何定时在TrackingLayer上显示从硬件com口接收到的坐标数据,这个数据是这个小飞机,不光有坐标,还有朝向。
答:创建一个soGeoPoint对象,然后把坐标赋给它,在TrackingLayer上用AddEvent将点对象添加到临时图层上,添加时也可以设置点的符号和旋转角度,用户可以添加一个Timer计时器,定时从com口读数据,并向临时图层上添加对象,每次添加都把前一个删除。

问:为什么Grid数据集ClipEx裁剪总是不成功?
答:主要因为该函数有一个参数是设置背景颜色的,对于grid数据集,背景色要设置成null,如果给了背景色就会裁剪不成功。

问:在追加记录时如被追加数据集中没有这个字段,追加后是什么结果?
答:如果没有这个字段,系统也会为被追加数据集新建一个这个字段的,并把数据复制到对应的记录上去。

问:地图设置全幅显示后边上总留一个白边,如何让地图充满整个地图窗口?
答:把MarginWidthViewEntire 值设置成0就行了,这样就可以地图充满屏幕了。

问:为什么打开数据源后控件没有任何反映,没有显示出已打开的数据源?
答:没有调用SuperWkspManager.Connect(objSuperworkspace As Object) 这个函数和工作空间相关联。

问:在VC中LPDISPATCH CsoLayers::GetItem(const VARIANT& Index)如果想得到第8个图层语句怎么写?
答:GetItem(COleVariant(8L))

问:如何让地图上的文本在地图比例尺改变时不变?
答:设置文本的风格soGeoText.TextStyle,设置soTextStyle.FixedSize 为true即可。

问:如何查看数据集的类别?
答:在soDataset里有一个type属性,通过这个属性可以查看。

问:如何在经纬度数据源下获得一个面对象的以米为单位的面积?
答:使用soGeoRegion.GetPreciseArea() 函数即可。

问:如何向纯属性数据集里添加记录?
答:先用Query函数生成数据集的soRecordset,注意Query时要将是否查询属性数据的参数设置成false,然后调用Addnew添加一个空的soGeometry,然后再调用SetFieldValue来设置字段值,最后再Updata即可。

问:为什么Query出来以后发现没有几何对象,但却有字段值?
答:这种情况下请检查Query函数的参数,如果第二个参数据设置成了false就是这样的结果,改成true就可以了。

问:如何在符号编辑器选择符号后知道所选符号的ID和名称?
答:在调用ShowStylePicker(soStyle)函数后就会在soStyle发生变化,通过这个变量就能得到用户选择的符号的ID,然后再用soSymbolLib.FindID(nID As Long) 返回索引,并用这个索引找到关于这个符号的其它信息,包括名称。

问:对于经纬度数据,如何求出两点间以米为单位的距离值?
答:使用soGeometrist.Geodesicdistance() 函数可以求得以米为单位的距离。

问:如何将查询到的记录居中显示?
答:使用SuperMap控件里的EnsureVisibleRecordset ()函数即可。

问:为什么地图控件一close时,系统就死掉了,如何解决?
答:出现这种问题的主要原因是没有释放变量,没有断开一些和地图控件相关联的连接,比如说Legend 控件需要DisConnect等。

问:两个没有重叠部分的面能够合并在一起吗?
答:soGeoRegion对象的Union函数对于没有重合部分的面就会合并成两个不相交的复合对象。

问:当把一个工程复制到另一个工程里时发现LegendList里的图标都不见了,如何解决?
答:新建一个名为XXX.exe.manifest 的文件,其方法的内容在论坛里可以找到,网址为http://www.gisforum.net/bbs/dispbbs.asp?BoardID=20&replyID=623664&ID=114138&skin=1。

问:使用soDatasetVector.Query这个方法,如果只想查找ClassID=’32023’,应该怎么样设置?
答:正确使用方法:Query(“ClassID=’32023’”,true,null,false),建议查找帮助文档中的相关文章。

问:将CAD数据集中的风格写入属性表中,不知怎么获取到对象的风格
答:获取到soGeometry后,用它的Style属性即可。

问:将name字段值相同的线对象合并成一个线对象,怎么做?
答:用数据集融合的Dissolve() 方法。

问:用VS开发,SuperMap控件随着主窗体大小的变化而变化,怎么做?
答:可以这样做,首先用一个分割器,例如TableLayoutPanel容纳SuperMap控件,然后设置SuperMap控件的Dock属性设置成Fill就可以了。

问:有一些气象符号的.ico图标,怎么在超图中使用?
答:使用soSymbolLib符号库对象ImportEx方法导入.ico图标到符号库中。

问:在Txt文件里存有站点的经纬度、站点名称、高程等属性信息,想知道怎么样转成sdb。
答:建议先将站点的经纬度和属性等信息录入access数据库,然后再使用soDataPump对象导入Access表成属性表数据集,然后在循环取出这个属性表的字段赋属性给新建的点类型数据集。

问:移除专题图的方法是什么
答:soLayer.DeleteThematicMap。

问:不知道在C#中soThemeUnique. get_Style(index) 的含义是什么。
答:表示获得单值专题图指定索引号的单值的风格

问:对一些图层设置了可见比例尺,想在当前的视野下,获取到可以看的见的图层,不知到怎么做?
答:可以获取到当前视图的比例尺,然后依次和每个图层的可见比例尺范围进行比较,得出看的见的图层。

问:怎么将两个数据集弄成一个数据集,比如我现在数据源中有餐饮业、宾馆酒店,我想将两者合成一个数据集,怎么办?
答:用矢量数据集的Append方法即可。

问:对象节点编辑,增加一个节点怎么弄,比如线,在线中间加个节点。
答:通过GetPartAt获取点串soPoints,然后获取地图上鼠标点击的点soPoint,通过soPoint和soGeometrist的GetPerpendicularPosition方法找出线上的最近的点(在容限范围内),然后soPoints用Add添加该节点,或者可以参考 InsertPartAt。

问:用soLayer对象的FromXML方法,导入地图模板,导入成功,但是地图不显示。
答:FromXML要求的参数是XML字符串,不是XML的路径。

问:用SerPartAt修改文本对象的内容不成功
答:修改对象后,需要把对象用Edit、SetGeometry、update编辑记录集,才能显示成功。

问:用的是网络加密锁,用axSmxLockInfo1.RetrieveData()检测不到许可,怎么办?
答:建议使用RetrieveDataEx()方法。

0 0