gis开发.docx
- 文档编号:11484287
- 上传时间:2023-03-01
- 格式:DOCX
- 页数:14
- 大小:325.28KB
gis开发.docx
《gis开发.docx》由会员分享,可在线阅读,更多相关《gis开发.docx(14页珍藏版)》请在冰豆网上搜索。
gis开发
SuperMapObject组件式开发
项目名称:
MySuperMap
Part2
实验2:
查询功能的实现
实验目标:
1.实现属性查询的相关功能
2.实现空间查询的相关功能
实验要求:
1.按项目来(按主要控件的属性,事件,方法列表说明)
2.界面设计
3.关键代码注释
4.总结与调试
使用到的GIS控件
SuperMap控件
SuperWorkspace控件
SuperLegend控件
SuperWorkspaceManger控件
字段与方法列表
界面设计
局部界面显示
主要控件
主要属性、事件、方法和用途
按钮button
Text=”打开工作空间”,单击事件,触发打开对话框
ListBox
Panel
textBox
ListBox1.Items.Add(),列出资源
承载部分控件
输入sql代码
openFileDialog1
openFileDialog1.ShowDialog();
SuperWorkspace1
SuperWorkspace1.open(),打开工作空间文件SuperWorkspace.datasources,获得sodatasources对象
SuperMap1
SuperMap1.Layers.AddDataset(),添加数据集到地图图层集合中;SuperMap1.Refresh(),刷新地图窗口
1.属性查询功能
遇到的问题与解决方案
/===============================================================================失败方案一
//if(Button1_Click<=a)//本来想实现不同图层,同名id更替显示,技术有限暂且搁置
//{
//objLayer=objLys[Button1_Click];//?
//if(objLys==null)
//{
//Button1_Click++;
//return;
//}
由于发现有不同的图层的属性ID存在相同,查询返回的只会是最后一个图层的值,所以我现在用listBox控件来选择我要查询的图层,也用过复选框,遇到与失败方案一一样的问题,最后还是选择listbox比较方便。
问题2
本来想在在另一个页面实现属性查图,实现窗体间调用,可是没能领会窗体调用的技巧。
解决方案
panel2.Show()
…………代码……..
catch
{
MessageBox.Show("你输入的信息有误");
panel2.Hide();
}
panel2.Hide();
利用panel控件与隐藏方法实现类似的效果。
属性查询核心代码&错误与修正记录
:
privatevoidbutton1_Click(objectsender,EventArgse)
{
try
{
soDatasetVectorobjDtv=null;//矢量数据集变量,datasetvector
soRecordsetobjRd=null;//属性数据集变量,sorecordset
soSelectionobjSelection=null;//选择集变量,soselection
soLayerobjLayer=null;
soLayersobjLys=null;
stringstrQueryTxt;
strQueryTxt=textBox1.Text;
//objlys=axSuperMap1.Layers;
//inta=objlys.Count;
//longi=objlys.Count;
//inti=1;
//while(i<=a)
//{
objLys=axSuperMap1.Layers;
//==============================================第一次修正
//inta=objLys.Count;//统计图层数
//if(i<=a)
//{
//{
//listBox2.Items.Add(objLys[i].Caption);
//checkedListBox1.Items.Add(objLys[i].Caption);
//checkedListBox1.Hide();
//i++;
//}
objLayer=objLys[listBox2.Text];
//===============================================================================失败方案一
//if(Button1_Click<=a)//本来想实现不同图层,同名id更替显示,技术有限暂且搁置
//{
//objLayer=objLys[Button1_Click];//?
//if(objLys==null)
//{
//Button1_Click++;
//return;
//}
objDtv=(SuperMapLib.soDatasetVector)objLayer.Dataset;//转成矢量数据集
//查询,Query
objRd=objDtv.Query(strQueryTxt,true,null,"");//查询的核心方法
objSelection=axSuperMap1.selection;
objSelection.FromRecordset(objRd);//转成选择集高亮显示
Button1_Click=Button1_Click++;
axSuperMap1.Refresh();
Marshal.ReleaseComObject(objLys);
objLys=null;
Marshal.ReleaseComObject(objLayer);
objLayer=null;
//Marshal.ReleaseComObject(objRd);
//objRd=null;
Marshal.ReleaseComObject(objDtv);
objDtv=null;
Marshal.ReleaseComObject(objSelection);
objSelection=null;
axSuperMap1.Refresh();
return;
catch
{
MessageBox.Show("你输入的信息有误");
}
}
结果展示
2.空间查询
遇到的问题与解决方案
问题1:
在查询过程中,你选择的查询对象可能在一些图层出现空值的情况,程序就会出错。
解决方案:
利用循环结构预先判断图层是否有相应要素,没有的自动跳过。
if(i<=a)//逐层查找被选择的图层
{
objLayer=objLayers[i];
if(objLayer==null)
{
i++;
return;
}
//soLayerobjLayer
问题2:
其他功能太多,一个个实现感觉太烦琐;
解决方案:
使用switch实现搜索优化:
switch(Convert.ToInt32(textBox2.Text))
{
case0:
objRecordsetR=objDatasetVectorR.QueryEx(objGeo,seSpatialQueryMode.scsExtentOverlap,"");
break;
case1:
objRecordsetR=objDatasetVectorR.QueryEx(objGeo,seSpatialQueryMode.scsCommonPoint,"");
break;
case2:
objRecordsetR=objDatasetVectorR.QueryEx(objGeo,seSpatialQueryMode.scsLineCross,"");
break;
case3:
objRecordsetR=objDatasetVectorR.QueryEx(objGeo,seSpatialQueryMode.scsCommonLine,"");
break;
case4:
objRecordsetR=objDatasetVectorR.QueryEx(objGeo,seSpatialQueryMode.scsCommonPointOrLineCross,"");
break;
case5:
objRecordsetR=objDatasetVectorR.QueryEx(objGeo,seSpatialQueryMode.scsEdgeTouchOrAreaIntersect,"");
break;
//由于时间原因省略
结果展示
功能实现之后,发现其实如果把文字添加事件,选择的体验会更好!
空间查询核心代码&错误与修正记录
publicvoidaxSuperWkspManager1_LClick(objectsender,AxSuperWkspManagerLib._DSuperWkspManagerEvents_LClickEvente)//打开数据集
{
switch(e.nFlag)
{
caseSuperMapLib.seSelectedItemFlag.scsDataset:
{
soDataSourcesobjDss=this.axSuperWorkspace1.Datasources;
soDataSourceobjDs=objDss[e.strParent];
soDatasetsobjDts=objDs.Datasets;
soDatasetobjDt=objDts[e.strSelected];
soLayersobjLys=axSuperMap1.Layers;
soLayerobjLy=objLys.AddDataset(objDt,true);
this.axSuperMap1.ViewEntire();
inta=objLys.Count;//统计图层数
inti=1;
while(i<=a)
{
listBox1.Items.Add(objLys[i].Caption);//把图层名字返回到listbox
listBox2.Items.Add(objLys[i].Caption);
checkedListBox1.Items.Add(objLys[i].Caption);
checkedListBox1.Hide();
i++;
}
axSuperMap1.Refresh();
axSuperLegend1.Refresh();
break;
privatevoid线要素查询ToolStripMenuItem_Click(objectsender,EventArgse)
{
try
{
soLayersobjLayers=axSuperMap1.Layers;
soLayerobjLayer;
inti=1;
inta=objLayers.Count;
if(i<=a)//逐层查找被选择的图层
{
objLayer=objLayers[i];
if(objLayer==null)
{
i++;
return;
}
//soLayerobjLayer=objLayers[1];//先测试以后改
soDatasetobjDataset=objLayer.Dataset;
soDatasetVectorobjDatasetVector=(soDatasetVector)objDataset;
soRecordsetobjRecordset=axSuperMap1.selection.ToRecordset(true);
soGeometryobjGeo=objRecordset.GetGeometry();
soLayerobjLayerR=objLayers[listBox1.SelectedItem];//用listbox选择图层
soDatasetobjDatasetR=objLayerR.Dataset;
soDatasetVectorobjDatasetVectorR=(soDatasetVector)objDatasetR;
soRecordsetobjRecordsetR=objDatasetVectorR.QueryEx(objGeo,seSpatialQueryMode.scsLineCross,"");//其实是线要素,以后要修改
if(objRecordsetR!
=null)
{
soSelectionobjSel=axSuperMap1.selection;
objSel.FromRecordset(objRecordsetR);
}
axSuperMap1.ViewEntire();
axSuperMap1.Refresh();
}
}
catch
{
MessageBox.Show("你的查询有误,请确定已选择查询图层");
结果展示:
空间查询功能之相邻查询
实验总结:
这是我们的第二次本课程的实现,慢慢的感觉就开始上来了,使用课本的事件也慢慢变得小了,遇到最大的瓶颈就是GIS的专业知识了,不过这个一时半刻也很难改变得了,不过我想,就像老师说的那样,现在技术都不是难题了,所以怎么把自己写的程序用到生活上,是我们接下来该思考更多我是这样认为的。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- gis 开发
![提示](https://static.bdocx.com/images/bang_tan.gif)