您好,欢迎访问三七文档
GIS设计与开发实验2一、程序运行时截图:界面设计:二、设计思路三、具体步骤1.首先建立SuperMap控件之间的连接:privatevoidConnectSuperMap(){objectobjWshandle_ear=this.axSuperWorkspace1.CtlHandle;this.axSuperMap1.Connect(objWshandle_ear);this.axSuperWkspManager1.Connect(objWshandle_ear);}2.打开一个数据集//定义它的位置stringpath=C:\\Users\\Daniel\\Documents\\VisualStudio2010\\Projects\\GISSuperMap开发\\Gis开发空间数据管理(3)\\Data\\World.sdb;//定义他的别名//这里使用了subString()和IndexOf()方法来获取文件的全名//然后调用System.IO.Path中的GetFileNameWithoutExtension()方法去掉后缀。StringstrDsName=path;StringstrAlias=Path.GetFileNameWithoutExtension(path.Substring(path.LastIndexOf(\\)+1));3.获取数据集集合soDatasetsdatasets=objDs.Datasets;//可以通过访问datasets[i].Name来得到每个数据集的名字。同时,我们还可以调用操作符重载datasets[Capital]来访问数据集集合中的某数据集。通过访问ds.Type等等属性,即可获得该数据集的类型,或其它属性。4.建立自己的数据集soDatasetMyds=objDs.CreateDataset(Myds,seDatasetType.scdRasterCollection,seDatasetOption.scoDefault);其中objDS是DataSource(数据源)对象。这里实现了直接从数据源到数据集的转换。4.数据集之间的继承关系soDatasetRasterdatasetR=(soDatasetRaster)Myds;//soDatasetRasterdatasetR2=(soDatasetRaster)ds;intwidth=datasetR.PixelWidth;这里的Myds本来是dataset对象,但是soDatasetRaster继承于DataSet是他的子类,我们采用了向下转型,使得datasetR对象具有了栅格数据特有的PixelWidth属性。5.新建数据源stringpath=C:\\Users\\Daniel\\Documents\\VisualStudio2010\\Projects\\GISSuperMap开发\\Gis开发空间数据管理(3)\\Data\\XXX.sdb;soDataSourceobjDs=this.axSuperWorkspace1.CreateDataSource(path,XXX,seEngineType.sceSDBPlus,false,false,false,);在这里我们建立了一个名字为XXX的SDBPlus数据源。6.新建一个字段//首先获得数据集soDatasetds=datasets[World_Attri];//向下转型为soDatasetVector类型soDatasetVectorvector=(soDatasetVector)ds;//新建一个字段soFieldInfofinfo=newsoFieldInfoClass();//然后设置字段的一些属性finfo.Name=TTT;finfo.Type=seFieldType.scfInteger;//在创建之前必须先清空记录集。vector.ClearRecordsets();//最后插入并且判断插入是否成功。boolOK=vector.CreateField(finfo);if(OK)MessageBox.Show(OK);在此处特别注意一点,com对象是在打包时自动进行封装的,创建一个字段的时候我们可以先创建一个soFieldInfoClass()的实例,然后将其转换为soFieldInfo接口类型的变量。7.找出所有字段名,找出字段中的每一行具体的值soDatasetVectorvector=(soDatasetVector)ds;for(inti=1;i=vector.FieldCount;i++){textBox3.Text+=vector.GetFieldInfo(i).Name.ToString();//textBox4.Text+=vector.GetFieldInfos();textBox3.Text+=\r\n;}vector.Open();soStringsobjOutputFields=newsoStringsClass();objOutputFields.Add(Continent);soRecordsetrs=vector.Query(,false,objOutputFields);axSuperGridView1.Connect(rs);axSuperGridView1.Update();我们有两种方法去找到字段方法一:可以通过上面代码中的vector.GetFieldInfo()方法传入不同的索引值获取字段名。方法二:intaa=rs.FieldCount;soFieldInfosfinfo=vector.GetFieldInfos();在这里,finfo包含了所有的finfo.Size=30个字段。可以通过finfo[i].name访问各个字段的名字。接着就要访问某个字段下面的具体的值:这里我参考了SupMap在线文档的索引,soDatasetVector类中有一个Query方法。soRecordsetsoDatasetVector.Query(strSQLFilterAsString,bHasGeometryAsBoolean,[objFieldsAssoStrings],[strOptionsAsString])参数可选类型描述strSQLFilter必选String查询条件,相当于SQL语句中的Where子句。bHasGeometry必选Boolean是否查询空间数据。True,表示要取空间数据;False,表示不取空间数据;若查询时不取空间数据,即只查询属性信息,则在返回的Recordset中,凡是对记录集的空间对象进行操作的方法,都将无效,例如,调用soRecordset.GetGeometry将返回空、SuperMap.EnsureVisibleRecordset无效等。[objFields]可选soStrings可选参数,字段列表。缺省时,查询结果包括全部字段。否则,只有列表中列出的字段,内容相当于SQL语句中的查询字段部分,如SELECTfield1,field2FROMdt1WHERESmID10,该语句中的field1和field2都属于查询字段,可以用as设置别名详见本页示例部分。[strOptions]可选String查询选项。如查询出的结果(1)是否按某一字段排序(OrderBy),默认为升序,如需按降序排列,格式为OrderBy*desc,其中*代表某一字段名;(2)是否按某一字段分组(GroupBy)等。对于SDB或者SDBPlus引擎而言,当bHasGeometry为True时,本参数无效。将示例代码:PrivateSubsqlquery_Click()DimobjdtvAssoDatasetVectorDimobjRsAssoRecordsetDimobjOutputFieldsAsNewsoStringsSetobjdtv=SuperMap1.Layers(1).DatasetobjOutputFields.AddzcodeobjOutputFields.Addcount(*)ascountobjOutputFields.Addsum(population)assumpopSetobjRs=objdtv.Query(,False,objOutputFields,groupbyzcodeorderbysum(population))SuperGridView1.ConnectobjRsSuperGridView1.UpdateSetobjdtv=NothingSetobjRs=NothingSetobjOutputFields=NothingEndSub改成C#形式,就可以在界面上以GridView形式显示出这个字段中的值了。我的程序中是以Continent“字段为例的。四、总结与感悟在第三章,我学到了如何用SuperMapObjects进行空间数据管理。我自己通过SuperWorkspace.CreateDataSource()创建一个名为XXX的数据源,在该数据源下通过soDataSource.CreateDataset()创建了一个名为Myds的点数据集,并为将其转换为了soDatasetRaster类型。访问了起PixelWidth字段。我还练习了在数据集中利用soDatasetVector.CreateField()方法创建了一个字段。最重要的是通过soDatasetVector.GetFieldInfo()方法读取出了字段的值。并且通过soDatasetVector.Query()方法查询出了该字段的所有数据。
本文标题:GIS开发第三章
链接地址:https://www.777doc.com/doc-2132636 .html