GIS高级开发
【以我做的gis系统GIS_socialPolice为例,讲解是如何实现一个互动操作的,因为,当你了解了如何与地图实现互动,你就掌握了地图的应用原理】
首先,我们想对地图上的数据元进行操作,就必须知道它的位置,而位置无非是通过经纬度坐标来定位的,那么,如何获取经纬度就成了关键点了。
我已经跟你说了咱们是如何通过mapInfo7。0来提取坐标了【即在地图上插入一个图元,标示其经纬度】,那么,在mapInfo建立每个图层时,他就相应的给我们创建了一个来描述这个图层的图层信息表,在咱们操作地图的时候,大部分时间就是对这个底层的信息表来操作的,说白了,GIS在很大程度上也是一种对数据库的操作,这个需要你学的时间久了以后,自己慢慢领会。
这样,咱们知道了GIS的操作基本原理以后,具体介绍一下,他的一个实现过程。
1、首先,添加一个触发图标,以提供给用户来操作地图,我们以坐标信息查询为例,这个最为典型,我们来实现一个按人员姓名来查询信息,查询出该人员以后,然后将其定位在地图上【其它的操作以此类推,基本原理都是在这个获得坐标信息的基础上,来操作地图的】
2、不妨添加一个按钮,其值设为“查询”,添加一个文本框,提供用户输入所需要查询的信息。
3、在安装MapInfo的路径下有一个MapInfo数据帮助文档,叫“程序员参考手册”,这里提供了一系列对象供我们来操作数据。
4、在这里,我们用到了SearchInfo对象,他是定义在MapInfo。Data命名空间下的对象,我们这样来声明这个对象
SearchInfo si=MapInfo.Data.SearchInfoFactory.SearchWhere(strWhere);//strWhere为我们查询的条件在这里我们需要查询某个人名,所以strWhere=“name like '%'"+strName+"%'"。
5、通过SearchInfo对象,我们可以获取地图信息表中的查询对象的实体,我们将其放倒一个IResultSetFeatureCollection对象中。
这个对象使用来盛放搜索的结果的,这个对象也是定义在MapInfo。Data命名空间下面的。我们这么声明对象,并且把查询的
数据放倒这个对象中。
IResultSetFeatureCollection ifs =MapInfo.Engine.Session.Current.Catalog.Search(mapTable, si);
//mapTable:表示,你是对那个表进行操作的,我们这个表就是通过mapinfo来创建的。
//si则是,我们步骤4中创建的对象。
6、首先,判断一下这个结果集ifs中是否有元素,ifs。count>0,如果否,则返回空。
7、下面我们来实现如何定位到地图上,首先,将目前地图的选择状态先清空一下,来显示当前刚做的操作。清空状态是这样实现的:MapInfo.Engine.Session.Current.Selections.DefaultSelection.Clear();
8、我们把刚才的结果集放到MapInfo提供的Session中:
MapInfo.Engine.Session.Current.Selections.DefaultSelection。Add(ifs);
9、下面开始查询:我一句一句解释:
//MIConnection:就像我们C#中的连接字符串
MIConnection connection = new MIConnection();
//MICommand像我们C#中的Command对象。
MICommand command =connection.CreateCommand();
//给Command的CommandText赋值
command.CommandText = "Selectjd,wd From " + mapTable + " Where name like '" + paramInfo+ "'";
connection.Open();
//创建一个数据集,以盛放我们的结果。
MIDataReader reader =command.ExecuteReader();
double[] outInfo = new double[2];
if (reader.Read())
{
outInfo[0] =Convert.ToDouble(reader.GetValue(0));
outInfo[1] =Convert.ToDouble(reader.GetValue(1));
}
//不要忘了释放资源。
reader.Close();
command.Dispose();
connection.Close();
//这里,我们返回一个数组
return outInfo;
10、我们第一个数组,来盛放上一步返回的结果:
double[] sitexy=outInfo;
11、我们要想把数据定位到地图上,无非是获得我们想看的信息的经纬度坐标,然后,把这个信息元移动到地图的中心点,这样也方便用户查看。
具体操作是这样的。
setCenter(sitexy[0],sitexy[1],0.17);//这个setCenter()函数的功能就是实现了地图的中心点移动。
//解释一下参数 的意义:sitexy[0]:表示经度,sitexy[1]:表示纬度,而0。17则表示我们当前把地图放大的倍数。
12:这个函数的实现如下:
private void setCenter(double x,double y,double level)
{
myMap.Center = new DPoint(x, y);
myMap.Size = newSystem.Drawing.Size((int)this.MainMap.Width.Value,(int)this.MainMap.Height.Value);//用指定宽度,高度初始化新的示例
MapInfo.Geometry.Distance d = newMapInfo.Geometry.Distance(level, myMap.Zoom.Unit);//有效距离类型 距离可以是球面坐标距离或笛卡儿坐标距离。
myMap.Zoom = d;
}
//myMap:MapInfo.Mapping.Map myMap,获得正执行线程上的当前 ISession 实例
上面12个步骤就是我们一个完整的地图查询信息的过程!