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

作者:皇皇

问:对于某个图层的过滤显示,是否可以使用鼠标绘制的区域确定显示的范围
答:通过设置SuperMap控件的ClipRegion和ClipRegionEnable属性设置地图中的显示范围,通过设置soLayer的ClipRegionEnable属性可以控制图层的显示范围。

问:如何居中显示添加到跟踪层上的几何对象
答:通过EnsureVisiableGeometry的方法,居中显示几何对象。

问:Zoom对地图不起作用
答:在程序初始化的函数中添加数据集,但是使用Zoom放大地图不起作用,建议在使用Zoom之前,通过ViewEntire方法全局显示地图。

问:如何把一个网络数据集转换成一个线数据集。
答:新建一个线数据集,把网络数据集中的几何对象复制到先数据集中,然后通过Joint把网络数据集的属性表追加到线数据集中。

问:取得图层对象只能通过图层的ID,不能通过名称模糊查询取到。
答:通过图层名称过滤查询图层,因为图层名是不变的,所以查不到。把图层名变为图层的标签。 代码: string LyrName = layer.Caption; Boolean bEndWith = LyrName.EndsWith(“专题数据”); if (bEndWith) { layer.ClipRegionEnabled = true; } else { layer.ClipRegionEnabled = false; }

问:Oracle的字符集不统一,造成中文字符乱码.
答:建议中文环境下用ZHS16GBK,其他语言可以设置相应的字符集。

问:如何设置点数据集的中对象为不同风格还有标识名称
答:用单值专题图和标签专题图实现

问:Oracle并发操作,移动或者添加对象后,其他用户能看到吗?
答:其他客户端只要刷新数据地图就可以看到。

问:如何判断数据集已经在地图窗口中打开?
答:获取地图窗口中的图层,判断图层中有没有名称(datasetname@datasourcename) 数据集名称和要判断的数据集相同的,即可。

问:在漫游地图后触发一个行为,SuperMap里用那个事件。
答:用AfterMapDraw事件,可以设置当且仅当鼠标动作(Action)是Pan的状态时,触发该事件中的具体实现。

问:使用CopyDataset 方法将数据集拷贝出来,但是拷贝不成功
答:查看数据集名称是否重复,所以复制不成功,建议更改数据集名称。

问:由于线对象的短线很多,在做标签专题图后,会有很多重复的道路名,怎么合并成一个。
答:建议,可将数据集中多个同名的道路对象,通过道路名称字段融合组合成一个对象,再创建标签专题图,SuperMap Objects中数据集整合对应的接口是soDatasetVector.DissolveEx2。

问:调用OpenDataSource打开数据源失败?
答:查看数据源别名重复,数据源已经打开,数据源已经被破坏 ,没有许可 ,组件没有组册 。

问:在vs2008下用object 2008 需要添加那些控件?
答:要用到那个控件,就添加那个控件,一般情况下,工作空间和地图控件时必须的。

问:supermap控件通过x,y坐标取到距离坐标最近的图元
答:利用鼠标位置,创建一个点对象然后通过QueryByDistanceEx查询。

问:布局打印为A0的图,就会有文字缺失,打印A4就没有问题。
答:重新安装打印机驱动,因为Windows默认的驱动没有打印机的高级选项。

问:默认的文本太大,如何修改变小?
答:修改SuperMap控件的CurTextStyle属性,修改文本的默认值

问:objects里有没有将面状数据集的中心点提取到一个点状数据集的方法?
答:通过soPoint soGeoRegion.CentroidPoint 获取二维面对像的内点然后在通过转换成soGeoPoint,用AddNew添加到一个新的数据集中。

问:查询点数据集中离某一点最近的点,这个点在这个数据集的地理范围内。
答:【1】用QueryByDistance查询产生一个离目标点的新数据集;【2】然后通过Distance方法计算目标点到新数据集中所有点的距离存储在新数据集的一个距离字段中;【3】通过Statistic方法统计出这个数据集中距离最小的点,就应该是结果点。

问:一个城市的地图 我只想要其中某个区的地图,如何截取出来。
答:通过选中对象裁剪的方式,用Clip方法。把这个城市所有的数据裁剪出来。

问:如何获得数据集中点的坐标值
答:把数据存到数据库型数据源中,然后就会自动生成smx、smy这两个字段,然后可以把这两个字段导出到Excel中;或者通过Query查询出数据集对应的记录集,然后GetGeometry获得每一条记录对应的点对象然后获取每一个点的XY坐标

问:SetGeometry不成功
答:查看代码中是否少了Recordset.Edit,在使用SetGeometry时,必须锁定记录集。

问:ECW压缩不成功
答:Ecw压缩时不能大于500M,如果影像文件过大,建议压缩为SIT格式,压缩率8-40。

问:如何定位距离起点某一距离的点,并显示在图上?
答:用soGeoLineM/soGeoLine/soGeometrist对象的FindPointOnLineByDistance方法,获取线上的点坐标,然后把soPoint转换成soGeoPoint对象添加到地图跟踪层上。

问:已经将基站数据存储在Access数据库中了,其中包括基站的x、y坐标和属性信息等。怎么导成SuperMap 中的点数据集。
答:大致步骤: ①使用soDataPump对象导入.mdb数据 ②使用CreatePoints方法根据属性表创建点数据集

问:找距线段断点的距离为D的线上某点,用哪个接口
答:用soGeometrist.FindPointOnLineByDistance方法。

问:怎么将屏幕坐标转成地理坐标
答:使用PixelToMapX/ Y 方法

问:怎么导入栅格符号到符号库,用哪个接口
答:使用soSymbolLib.ImportEx接口

问:怎么获取地图窗口中的图层
答:用soLayers.Item属性去获取

问:如何获得记录集中Geometry的ID?
答:用 soRecordset. GetID( )

问:获取数据集几何对象
答:首先用Query方法查出数据集对应的记录集,然后用记录集的GetGeometry方法获取几何对象。

问:许可和电脑是不是绑定的?
答:许可有两种类型,文件许可和硬件许可。文件许可是根据计算机名称生成的,所以和电脑是有一定关联的。硬件许可以U盘的形式提供,和具体的电脑关系不大。

问:SuperWkspManager控件树节点用鼠标右键选不中,就是没有节点的鼠标右键事件?
答:在MouseDownEvent事件里写两句代码------ soTreeNode objNode = this.axSuperWkspManager1.get_TreeView(1).GetNodeAt(e.x, e.y) ; this.axSuperWkspManager1.get_TreeView(1).SelectedNode = objNode

问:不知道最大显示比例怎样设置
答:soLayer. VisibleScaleMax

问:想将一个面分割成两个面,然后选中其中的一个面,另外一个面也处于选中状态
答:可以用数据集融合,选择组合模式,将分割后的两个面组合成复杂对象。

问:怎么得到选中点所在图层?
答:用这样的方法soSelection objSel = axSuperMap1.selection; soDatasetVector objDtv= objSel .Dataset

问:用object 6.0和vb6.0开发的程序,数据库用oracle10g,给最终用户安装时必须装oracle的客户端吗?
答:因为Objects是通过Oracle客户端来访问Oracle库中数据的,所以需要安装。

问:编辑地图中数据提示“无法编辑只读数据”
答:用soLayers.SetEditableLayer(i)设置图层可编辑

问:地图生成JPG图片用哪个接口
答:SuperMap.OutputMapToFile()

问:WGS84坐标系转Beijing54怎么转
答:用soPJTranslator对象,注意要用soPJParams 设置三参数或七参数。

问:把一个5.3做的项目升级为6.0,想知道怎样做比较简单
答:有两个办法,一个是重新添加6.0的控件直到编译通过,另一个是用6.0新建工程,将Debug下的动态库覆盖到新建工程下,然后修改组件版本号的办法。

问:如何获取面对象的某一节点在点串中的顺序?
答:面对像的点串中点坐标值循环与指定节点的坐标作比较,坐标值相等时返回索引号就可以。

问:图层设为可捕捉,但捕捉后想显示捕捉到的设备点属性
答:在MouseMove事件里用soLayer.HitTest方法,返回点,然后显示点属性。

问:数据集字段中除了Caption属性外其他属性都不能修改吧?
答:只能新建一个想要类型的字段。

问:数据集字段中除了Caption属性外其他属性都不能修改吧?
答:只能新建一个想要类型的字段。

问:用RotationOptions属性设置地图旋转的角度,但是根据点显示在跟踪层上的框却没有调整位置,不知为何
答:通过Objects中RotationOptions属性设置的地图旋转只是在显示效果上将地图选装了而已,其实地图的各坐标点坐标并没有改变。跟踪层的东西是不会跟着旋转的。

问:想构建一个多个环形的并且环被分成很多块的复杂面(比较像飞镖靶盘那种),不知怎么做
答:可以用soGeoPath对象

问:在跟踪层上点击一个点对象,通过什么途径或者方法,获取属于该对象的标签?
答:可以在鼠标的MouseDown事件里写,首先用soTrackingLayer.HitTest返回跟踪层对象的索引号,然后用soTrackingLayer.Event获取到soGeoEvent,最后用soGeoEvent.Tag得到标签信息。

问:导入CAD数据成复合数据集,缩小地图到一定比例尺可以看到箭头符号的那些对象变成了不太好看的点,但是CAD中在同样的地图比例下,这些箭头符号并不会变成点。 打印出来后,效果更不好看
答:将这个CAD图层放大到很大后,设置一下符号缩放,再缩小这个图层,就可以了。

问:两个CAD数据源合并成一个CAD数据源,如何实现?
答:建议把CAD数据导入到数据源中,然后数据集追加行合并数据集。soDatasetVeter.Append方法。

问:从用户界面选择一个线段,然后平移。写了下面的代码,但看不到效果啊。 objPointXY = axSuperMap1.selection.ToRecordset(false); objSelectedLine = (soGeoLine)objPointXY.GetGeometry(); objSelectedLine.Offset(200, 100); axSuperMap1.Refresh();
答:【1】改变原来的数据:objPointXY.Edit(); objPointXY.SetGeometry(objSelectedLine); objPointXY.Update(); 【2】添加到跟踪层: axSuperMap1.TracklingLayer.AddEvent(objSelectedLine,null,""); axSuperMap1.TracklingLayer.RefreshEx();

问:距离查询的搜索半径有没有上限
答:QueryByDistanceEx(objGeoPt as soGeometry, dBufferScope, strSQLFilter, seUnits.scuMeter);半径不能超过这个数据集的宽度,搜索半径不能超过这个值就不能查询到东西。

问:怎么在不同引擎数据源中复制数据集?
答:通过soDataSource.CopyDataset()复制数据集,soDataSource是原数据源,目标数据集soDataset可以来自任何引擎的数据源。

问:生成闭合线外围的缓冲区如何做?
答:因为线是有走向的(顺时针和逆时针),如果这条线是顺时针绘制的,要缓冲外层就要件左缓冲区,如果这条线是逆时针绘制的,要缓冲外层就要件右缓冲区。所以对线的走向要判断,比较麻烦,建议用线先生成一个面然后对面做缓冲区,在进行裁剪,取得外围的线。

问:要求在一次查询的结果中可进行二次查询,
答:可以把结果数据集存储在一个新的中间数据集中,以供二次查询。

问:怎样将BMP图片显示到已渲染好的地图数据中。
答:对栅格数据集进行配准,把BMP配置到矢量地图的范围内即可。

问:有个数据集删不掉,数据库中已经把那个表删掉了,但是那个数据集还是出现了,删不掉。
答:删除方法(以删除乡道L数据集为例):①删除数据库中的实体表——乡道L;②删除 SmRegister表中的“乡道L”相关记录;③删除以“SM_IDX_乡道L”开头的相关索引表;④删除以“SM_SEQ_乡道L”开头的相关的序列文件。然后提交,刷新数据源。

问:EnsureVisibleRect函数调用后,地图没有跳过去,坐标输出了没有问题,如何设置矩形对象框中地图按一定比率居中显示在当前地图窗口中,如何实现?
答:EnsureVisibleRect函数调用和输出图片后,必须刷新地图空间才行。

问:有一个矢量的用地数据集(soRegion类型),包含字段用地类型(耕地、林地、水等等)、面积,用鼠标任意画一个面,统计在这个面范围内各类用地的面积,如何实现?
答:绘制的几何对象对用地的数据集进行裁剪然后,对裁剪后的数据集进行分类的面积统计。

问:如何把多个数据集导出到同一个DXF数据中?
答:[1]首先,要给要导出的数据集添加统一的字段layer来标志导出为DXF以后的图层名,把设置这个字段的值为该数据集名;[2]设置导出参数中的LayerName属性为那个字段名layer,设置Datasets对象为要导出的数据集集合。Deskpro中处理方式类似。

问:升级程序的Objects版本时更换Objects的dll,如何解决?
答:删除程序中关于Objects的引用,然后新建一个窗口添加新的组件。把原来版本的组件反注册了,然后注册新的版本(同一系列,如:5.X系列)。

问:设置DEM颜色范围透明的方法是哪个?
答:使用soLayer的SetTranspRange()方法可以。

问:使用seAction.scaTrackPia画扇形,画不出圆扇形,如何解决?
答:建议使用代码控制生成或者用seAction = scaEditCreateCustom绘制自定义对象。

问:如何将选中对象输出为其它格式
答:选中几何对象后,在右键菜单中选择“保存到数据集”,再通过数据集右键菜单中“导出数据集”功能将数据集导出为其它GIS格式即可。

问:为何设置图层可编辑失败
答:设置图层可编辑失败操作原因可能有:1.soLayers.SetEditableLayer方法中传入的参数非图层的名称,而是数据集的名称,因该方法传入的参数只能是图层索引或图层名称;2.图层所在数据源为只读;3.图层为栅格图层,栅格图层无法编辑。

问:如何获取选择对象
答:SuperMap有一个几何对象选择事件,当地图中有对象被选择时,会触发SuperMap控件的GeometrySelected事件,可从该事件中通过SuperMap.Selectionn属性获取已选择对象。

问:用CAD编辑了一个地籍图,对每个界址点进行了标注,将这个数据导入SDB里面,作为一个CAD数据集,由于界址点编号规则的变化,现在我有一个界址点编号的对照表,请问如何批量处理文本的更新?
答:首先把这个对照表的两个编号字段值追加到CAD数据集上面;然后判断那两个编号字段值是否相等,如果不相等,则继续进行下文,取出GeoText后,要用 GetFieldValue得到变化后编码字段的属性值,用这个属性值通过soTextPart.Text 构建一个soGeoText;然后用soGeoText.SetPartAt修改前步骤取出的GeoText;将soGeoText.SetPartAt 之后的GeoText强制转换成 soGeometry, 然后用soRecordset.SetGeometry ,将对象设置给数据集生效;最后update。

问:大数据量影像数据的展示速度慢,有什么好的解决方案
答:对影像数据集建立影像金字塔就是一种很好的办法。

问:想改变线对象的方向,不知用什么办法
答:可以使用soGeoLine. Reverse() 方法实现。

问:经纬度坐标系计算出的两点距离很小,似乎是以度为单位的,那怎么求出以米为单位的距离呢
答:可以使用soGeometrist. Geodesicdistance这个方法求得。

问:在三维场景中如何显示出道路的标签?
答:需要先将标签转成文本数据集然后再添加到三维图层集合中显示,赋予底部高程值。

问:要查询一个CAD数据集中一个文本字段值为空的记录,不知sql语句怎么写
答:sql语句应该这样写:数据集名. 字段名 Is Null

问:组件如何进行挖方计算
答:建议如下操作:遍历挖方范围内的每个栅格,求出高程差(即栅格的高程值与挖的深度之差),用栅格面积*高程差就是单个栅格的土方量,累加求得所有栅格的土方量之和即可。

问:如何通过点坐标配准影像数据集
答:在“数据处理”菜单——“配准”子菜单——“新建配准窗口”弹出的窗口中,选择影像文件作为配准图层,参考文件不选择。在配准地图窗口中任意选择等量的点,通过选择地图下方的信息记录来修改点坐标。

问:怎样取到soGeoLine对象的两个端点
答:可以通过soGeoLine的GetPart(1)得到一个点串(soPoints对象),里面的第一个点和最后一个点对象为线对象的两个端点。

问:在文本数据集上使用action添加文本时,默认文本大小有时候会很小,如何更改默认文本风格?例如文本的大小,文本的颜色
答:使用SuperMap.CurTextStyle属性,可以设置默认文本风格。

问:一个6度分带的20Nshp数据,一个3度分带的39度带数据,在arcgis中直接将两个shp数据可以放在同一个窗口显示,SuperMap中如何做呢?
答:提供了两个解决方法:【1】如果用动态投影,比如两个图层,那么这两个层在使用动态投影前要先设定好自定的坐标系,都有坐标系了动态投影才会有效,但是使用动态投影会影响显示效率【2】做投影转换,把数据转到一个坐标系上,那肯定能叠加到一起

问:某个管道爆管了,如何找到离他最近的阀门?
答:以一定范围内的阀门点作为设施点,爆裂的阀门点作为事件点,使用最近设施查找最近的阀门。

问:为什么对于有的属性数据表,执行删除操作后必须要经过界面刷新才能删除?
答:并不是说属性表不能够删除,是做了关联显示的属性表,在删除的时候,因为内部占用的关系删除失败。将做关联显示的属性表从被占用的数据集中释放掉就可以了。在程序中添加soDatasetVector.ClearRecordsets,将数据集的记录集释放掉,被占用的属性表也会给释放掉的。

问:用MouseIcon来改变鼠标样式,怎么来定义图片的尺寸?
答:图片尺寸只能对图片本身进行修改,尽量用88、1616、32*32等尺寸的图片,如果有其他图片可以用IcoFx软件处理。

问:不同坐标系的数据如何显示到同一地图中,比如:有些数据是WGS84经纬度的数据,有些是UTM的,都存在一个数据源中。
答:建议把坐标系相同数据对象放在同一个数据集中,存放在不同的数据源中,设置合适的坐标系,然后在创建地图时,可以设置动态投影SuperMap.EnableDynamicProjection = true;SuperMap.PJCoordsys = objPJC; 就可以让不同坐标系的数据显示在同一份地图中。

问:地图移植到Windows 7上,文本数据集的文字显示为乱码,Windows XP或者Windows Server 2003没有问题。
答:由于Oracle的服务器和Oracle Windows 7客户端的字符集不一致造成的,建议查看Oracle字符集的情况,使客户端和服务器一致即可解决问题。

问:对于符号库、线形库、填充库,可以调出来编辑,但是怎样知道用户选择的是那个具体的风格。
答:通过获取Style属性,来获取地图中数据对象对应的风格,或者通过ShowEditor或者ShowPicker来实现可视化的选择,就能获取点的风格的ID。

问:设置CAD数据集的图层的风格不顶用
答:CAD数据集图层设置对象风格是一个对象一个对象设置的,不能对整个数据集,而简单数据集是对整个图层的,不对单独的对象。

问:Oracle客户端打开数据非常慢
答:这个问题和客户端的网络情况有很大关系,建议用tnsping工具看一下ping到服务器的时间。因为远程访问服务器时,是从服务器下载数据过来的,如果网络数据太慢就会影像显示速率。

问:如何在bitmap上面绘制线型
答:使用soLineStyleLib.DrawEx可以绘制出来

问:如何把符号打印到图片框上
答:打印符号使用个Draw的方法,可以把符号绘制到指定的设备上。

问:图例空间关联了地图控件,可是打开地图图例控件还是不显示
答:图例控件不显示,无非是没有关联地图控件或者打开数据没有刷新控件,建议在打开地图时刷新图例控件。

问:在SuperMap Objects2008里面,如何将记录集转换为矢量数据集
答:使用soDataSource.RecordsetToDataset即可

问:SQL查询,对于文本字段,查询空字段值的记录怎么写SQL语句
答:“DataSet.Name = ‘’”这样的语句,建议先用Deskpro测试,测试成功后,在用于Objects。

问:*.smw的工作空间文件,通过二进制流的方式保存成到数据库的二进制字段中,在下载下来,就不能打开工作空间了。
答:在存入二进制文件时,数据库会自动添加一些头文件和尾文件,在下载后最好把这些头尾文件删除,然后就没有问题了。

问:如何删除数据集中的记录
答:soRecordset的Delete、DeleteAll方法,或者soDatasetVector的Truncate方法。

问:如何定位离铁路起点一定里程的点
答:因为点的里程是相对的,所以可以用已经的车站点到铁路起点的距离加上相对的里程计算出铁路上的点。 【1】首先,通过soGeoline的SplitEx方法(该方法带有容限值,如果点不在线上可以设置相应的容限值,确保打断的成功系数)打断线,取出第一段线获取该线的长度dLength; 【2】其次,用dLength + 打断点到事故点的线标值M = dDis,获取事故点到铁路线起点的距离; 【3】最后,通过soGeoline的FindPointOnLineByDistance方法,获取事故点的坐标点soPoint对象Event_Pt,新建soGeoPoint对象Event_Gpt,把Event_Pt的坐标值付给Event_Gpt,把Event_Gpt添加到跟踪层上。

问:一条记录中: 所在位置= 昌明路 用 IsRecord = pRecord.FindFirst(Sql); IsRecord = false;怎么回事? Sql =所在位置 = ‘安达路’ or 所在位置 = ‘白马路’ or 所在位置 = ‘昌明路’
答:这个功能不支持数据库引擎,支持SDB数据源,因为客户用的是SQL Server数据库。

问:为什么shp面数据第一次导入的时候不报错,第二次导入的时候就报内存被占用的错误?
答:出现这种问题的原因一般是变量没有释放好。如果变量释放没问题,那么就要看在删除数据集之前该数据集是否从地图窗口中移徐,因为删除数据集之前要先从地图窗口中将对应的图层移除掉,否则会出错

问:如何至刷新地图中的某一个图层,而不刷新其他图层?
答:必须把要刷新的图层放在第一层,然后设置该图层的usecache属性,刷新即可。

问:用一个线程过一分钟更新一下数据集的属性表,一直出错用timer事件就没事。
答:多线程处理数据时,最好不要显示数据,如果多线程有问题,就做好不要用,因为文件型数据源多线程会产生一些问题。能用Timer事件控制就可以了。

问:5G的*.img影像数据如何导入到Oracle数据库中,导成分好几个波段的数据
答:大数据量的影像建议用Deskpro5.36或者6.0导入。也可以把影像处理成3波段8位或者24位的影像,这样导入后就不会分成三个波段。

问:通过SuperMap.ClipRegion设置自定义地图显示范围不成功。
答:处理设置SuperMap.ClipRegion,还要设置SuperMap.ClipRegionEnable = true,然后刷新地图。

问:知道x,y坐标在地图定位到他的位置,用哪个方法?
答:【1】把点添加到地图中或者跟踪层上;
【2】通过EnsureVisiableGeometry,确定点的位置 。

问:string strWhereSql = “名称 like '%” + sRoadname + “%’”; 同样是这一个sql 语句,如果数据是连接数据库就能查询到结果,但是如果数据源是本地的,就总是零
答:对SDB数据源进行迷糊查询时通配符为‘’,代码为: string strWhereSql = "名称 like '" + sRoadname + “*’”;

问:动态创建SuperWorkspace控件(SuperWorkspace superWS_Tem = new SuperWorkspace()),然后用OpenDataSource打开,怎么提示“灾难性故障”?
答:建议添加一个superworkspace控件到Form上,对比designer的创建方式,新建工作空间对象。

问:从deskpro中到处一个图层的专题图模板。然后使用soThemeCustom.FromXML导入到图层中,不能显示专题图。
答:FromXML读取的是XML字符串不是XML文件的路径,需要把XML文件解析成字符串,然后传入才能正常显示。

问:设置随图缩放后,矢量符号放大后都连成了一条直线,如何避免这种情况?
答:可以设置一个临界比例尺,超过这个比例尺,SymbolScalable =false,符号不随图放缩

问: 复制影像到另一个数据源出错:ora-00942 表或视图不存在。
答:这个问题主要是Oracle数据源的问题,应该是有些表出错造成的。

问:运行程序经常报:内存错误
答:这类问题主要是因为soRecordset对象没有关闭,没有COM释放对象。

问:为什么导入数据集时报数据集名称不合法错误?
答:因为数据集名称中有不合法的字符,如中划线,所以导致失败,数据集命名不合法,改成合法的就行。

问:Objects开发版配许可,为什么总是提示无可用许可?
答:原因还是客户在配置许可的时候,运行版和开发版的许可都配置了,却只有开发版的许可,所以导致在程序运行时找不到运行版的许可,提示无可用许可。删掉许许可配置的ini文件,只配置开发版的许可就可以了

问:客户打开地图成功,打开数据源失败。
答:通过打开工作空间打开地图,对应的数据源(文件型)已经被打开,不能在打开,所以出错。

你可能感兴趣的:(组件GIS,supermap,地图)