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

作者:皇皇

问:打包完成,在机器上安装注册smregister.exe死在那里无响应,单独注册smregister.exe就没问题,为什么?
答:打包时漏了超图打包时必打的一些文件,比如Plugins文件夹。

问:如何给地图加上图例
答:【1】可以新建数据集绘制地图的图例;
【2】也可以通过布局模块实现。

问:datasource.DeleteDataset是直接删除数据,返回值已是true了,但是没有删除。
答:建议重新配置许可,然后反注册在注册组件。

问:通过鼠标操作添加点对象成功,但是添加线不成功
答:可能是线的长度为0,这样就不能添加不成功,如果在添加对象之前判断一下对象值情况。

问:程序报错:COM 对象与其基础 RCW 分开后就不能再使用,为什么?
答:因为程序在什么地方释放了变量,然后又在其他调用了这个变量,但是已经释放了对象,所以报这个错。

问:用符号编辑器导入32x32的栅格图标做点符号,导入后的符号有的大有的小,怎样才能控制导入后的符号大小?
答:栅格符号只能在外部处理,导入后就不能编辑了,因为图片本身就有一个3232和1616的图片,所以虽然3232导入,但是显示时会显示1616的那个图片,所以要在导入前处理好图片.

问:怎么创建路由线对象
答:首先创建soPointM , 然后soPointMs.Add(soPointM),最后soGeoLineM.AddPart(soPointMs) 。

问:用scaTrackRectangle 在内存上画个矩形用来做空间查询的搜索对象,怎么获取到画出的矩形对象呢
答:用SuperMap.TrackedGeometry 来获取。

问:像Deskpro中那样的效果,鼠标移动的时候实时显示经纬度坐标值。数据是投影坐标系的,用的MouseMoveEvent中获取e的值是平面坐标的,怎么显示成经纬度坐标值
答:首先PixelToMap转成地图的坐标,也就是以投影坐标值为单位的是米,然后用Inverse方法逆转换到经纬度坐标值。

问:坐标系是WGS1984,要用buffer生成一个100米的缓冲区,直接在buffer的半径参数里写100米,那结果缓冲范围太大了。
答:有这样一个办法,先将这个经纬度的点转成某一种投影坐标下的点(这个投影可以指定本区域变形做小的投影),然后做缓冲区,最后再将这个缓冲区面反转回经纬度坐标系。

问:sogeoLine.SplitEx(point,sogeoline1,sogeolin2,200.0)其中sogeoline1和sogeoline2的位置是怎么确定
答:原线的起点到分割点之间的线段就是sogeoline1,另外的一段就是sogeoline2.

问:怎么检查工作空间中的数据源是否在磁盘上已经被删除掉了
答:使用数据源的Opened方法判断

问:soLytMapBorder对象如何使用?直接new创建提示找不到类工厂的错误
答:直接new soLytMapBorder对象会提示用户所说错误,建议先通过soLytMap.MapBorder 获取到地图边框对象,再重新设置mapborder的风格,最后将设置好的mapborder对象传递给soLytMap。

问:如何设置圆形区域的背景为透明?
答:设置填充透明的话就用填充模式为1,如果要设置50%的透明度,那么就用BrushOpaqueRate 。

问:图层关联做对比分析时,超图能否实现十字丝的效果?
答:在supermap的跟踪层上绘制两条相交的十字线

问:sql中的业务表怎么能生成数据集显示出来,业务表中有经纬度信息
答:数据库中的是业务表,如果要在supermap中显示这些业务表,需要升级软件到6.0,使用注册属性表的功能,再根据经纬度信息生成空间数据集。

问:平面下面设置的最大最小显示比例尺,改为经纬度之后,应该怎么设置?
答:最大最小显示比例尺的设置都是依据当时地图的比例尺来设定,如果将地图的投影信息改变了,需要重新设置最大最小显示比例尺的.

问:solayer.visable设置图层不显示之后,为什么图层还是显示?
答:使用refresh刷新地图以后就可以了

问:为什么同时打开超过30个地图时supermap中不显示地图,或者控件变为黑的?
答:如果连接的是oracle数据库,出现用户所说情况为读取不到数据,所以通过修改oracle中的默认游标数量,即将OPEN_CURSOR(定义每个Session最大能够打开的游标数量)改大一些就可以了。

问:如何能够获取到数据集对应的数据库中的表名称?
答:使用soDatasetVector.TableName 可以获取到数据集对应的表名称。

问:为什么标签专题图生成的标注不能够全部显示?
答:图层的文本过滤显示是自动启用的,可更改soLayer.AllowTextOverlapped =true,将不设置文本叠盖。

问:绘制了椭圆弧,使用中间带箭头的风格显示,但发现方向是逆时针的,如何更改为顺时针的?
答:椭圆弧默认的方向是逆时针的。如果要改为顺时针的,建议线转换线反向(sogeoline.reverse) ,但椭圆化需要先使用此方法转换为线soGeoEllipticArc.ConvertToLine()

问:如何把图例控件右击出现的菜单可编辑这项去掉?
答:图例控件的右键菜单中的可编辑状态等,不能在代码中控制,如果用户需要控制某些状态的可用不可用,需要自己制作右键菜单。

问:为什么64位xp系统上安装7.3.0的加密锁驱动程序,安装后插上硬件锁,在计算机设备管理器中为黄色的警告信息,无法识别锁硬件?
答:7.3.0的加密锁驱动程序是不支持64位的系统的,可以安装7.4.0的加密锁驱动程序。

问:为什么跟踪层上绘制文本不显示?
答:因为没有设置文本风格sotextstyle。必须要设置文本风格,并且字体的大小要设置合适。如果找不到字体在哪里添加的使用EnsureVisibleGeometry 的方法查看。

问:如何实现提取等值面操作,,具体的接口都有哪些?
答:1.提取等值线等值面的操作在superanalyst控件中实现,必须建立superanalyst和superworkspace的关联 2.提取等值面的操作接口可参考soSurfaceOperator 的IsoRegion 方法。

问:为什么直接打开sit影像文件读取像素值为-1
答:因为直接打开sit影像文件,是只读的方式,只能是浏览数据不能做操作,所以就读取不到像素值。但导入数据源的方式是可以的。

问:为什么新建布局页面之后使用action的方式创建地图中下拉列表中无地图显示?
答:因为布局控件没有连接工作空间控件。

问:请问object6的返回前一视图和后一视图,如何实现?
答:这个没有现成的接口,用soMapBookmarks,就是地图标签 或者记录每一个地图窗口的中心点和地图范围实现。

问:不知道 “在object 6 中 ,SQL Plus引擎支持 Top N 查询” 这句话是什么意思
答:TopN查询意思就是查询满足条件的前N条记录,object 6 SQL Plus引擎支持这种查询。

问:用VS2005打包,在win 2000 server的环境下安装,安装到最后的阶段出现错误,安装不能成功。
答:1、建议您的最终客户升级操作系统。 2、在Win2000Server sp4操作系统上编译生成安装包,再拿去安装。 3、只打包您自己的系统不打包SMO的bin,然后在最终客户的机器上安装SMO runtime .

问:导入CAD的时候不合并图层怎么做?
答:首先按照默认的方式也就是合并图层导入;然后根据标识图层名称的那个字段(一般是“Layer”)进行SQL查询,值相同的就作为一组记录集,并追加到事先创建好的数据集上去;最后将最开始导入生成的那个数据集删除掉。

问:数据是Planet Raster File,如果先导入.b格式的栅格数据,再导入线型数据集,叠在栅格层的上面 ,我如何确定当前某栅格里面是否有线型数据集对象呢
答:首先用这个栅格单元的坐标范围构造一个soGeoRect对象,然后再用这个对象搜索目标线图层,做空间查询。

问:要用SMO开发一个“行政单元数据向网格单元转化”的程序。中间涉及到了一个这样的过程:将U图层的字段Y-ID等于j的所有字段值相加,结果放入Y图层中字段Y- ID等于j对应的P字段中去。不知怎么做。
答:首先用soDatasetVector的Query方法根据条件“Y-ID = j”查询出记录集soRecordset,然后用一个变量Sum存放U字段值的和;然后将Sum赋值给Y图层相应记录的字段即可。

问:要取得soLongArray的元素找不到item属性
答:在C#中是用[ ]来取子项的。

问:配置许可时许可状态显示“early date”
答:若许可状态处显示“early date”,表明当前操作系统的系统时间错误,修改系统时间即可。

问:已有配准点信息,在配准时如何选点
答:在配准地图窗口任意选择点后,对地图窗口底部的坐标信息双击,即可编辑该记录对应的点坐标信息(改变原点坐标及配准后坐标)。

问:如何获取不重复的值
答:1.请使用soDatasetVector类中query2方法;2.设置查询字段,如若查询字段为SmID,soQueryDef.Fields应包含Distinct(SmID);3.设置soQueryDef.HasGeometry 为false。

问:如何合并两个面对象
答:1.使用记录集查询,获得所需两个面对象;2.使用Geometrist.Union方法将两个面对象合并;3.删除记录集中已有记录(两个面对象记录);4.将合并结果对象添加至记录集中;5.刷新地图。

问:在Objects编辑数据,如何在编辑操作后重建空间索引?
答:建议使用BuildSpatialIndex方法创建空间索引。

问:想做Deskpro中的量算角度的功能,没有思路
答:用scaTrackPolyline画折线,并在SuperMap.Tracking事件中,获取到当前鼠标绘制点和上一绘制点的连线的方位角,再根据方位角推算夹角。

问:导入自己做的图标符号,用哪个对象、接口
答:使用soSymbolLib.ImportEx方法

问:想从beijing1954下高斯投影坐标系转回beijing1954,不知用哪个接口
答:获取到数据源的soPJCoordSys对象,设置好GeoCoordSys后,使用Inverse方法进行投影逆变换

问:客户缩放地图不是用Action来做的,而是根据指定比例尺的方式做的,所以不知道怎么样判断当前地图是放大了还是缩小了。有个这样的需求,要将地图缩放的信息输出来。
答:可以获取当前地图视窗的范围,算差值如果变大,则说明地图是缩小了。

问:设置地图缩小到一定程度就不能再缩小,放大到一定程度就不能再放大
答:设置SuperMap.MaxScale 和SuperMap.MinScale 即可

问:在VS里面设置了SuperMap的ContextMenuTrip属性为创建的ContextMenu,但是右键时没有弹出快捷菜单
答:有一个办法: private void axSuperMap1_MouseMoveEvent(object sender, AxSuperMapLib._DSuperMapEvents_MouseMoveEvent e) { if (e.button == 2) { contextMenuStrip1.Show(axSuperMap1, new Point(e.x, e.y)); } } 这样就可以了。

问:如何获取线对象与面对象的交点
答:建议如下操作: 1.从面获得点串,构线对象; 2.通过soGeoLine.Intersect求原线对象与新构造的线对象的交点;

问:soGeoLineM 可否获取组成的线段数
答:对于一条简单折线而言,只有一个子线,该子线是由多个节点构成,节点串可通过GetPartAt(1)获得;若为复杂折线,可以通过Partcount得知有多少条子线对象。

问:专题图中过滤表达式如何设置
答:过滤表达式与SQL语句中where子句一致,不同数据库,语法可能稍有差别。

问:如何在组件中使用桌面制作好的符号
答:在桌面的符号面板中获取符号的编码,程序中设置符号ID即可,需保证当前打开的工作空间包含的符号库正确。

问:调用soGeoRegion Erase方法返回结果为true,但面对像并没有被擦除。
答:在几何对象被修改后,需修改记录集中相应记录,即需要如下操作:1.记录集移至几何对象所在位置(一般为当前位置,即取几何对象位置);2.soRecordset.Edit;3.soRecordset.SetGeometry;4.soRecordset.Update;

问:如何将点数据集的坐标信息及属性信息均输出至MDB文件中
答:可如下操作: 1.新建两个字段,分别代表X坐标及Y坐标; 2.选择字段所在列——在右键菜单中选择更新列——选择运算方式为函数运算——函数为ObjCenterX(Y坐标为ObjCenterY); 3.将属性表保存为属性表数据集; 4.将属性表数据集导出为MDB文件。

问:如何屏蔽图例控件中右键菜单
答:可通过设置图例控件属性PopupMenu=false实现。

问:标签专题图中数值字段与字符字段如何同时显示
答:对于不同类型数据源,数值转字符函数均不一样,以SDB数据源为例,若希望实现标签专题图中标签为SmID+“-”+某一文本字段,可采用如下表达式:str(Dataset.SmID)+Chr(45)+ Dataset.txtFld(txtFld代表文本字段名称),若需实现换行等其它功能只需修改Chr中ASCII码。SQL数据源对应表达式为:Str( Dataset.SmID) + Char(45) + Dataset.txtFld;Oracle数据源对应表达式为:str(Dataset.SmID)+Chr(45)+ Dataset.txtFld

问:如何绘制圆环对象
答:对点对象创建不同半径的两个缓冲区面对象,通过半径较大的面对象中soGeoRegion.Erase方法擦除半径较小的面对象即可。

问:同一区域数据不能叠加显示
答:此问题在于,不同数据虽然属同一区域,但很有可能坐标系不一致,以致数据坐标不一致无法叠加显示。请以其中一份数据(数据坐标正确)为参考图层,去配准其它数据。

问:如何通过代码创建影像金字塔
答:可通过soDataSource中CreateRaster方法创建影像或栅格数据集,影像数据集赋值可通过soDatasetRaster中Pixel属性赋值,栅格数据集可通过soDatasetRaster中Value属性赋值。

问:如何根据点数据模拟业务上曲面现象
答:可通过点数据集中业务数值字段插值得到栅格数据,在地图中通过选择颜色渐变的色带制作单值或分段栅格专题图即可。

问:如何实现电子地图网站上Tooltip功能
答:可参考Objects范例程序库中Track_Attribute范例。

问:不同机器地图显示效果不一样
答:地图显示和机器分辨率有一定关系。若需取消地图与机器分辨率的关联,可在Deskpro安装目录——Bin文件夹——supermap.ini文件中设置CustomMapRatioEnable为true,配图机器及最终显示地图的机器均需配置。

问:求经纬度坐标系线的长度
答:用soGeometrist. Geodesicdistance()方法

问:数据的坐标系是高斯投影的,现在状态栏中显示出的坐标值前面是多少米,后面是多少度,像Deskpro那样。
答:用Inverse方法转换每一个鼠标点击的点到经纬坐标,再显示出来。

问:在SuperMap控件上拉一个框,不知怎么获取这个框的范围
答:可以在Tracked事件里触发然后用TrackedGeometry属性获取这个geometry,然后用Bounds获取范围

问:改变统计图类型时,下面的示图也会变,怎么做?类似Deskpro中的那种
答:用PictureBox放置图片,响应ComboBox的选择事件相应让PictureBox显示就可以了。

问:如何根据指定范围生成100100的规则排列的面数据集
答:可如下操作:比如,指定范围对应的上下左右坐标分别是100,0,0,100,如果要画100
100个面对象,可以通过两个循环实现(两个方向分别是水平和竖直),第一个面对象坐标集为{(0,0)(0,1)(1,1)(1,0)(0,0)},水平方向第二个面对象即第一个面对象点集X坐标+1。

问:不知道用PixelToMap X/ Y 方法转换后点的坐标单位是什么?
答:转换后的坐标单位就是地图坐标单位,和当前地图的坐标系单位一致。

问:Set objRouteLine = SuperAnalyst1.NetworkAnalyst.ClosestFacility(objEventPt, objFacilityP, objFacilityP.Count, True, 1000)。objRouteLine.Length 返回的是一条路由的长度?还是所有路由总长?
答:这个ClosestFacility方法返回的是最优的结果路由的长度。并建议使用ClosestFacilityEx方法。

问:如何通过代码清空当前地图的选择集
答:若通过代码清空当前地图选择集,请使用soSelection.RemoveAll清空方法,并刷新地图。

问:查询得到的多个点对象如何居中显示
答:可使用SuperMap.EnsureVisibleRecordset将查询得到的记录集居中显示,此外,还可参考EnsureVisibleRect及EnsureVisibleGeometry(此方法对单个点对象无效)方法。

问:多次执行追加记录集操作后提示内存读取错误
答:若在循环内执行记录集追加操作,请在循环定义记录集,使用完毕后及时释放。

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

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

问:动态地读取xml文件并加载地图,为什么专题图名称为中文的变成了???。
答:写法不对,应该用这个StreamReader objRead = new StreamReader(strPath,Encoding.GetEncoding(“gb2312”));

问:在保存影像数据集里,如何计算所需占用的磁盘空间?
答:范围除以分辩率得到行列数,再用行数列数8估算出所需占用的磁盘空间

问:做了像deskpro那样的很多标签页,为什么重复多次关闭地图窗口时失败
答:要注意每次关闭标签页时supermap控件都要dispose

问:如何让同时多台机器的地图一起联动刷新
答:BeforMapDraw获得的地图范围是地图刷新地图之前的bound,因此联动必须在AfterMapDraw里获得。

问:有十个站点 每个站点有相应的风向和风速数据 然后想在十个站位上用带箭头的线表示出来方向和大小,用什么方法?
答:用自定义专题图,设置符号的样式,大小,和角度,这些值都是要放到这个点数据集的属性字段里的。

问:如何把跟踪层上的对象写入数据集中?
答:【1】获取跟踪层上的对象;
【2】通过soDatasetVector获取数据集的记录集;
【3】通过soRecordset.AddNew添加对象到数据集中;
【4】通过soRecordset.Update更新记录集,即可。

问:如何使窗口最大化的时候,让超图的控件也能最大化?
答:修改SuperMap控件的Dock属性为Fill即可。

问:如何把一个点添加到地图上,并当鼠标移动到该点时显示该点的一些属性信息。
答:【1】构造一个soGeoPoint点,添加到数据集中;
【2】通过soLayer.HitTestEx方法,获取鼠标是否选中该点,如果选中则返回选择集;
【3】通过soSelection.ToRecordset方法,把选择集转换成该点对应的记录集;
【4】取出并显示该点的信息。

问:如何批量修改某个字段的值?
答:通过soRecordset.UpdateFieldEx批量修改属性,就可以了。

问:64位的Windows 7上用Objects开发的程序,不能正常运行,为什么?
答:SuperMap的程序只能以32位环境运行,如果是64位机器VS的编译环境默认是AnyCPU,也就是64位环境,必须设置VS的编译环境为win32,也就是X86,这样就可以了。

问:如何输出地图为图片,增加地图浏览速度?
答:通过Deskpro输出地图缓存的方式输出地图为图片,直接打开地图缓存的*.SCI文件浏览地图,可以加快地图浏览。

问:如何用代码控制移动地图?
答:通过SuperMap控件的Pan、Pan2方法控制,输入移动增量,刷新地图就可以移动地图。

问:正常配置加密锁,运行程序中的三维操作或者创建拓扑部分,程序报错:应用程序内部错误。
答:可能因为单机锁中没有SuperTopo和Super3D控件,要查看加密锁的问题。

问:如何获取绘制对象的面积,数据是经纬度,面积是弧度的,如何转换成平方公里?
答:【1】把面对象添加到数据集中,设置数据集为经纬度坐标系,,距离单位为米,然后读取记录集的smArea字段值; 【2】对对象进行投影转换,然后获取soGeoRegion的Area字段的值。

问:如何定义了时间字段,如何把日期值付给字段;
答:【1】在Deskpro或者Objects中新建一个字段,字段类型选为日期型; 【2】在VC中获取时间值,转换为COleVaraint类型,通过SetFieldValue的方法付给数据集的相应字段。

问:如何平移对象,如何把线对象平移?
答:通过几何对象的offset方法,设置对象平移的增量,平移对象。

问:如何计算经纬度坐标系下两点间的距离
答:使用soGeometrist对象的Geodesicdistance方法实现

问:怎么判断点在不在线上?
答:soGeometrist. IsPointOnLine 这个方法

问:要将Objects一起打包到应用系统中,不知该打包哪些支持文件
答:一个类是Objects运行库的支持文件和所有的ocx, 一类是MFC的文件三个,再有一类就是影像插件引擎文件spi。

问:图层编辑被锁定了,用Editable设置后,还是不能编辑
答:首先用EditingLocked解除编辑锁定,然后再用Editable设置为可编辑,一般就可以编辑了。

问:soRecordset 怎么清空所有record
答:可以使用DeleteAll 方法

问:修改等值面的某一字段值,不知怎么修改
答:用UpdateField方法即可

问:Objects打开图的效果和配置时不一样。可以用Deskpro配置好地图后保存工作空间,然后用Objects打开工作空间打开地图,发现地图效果和Deskpro里不同,有些标签没显示出来
答:如果用的Deskpro6.0配置的地图,然后保存为5.x格式,再用Objects打开看的。这种方式导致了上面的情况。建议尽量不要用这种方式,如果使用的Objects5.3,那么建议Deskpro用5.3版本。

问:value和pixel的区别
答:对于image数据,取pixel的值是颜色值,value是grid或dem栅格所代表的值

问:如何使专题图实时的刷新吗?因为 摄像头可能现在是关闭的,五分钟之后开启了,这时地图上的点就要变颜色。
答:把数据存储到数据库中,然后实时修改摄像头状态的字段的值,就可以实现实时表达摄像头状态。

问:一个点数据集,它标识着所有监控点的摄像头. 摄像头可能有打开的,也有关闭的,如何用不同颜色区分?
答:用单值专题图实现,关闭和打开用两种不同颜色或者不同的符号标识,在数据集中设置代表摄像头状态的字段。

问:有两台机器,一台分辨率低,一台分辨很高,两台机器操作同一幅地图,如何让操作同步?
答:记录低分辨率的地图的中心点和ViewBounds,传给高分辨率的机器,操作低分辨率机器让高分辨率的机器也操作。

问:把SDB里面的数据集导入到Sql Server2005 中失败,报错:程序内部错误。
答:1、可以新建数据集 ?可以的话说明SDB中的数据集有问题,不可以的话,进入步骤2;
2、新建一个SQL库,可以导入?如果可以证明原来的数据源有问题,不可以证明SQL Server服务有问题 。进入步骤3;
3、在安装数据库后,是否修改过计算机的名称,如果修改过,希望改回计算机名,或者重新创建数据库实例。

问:在地图上,如何量算距离?
答:【1】用SuperMap1.Action = seAction.scaTrackPolyline在跟踪层上画线;
【2】用SuperMap1_Tracking事件获取绘制的线的长度。

问:如何删除数据源中的空数据集。删除时出错:“未将对象引用设置到对象的实例” 。
答:引用的变量已经释放或者变量本来就是空引用,可以调试程序查看数据源、数据集等变量是否为空,是否释放变量,关闭记录集。

问:如何修改地图中选中点的坐标
答:首先通过soSelection.ToRecordset把选择集转成记录集,然后通过soRecordset.GetGeometry获取几何对象,并转换成soGeoPoint对象,修改sogeopoint对象的XY属性 然后设置记录集锁定,soRecordset.Edit ,然后t通过soRecordset.SetGeometry修改记录集的对象,然后通过soRecordset.Update更新记录集即可 。

问:把1个图层的专题图导出为xml文件,但图层通过gridtheme.FromXML(‘D:\3Tire\3Tire\ThemeRange.xml’)导入图层模板,没有生成专题图。
答:必须把XML文件转换成字符串,在传给FromXML方法,才能生成专题图。

问:如何新建和已有栅格数据集一样的数据集
答:利用原有的栅格数据集复制一个副本,soDataSource.CreateRasterFrom可以实现。

问:如何修改栅格数据集的栅格值
答:通过soDatasetRaster的Value属性修改栅格数据集的值,set_Value(Row,Col,dValue).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值