移动 嵌入式 GIS - 享受 移动 GIS(2) 用C#在手机上编辑电子地图
引言:本文是《享受移动GIS(1) 用C#建立手机上的电子地图程序》的后续。本文将介绍如何使用C#基于HiMap控件在手机上编辑ESRI的.shp地图文件。
本文相关下载:代码 myHiMapAdvanced.zip ,地图文件 maps.zip ,演示动画 myHiMapVideo2.gif。
一、系统需求:
开发环境:Windows XP, .NET Compact Framework 2.0, Windows Mobile 5 SDK, HiMap Beta1 runtime
运行环境:DOPOD D600手机(Windows Mobile 5.0)
二、程序功能列表:
1、绘制几何图形----Draw Geometry
2、编辑几何图形----Edit Geometry
3、删除几何图形----Delete Geometry
4、设置几何图形属性----Edit Property
三、实现方法简介
首先,简要介绍实现这些功能的基本方法。具体函数说明请参考《HiMap帮助》。
//1.新建要素
//取得一个图层
IFeatureLayer lyr = (IFeatureLayer)mapControl1.Map.GetLayer(0);
//取得一个元数据
IFeatureClass cls = (IFeatureClass)lyr.Class;
//建立一个要素
IFeature feat = cls.CreateFeature();
//保存要素的修改
feat.Save();
//2.删除一个要素
//取得一个图层
IFeatureLayer lyr = (IFeatureLayer)mapControl1.Map.GetLayer(0);
//取得一个元数据
IFeatureClass cls = (IFeatureClass)lyr.Class;
//建立一个过滤器
IQueryFilter qf=new QueryFilterClass();
//设置条件
qf.WhereClause="id =1";
//查询数据
IFeatureCursor cur = cls.Search(qf);
//取得一个要素
IFeature feat = cur.Next();
//删除一个要素
if (feat != null)
{
cls.DeleteFeature(feat);
}
//3.修改要素的属性值
//取得一个图层
IFeatureLayer lyr = (IFeatureLayer)mapControl1.Map.GetLayer(0);
//取得一个元数据
IFeatureClass cls = (IFeatureClass)lyr.Class;
//建立一个过滤器
IQueryFilter qf=new QueryFilterClass();
//设置条件
qf.WhereClause="id =1";
//查询数据
IFeatureCursor cur = cls.Search(qf);
//取得一个要素
IFeature feat = cur.Next();
if (feat != null)
{
//写入值
feat.SetValue(cls.Fields.FindField("name"), "测试数据");
//保存
feat.Save();
}
//4.修改要素的几何图形
//取得一个图层
IFeatureLayer lyr = (IFeatureLayer)mapControl1.Map.GetLayer(0);
//取得一个元数据
IFeatureClass cls = (IFeatureClass)lyr.Class;
//建立一个过滤器
IQueryFilter qf=new QueryFilterClass();
//设置条件
qf.WhereClause="id =1";
//查询数据
IFeatureCursor cur = cls.Search(qf);
//取得一个要素
IFeature feat = cur.Next();
if (feat != null)
{
//图层为线形Shape,所以使用IPolyline取得图形
HiMap.Geometry.IPolyline line = (HiMap.Geometry.IPolyline)feat.Shape;
IPointCollection chline = (IPointCollection)line;
//建立点(测试数据)
IPoint pt1 = new PointClass();
pt1.X = "111.2345556";
pt1.Y = "23.2345556";
IPoint pt2 = new PointClass();
pt2.X = "112.2345556";
pt2.Y = "23.3345556";
//添加点到线中
chline.AddPoint(pt1);
chline.AddPoint(pt2);
//将修改后的图形赋给要素
feat.Shape = (IGeometry)line;
//保存
feat.Save();
}
//5.为线或面添加新的部分
//取得一个图层
IFeatureLayer lyr = (IFeatureLayer)mapControl1.Map.GetLayer(0);
//取得一个元数据
IFeatureClass cls = (IFeatureClass)lyr.Class;
//建立一个过滤器
IQueryFilter qf=new QueryFilterClass();
//设置条件
qf.WhereClause="id =1";
//查询数据
IFeatureCursor cur = cls.Search(qf);
//取得一个要素
IFeature feat = cur.Next();
if (feat != null)
{
//图层为线形Shape,所以使用IPolyline取得图形
HiMap.Geometry.IPolyline line = (HiMap.Geometry.IPolyline)feat.Shape;
//建立一条新的线
IPointCollection chline = new PolylineClass();
//建立点(测试数据)
IPoint pt1 = new PointClass();
pt1.X = "111.2345556";
pt1.Y = "23.2345556";
IPoint pt2 = new PointClass();
pt2.X = "112.2345556";
pt2.Y = "23.3345556";
//添加点到线中
chline.AddPoint(pt1);
chline.AddPoint(pt2);
HiMap.Geometry.IGeometryCollection geoColl = (HiMap.Geometry.IGeometryCollection)line;
//将新的线添加到原有的线中
geoColl.AddGeometry((IGeometry)chline);
//将修改后的图形赋给要素
feat.Shape = (IGeometry)line;
//保存
feat.Save();
}
四、示例程序运行动画
下载演示动画myHiMapVideo2.gif
下载示例程序myHiMapAdvanced.zip