入门

Navigation: »No topics above this level«

第一个应用程序

 Return to chapter overview

教你一步一步建立自己的HiMap应用。


部署HiMap运行时

Navigation: 入门 >

部署HiMap运行时

 Return to chapter overview

1、下载.netF精简版框架（下载链接），复制到机器上，或模拟器上

2、复制.rar（下载链接）解压，复制到机器上，或模拟器上

3、机器上安装.netF精简版框架：点击执行安装即可。

4、点击.exe运行


配置开发环境

Navigation: 入门 >

配置开发环境

 Return to chapter overview

操作系统：Windows 2000，Windows XP

开发工具：Microsoft Visual Studio 2005

SDK支持：Windows Mobile 5.0 Pocket PC SDK，Windows Mobile 6 SDK等

同步工具：Microsoft ActiveSync

框架：.NET Compact Framework 2.0


创建第一个HiMap项目

Navigation: 入门 >

创建第一个HiMap项目

 Return to chapter overview

分以下几个步骤完成一个智能设备GIS应用程序：

1、将压缩文件HiMapBetaVS2005-Runtime.zip（或者HiMapBetaVS2008-Runtime.zip）内的文件HiMap.Carto.dll，HiMap.Driver.dll，HiMap.Geometry.dll，HiMap.MapControls.dll，HiMap.Style.dll，KMGisLib.dll解压缩到本地磁盘某目录下。

2、启动Vs.net

（1）可以启动启动vs.net 2005 或者vs.net2008

（2）新建一个C#或者VB.net 智能设备应用程序项目

在[新建项目]对话框中选择Visual C#->智能设备->Windows Mobile 6 Professional->Device Application->在[名称(N)] 文本框中输入"myHiMap"->确定

3、添加引用以及工具箱中显示引用的控件

（1）在[解决方案资源管理器]窗口中，鼠标右键点击[引用]，选择[添加引用]，找到刚才上面压缩包解压的目录。添加成功后，您将看到如下内容：

（2）在[工具箱]窗口使用鼠标右键点击空白处，在弹出的菜单中选择[选择项]，在[选择工具项]窗口中，点击[浏览]按钮；在[打开]窗口中，找到并选中“HiMap.MaoControls.dll”文件，点击[打开]按钮；在[选择工具箱项]窗体中，点击[确定]按钮；添加成功后，左侧[工具箱]中将出现如下这些控件：

4、拖拽地图控件到Form1中

（1）在[工具箱]中找到“MapControl”控件，将其拖动到Form1.cs[设计]窗口中，并将其[Dock属性设置为Fill]；

（2）在代码文件中，"namespace myHiMap"上方添加"using HiMap.Carto;"和" using HiMap.Driver;"的引用。

5、加载图层

为Form1.cs窗体添加"Form1_Load"事件，并填写以下代码

map = new Map("test");

mapControl.Map = map;

mapControl.FromKmd("\\Storage Card\maps\maps.xml"); //这个xml是地图配置文件

HiMap.MapControls.Tools.ITool pTool = new HiMap.MapControls.Tools.ToolPan();

pTool.OnCreate(this.mapControl);

this.mapControl.CurTool = pTool;

6、部署

（1）将Windows Mobile 5.0 for Pocket PC或Windows Mobile 6 Professional的移动设备(本示例使用的是Windows Mobile 5.0 for Pocket PC的dopod D600手机)通过Microsoft ActiveSync(本示例使用的是4.5.0版本)与当前使用的PC连接。

注意：由于建立项目时选择的是"Windows Mobile 6 Professional"平台，所以现在要将平台转换为适应当前设备的"Windows Mobile 5.0 Pocket PC"平台。

（2）在VS2005的[解决方案资源管理器]中，用鼠标右键单击项目[myHiMap]，在弹出的菜单中选择[更改目标平台]，并选择"更改为：Windows Mobile 5.0 Pocket PC SDK"，点击[确定]按钮。在弹出的询问是否继续窗口中点击[是]按钮。最后，在VS2005的[设备]工具条中选择"Windows Mobile 5.0 Pocket PC Device"。

（3）在VS2005的[解决方案资源管理器]中，用鼠标右键单击项目[myHiMap]，在弹出的菜单中选择[部署]。

（4）部署成功后，将HiMapBeta1-Runtime.zip解压缩后得到的KMGisLib.dll文件拷贝到移动设备的"\Program Files\myhimap"目录中。或者使用VS2005自带的部署功能将其复制到程序目录下


地图数据管理

Navigation: »No topics above this level«

地图数据管理

 Return to chapter overview

绘制、查询、修改图元信息。


绘制工具

Navigation: 地图数据管理 >

绘制工具

 Return to chapter overview

绘制几何图形,点、线、面。


坐标转换

Navigation: 地图数据管理 > 绘制工具 >

屏幕坐标转换大地坐标

 Return to chapter overview
· 示例：

//定位一个点对象

IPoint pPoint = new PointClass();

//把鼠标点击在图形控件上的屏幕坐标转换为经纬度坐标

pPoint = Map.PointToMapPoint(e.X, e.Y)

· 备注

· 另见参考

演示示例代码见类文件：ToolDrawTempPoint


绘制点

Navigation: 地图数据管理 > 绘制工具 >

绘制点

 Return to chapter overview
· 示例：

第一种绘制（根据经纬度绘制）：

//定义刷子的颜色

Brush brush = new SolidBrush(Color.Yellow);

//定义画笔的颜色及尺寸

Pen pen = new Pen(Color.Blue, 2);

//绘制点

mapControl.DrawPoint(pen, brush, 123.111, 41.111, 2);

第二种绘制（直接在屏幕上绘制）：

//声明一个矩形区域框

Rectangle rectangle = new Rectangle(10, 20, 5, 5);

mapControl.DrawPoint(new Pen(Color.Red), new SolidBrush(Color.Blue), rectangle);

· 备注

这两种绘制的前提是：mapControl控件必须加载图层。

· 另见参考

演示示例代码见类文件：ToolDrawTempPoint


绘制线

Navigation: 地图数据管理 > 绘制工具 >

绘制线

 Return to chapter overview
· 示例：

//定义画笔的颜色及尺寸

Pen pen = new Pen(Color.Blue, 2);

//多边型是多点连成线围成的区域,所以下面定义一系列点:MapControl上的屏幕坐标点

Point[] arrPoint = new Point[5];

arrPoint[0].X = 40;

arrPoint[0].Y = 30;

arrPoint[1].X = 100;

arrPoint[1].Y = 30;

arrPoint[2].X = 120;

arrPoint[2].Y = 80;

arrPoint[3].X = 50;

arrPoint[3].Y = 70;

arrPoint[4].X = 40;

arrPoint[4].Y = 90;

//绘制线

mapControl.DrawLine(pen, arrPoint);

· 备注

绘制有三种方式：

第一种是二维平面点集合：

public void DrawLine(Pen pen, Point[] pts);

第二种是大地坐标点集合：

public void DrawLine(Pen pen, IPoint[] pts);

第三种是起止平面点集合，绘制一条直线：

public void DrawLine(Pen pen, Point pt1, Point pt2);

· 另见参考

演示示例代码见类文件（ 该文件是采用的第三种绘制方式）：ToolDrawTempPolyline


绘制面

· 示例：

//定义画笔的颜色及尺寸

Pen pen = new Pen(Color.Blue, 2);

//定义刷子的颜色

Brush brush = new SolidBrush(Color.Yellow);

//多边型是多点连成线围成的区域,所以下面定义一系列点:MapControl上的屏幕坐标点

Point[] arrPoint = new Point[4];

arrPoint[0].X = 40;

arrPoint[0].Y = 30;

arrPoint[1].X = 100;

arrPoint[1].Y = 30;

arrPoint[2].X = 120;

arrPoint[2].Y = 80;

arrPoint[3].X = 50;

arrPoint[3].Y = 70;

//绘制面

mapControl.DrawPolygon(pen,brush,arrPoint);

· 备注：

面是由点连接而成，所以，在绘制的时候首先要形成点集合。

· 另见参考：

演示示例代码见类文件：ToolDrawTempPolygon 示例代码中是先形成一个面对像，然后把采集的一个一个点加入这个面对像中。


查询

Navigation: 地图数据管理 >

查询

 Return to chapter overview

包含数据查询与空间查询。


模糊查询

Navigation: 地图数据管理 > 查询 >

模糊查询

 Return to chapter overview
· 示例：

下面的功能是：提取0图层name字段中包含字符‘张’的记录

//提取表进行查询——该表中有ｎａｍｅ字段

IFeatureLayer pFeatureLayer = (IFeatureLayer)_mapCtrl.Map.GetLayer(0);

IFeatureClass pFeatureClass = (IFeatureClass)pFeatureLayer.Class;

//建立一个过滤器

IQueryFilter pQueryFilter = new QueryFilterClass();

//设置条件

string strCondition = "";

strCondition = "name like '%张%'";

pQueryFilter.WhereClause = new StringBuilder(strCondition);

//查询数据

IFeatureCursor pFeatureCursor = pFeatureClass.Search(pQueryFilter);

//循环插入树控件中

IFeature pFeature = pFeatureCursor.Next();

if (pFeature != null)

{

//读取mFeat值，进行相应操作

}

· 备注：

· 另见参考：

演示示例代码见类文件FrmSearch中查询按钮事件，private void btnQuery_Click(object sender, EventArgs e)


点选查询

Navigation: 地图数据管理 > 查询 >

点选查询

 Return to chapter overview
· 示例：

功能描述：搜索当前中心点，半径为10个像素的图元

HiMap.Carto.ISpatialFilter pSpatialFilter = new HiMap.Carto.SpatialFilterClass();

pSpatialFilter.Buffer = 10;//搜索半径

pSpatialFilter.QType = QueryType.Pixel; //该参数是按照像素查询

//该参数是按照度量单位为米进行查询----QueryType.Meter

pSpatialFilter.Geometry = (HiMap.Geometry.IGeometry)this.Map.PointToMapPoint(e.X, e.Y);

IFeatureClass pFeatureClass;

HiMap.Carto.IFeatureCursor pFeatureCursor;

pFeatureClass = (IFeatureClass)this.Map.Map.GetLayer(0).Class; //获取图层

pFeatureCursor = pFeatureClass.Search(pSpatialFilter);

pFeatureCursor.Flush();

IFeature pFeature = pFeatureCursor.Next();

if (pFeature != null)

{

//读取pFeature值，进行相应操作

}

· 备注：

点选查询可以按像素或米为搜索半径

· 另见参考：

演示示例代码见类文件（信息 i 工具）：ToolInfo


编辑图元

Navigation: 地图数据管理 >

编辑图元

 Return to chapter overview

包含图元的增加、删除与修改


增加

Navigation: 地图数据管理 > 编辑图元 >

增加

 Return to chapter overview
· 示例：

//获取待编辑的图层，注意GetLayer括号中的索引是你准备要编辑的图层

IFeatureLayer pFeatureLayer = (IFeatureLayer)mMap.Map.GetLayer(0);

//取得一个元数据

IFeatureClass pFeatureClass = (IFeatureClass)pFeatureLayer.Class;

//建立一个要素

IFeature pFeature = pFeatureClass.CreateFeature();

//表中第一个字段赋值

pFeature.SetValue(0, 666);

//表中第二个字段赋值

pFeature.SetValue(1, "我的位置");

//下面以点图层为例：生成点对象

IPoint pPoint = new HiMap.Geometry.PointClass();

//更改你熟悉的地理坐标

pPoint.X = 123.1111;

pPoint.Y = 41.2222;

//给图元字段赋值

pFeat.Shape = pPoint;

//保存

pFeat.Save();

· 备注：

· 另见参考：

演示示例代码见类文件FrmMain 中：LocateSingle 过程。

演示示例中的点、线、面的绘制


删除

Navigation: 地图数据管理 > 编辑图元 >

删除

 Return to chapter overview
· 示例：

//取得一个图层

IFeatureLayer pFeatureLayer = (IFeatureLayer)mapControl1.Map.GetLayer(0);

//取得一个元数据

IFeatureClass pFeatureClass = (IFeatureClass)pFeatureLayer.Class;

//建立一个过滤器

IQueryFilter pQueryFilter=new QueryFilterClass();

//设置条件

pQueryFilter.WhereClause="id = 1";

//查询数据

IFeatureCursor pFeatureCursor = pFeatureClass.Search(pQueryFilter);

//取得一个要素

IFeature pFeature = pFeatureCursor.Next();

//删除一个要素

if (pFeature != null)

{

pFeatureClass.DeleteFeature(pFeature);

}

· 备注：

· 另见参考：

演示示例代码见类文件FrmDrawPoint、FrmDrawLine、FrmDrawPolygon。


修改

Navigation: 地图数据管理 > 编辑图元 >

修改

 Return to chapter overview
· 示例：

1、修改要素的属性值

//取得一个图层

IFeatureLayer pFeatureLayer = (IFeatureLayer)mapControl1.Map.GetLayer(0);

//取得一个元数据

IFeatureClass pFeatureClass = (IFeatureClass)pFeatureLayer.Class;

//建立一个过滤器

IQueryFilter pQueryFilter=new QueryFilterClass();

//设置条件

pQueryFilter.WhereClause="id = 1";

//查询数据

IFeatureCursor pFeatureCursor = pFeatureClass.Search(pQueryFilter);

//取得一个要素

IFeature pFeature = pFeatureCursor.Next();

if (pFeature != null)

{

//写入值

pFeature.SetValue(pFeatureClass.Fields.FindField("name"), "测试数据");

//保存

pFeature.Save();

}

2、修改要素的几何图形

//取得一个图层

IFeatureLayer pFeatureLayer = (IFeatureLayer)mapControl1.Map.GetLayer(0);

//取得一个元数据

IFeatureClass pFeatureClass = (IFeatureClass)pFeatureLayer.Class;

//建立一个过滤器

IQueryFilter pQueryFilter=new QueryFilterClass();

//设置条件

pQueryFilter.WhereClause="id = 1";

//查询数据

IFeatureCursor pFeatureCursor = pFeatureClass.Search(pQueryFilter);

//取得一个要素

IFeature pFeature = pFeatureCursor.Next();

if (pFeature != null)

{

//图层为线形Shape,所以使用IPolyline取得图形

HiMap.Geometry.IPolyline polyline = (HiMap.Geometry.IPolyline)pFeature.Shape;

IPointCollection pPointCollection = (IPointCollection)polyline;

//建立点(测试数据)

IPoint pPoint1 = new PointClass();

pPoint1.X = "111.2345556";

pPoint1.Y = "23.2345556";

IPoint pPoint2 = new PointClass();

pPoint2.X = "112.2345556";

pPoint2.Y = "23.3345556";

//添加点到线中

pPointCollection.AddPoint(pPoint1);

pPointCollection.AddPoint(pPoint2);

//将修改后的图形赋给要素

pFeature.Shape = (IGeometry)polyline;

//保存

pFeature.Save();

}

3、为线或面添加新的部分

//取得一个图层

IFeatureLayer pFeatureLayer = (IFeatureLayer)mapControl1.Map.GetLayer(0);

//取得一个元数据

IFeatureClass pFeatureClass = (IFeatureClass)pFeatureLayer.Class;

//建立一个过滤器

IQueryFilter pQueryFilter=new QueryFilterClass();

//设置条件

pQueryFilter.WhereClause="id = 1";

//查询数据

IFeatureCursor pFeatureCursor = pFeatureClass.Search(pQueryFilter);

//取得一个要素

IFeature pFeature = pFeatureCursor.Next();

if (pFeature != null)

{

//图层为线形Shape,所以使用IPolyline取得图形

HiMap.Geometry.IPolyline polyline = (HiMap.Geometry.IPolyline)pFeature.Shape;

//建立一条新的线

IPointCollection pPointCollection = new PolylineClass();

//建立点(测试数据)

IPoint pPoint1 = new PointClass();

pPoint1.X = "111.2345556";

pPoint1.Y = "23.2345556";

IPoint pPoint2 = new PointClass();

pPoint2.X = "112.2345556";

pPoint2.Y = "23.3345556";

//添加点到线中

pPointCollection.AddPoint(pPoint1);

pPointCollection.AddPoint(pPoint2);

HiMap.Geometry.IGeometryCollection pGeometryCollection = (HiMap.Geometry.IGeometryCollection)polyline;

//将新的线添加到原有的线中

pGeometryCollection.AddGeometry((IGeometry)pPointCollection);

//将修改后的图形赋给要素

pFeature.Shape = (IGeometry)polyline;

//保存

pFeature.Save();

}

· 备注：

· 另见参考：

演示示例代码见类文件FrmDrawPoint：


地图显示

Navigation: »No topics above this level«

地图显示

 Return to chapter overview

包含地图加载、样式渲染、定位及如何显示。


图层加载

Navigation: 地图显示 >

图层加载

 Return to chapter overview

加载物理图层以及实时变化的动态图层。


加载物理图层

Navigation: 地图显示 > 图层加载 >

加载物理图层

 Return to chapter overview
· 示例：

1、直接加载

//定义数据驱动,指出待加载的图层位置

HiMap.Driver.IDataFactory pDataFactory = new HiMap.Driver.Shape.ShapeDataFactory("\\Storage Card\\maps\\");

//当前控件如果没有Map, 则创建

if (mapControl1.Map == null)

{

HiMap.Carto.Map map = new HiMap.Carto.Map("TestMap");

mapControl1.Map = map;

}

HiMap.Carto.IFeatureClass pFeatureClass = (HiMap.Carto.IFeatureClass)pDataFactory.Open("one.shp");

HiMap.Carto.IFeatureLayer pFeatureLayer = new HiMap.Carto.FeatureLayerClass(pFeatureClass);

mapControl1.Map.AddLayer(pFeatureLayer);

mapControl1.MapRefresh();

2、通过图档加载

//MapControl控件直接加载配置好的图档文件

HiMap.Carto.Map map = new HiMap.Carto.Map("TestMap");

mapControl1.Map = map;

mapControl1.FromKmd(@"\Storage Card\maps\Tes.xml")

· 备注：

· 另见参考：

演示示例代码见类文件FrmMain.cs：


加载动态图层（监控）

Navigation: 地图显示 > 图层加载 >

加载动态图层（监控）

 Return to chapter overview
· 示例：

IFeatureLayer pFeatureLayer;

//定义字段类型集合

List<MemoryFeatureClassField> lstMemoryFeatureClassField = new List<MemoryFeatureClassField>();

MemoryFeatureClassField memoryFeatureClassField = new MemoryFeatureClassField();

//定义字段类型及名称

memoryFeatureClassField.FieldName = "id";

memoryFeatureClassField.FieldType = MemoryFeatureClassFieldType.Int;

memoryFeatureClassField.FieldLength = 4;

memoryFeatureClassField.FieldDecimals = 0;

lstMemoryFeatureClassField.Add(memoryFeatureClassField);

memoryFeatureClassField = new MemoryFeatureClassField();

memoryFeatureClassField.FieldName = "name";

memoryFeatureClassField.FieldType = MemoryFeatureClassFieldType.String;

memoryFeatureClassField.FieldLength = 50;

memoryFeatureClassField.FieldDecimals = 0;

lstMemoryFeatureClassField.Add(memoryFeatureClassField);

//参数是待添加图层的点的最大数值

MemoryFeatureClassClass memoryFeatureClassClass = new MemoryFeatureClassClass("AddLayer", 10, GeometryType.Point, lstMemoryFeatureClassField);

pFeatureLayer = new FeatureLayerClass(memoryFeatureClassClass);

mapControl1.Map.AddLayer(pFeatureLayer);

· 备注：

· 另见参考：

演示示例代码见类文件FrmMain.cs和Commonality.cs ,FrmMain.cs中LocateSingle()方法,描述了如何使用。它调用了Commonality类中静态方法CreateAutoPointLayer(map, out pFeatureClass, "MyLocate");：


图层渲染

Navigation: 地图显示 >

图层渲染

 Return to chapter overview

设置图层的标注、样式、显示范围等信息。


设置标注、字号、显示范围

Navigation: 地图显示 > 图层渲染 >

设置标注、字号、显示范围及标注是否分劈

 Return to chapter overview
· 示例：

//获取待编辑的图层，注意GetLayer括号中的索引是你准备要操作的图层

IFeatureLayer pFeatureLayer = (IFeatureLayer)mapControl.Map.GetLayer(0);

//设置标注的视野范围——应该在当前图层显示的范围内

pFeatureLayer.MaxLabelVisibleScale=0.005;

pFeatureLayer.MinLabelVisibleScale =0.002;

//设置字号

pFeatureLayer.LabelFontSize = 12;

//设置标注

pFeatureLayer.LableFieldIndex = 0;

//标注显示是否分劈（汉字头始终朝上）

pFeatureLayer.SplitLabel = true;

//刷新当前地图

mapControl.MapRefresh();

//注意：地图不显示，标注也是无效的

· 备注：

大家可以把这段代码复制到程序中，即可看到效果。

· 另见参考：

演示示例代码见类文件：


图层显示范围设置

Navigation: 地图显示 > 图层渲染 >

图层显示范围设置

 Return to chapter overview
· 示例：

//获取待编辑的图层，注意GetLayer括号中的索引是你准备要操作的图层

IFeatureLayer pFeatureLayer = (IFeatureLayer)mapControl.Map.GetLayer(0);

//设置地图的视野范围

pFeatureLayer.MaxVisibleScale = 0.005;

pFeatureLayer.MinVisibleScale = 0.002;

//刷新当前地图

mapControl.MapRefresh();

· 备注：

· 另见参考：

演示示例代码见类文件：


设置样式

Navigation: 地图显示 > 图层渲染 >

设置样式

 Return to chapter overview
· 示例：

1、线图层样式设置：

//取得一个线图层

IFeatureLayer pFeatureLayer = (IFeatureLayer)mapControl.Map.GetLayer(0);

IFeatureLayerSimpleRender Render = (IFeatureLayerSimpleRender)pFeatureLayer.Render;

Render.PolylineStyle.SetLineSymbolColor(0, Color.Salmon); //颜色

Render.PolylineStyle.SetLineSymbolWidth(0, 2); //宽度

mapControl.MapRefresh();

2、点图层分组样式设置：name 字段中为1的显示编号为107的图标；name 字段中为2的显示编号为106的图标；

IFeatureLayer pFeatureLayer = (IFeatureLayer)mapControl.Map.GetLayer(0); //需要点图层

pFeatureLayer.Render.ToGroupRender("name"); //按name字段进行分组

IFeatureLayerGroupRender pFeatureLayerGroupRender = (IFeatureLayerGroupRender)pFeatureLayer.Render;

pFeatureLayerGroupRender.AddGroupValue(new StringBuilder("1"));

pFeatureLayerGroupRender.AddGroupValue(new StringBuilder("2"));

pFeatureLayerGroupRender.GetPointStyle(new StringBuilder("1")).FromSystemStyle(107); //自定义的图片编号

pFeatureLayerGroupRender.GetPointStyle(new StringBuilder("2")).FromSystemStyle(106);

· 备注：

分组样式一般用于不同行政区显示不同颜色等。一般图片放在应用程序\BmpStyle 目录下

· 另见参考：

演示示例代码见类文件Commonality.cs中：

/加载临时线图层

public static void CreateAutoLineLayer(Map map, out IFeatureClass iFeatureclass, string layername)

//加载临时点图层

public static void CreateAutoPointLayer(Map map, out IFeatureClass iFeatureclass, string layername)

效果可以看监控功能演示


地图定位

Navigation: 地图显示 >

地图定位

 Return to chapter overview

根据不同需要，定位到目的地。多个目标图元、一个视野等信息。


几何要素求四角坐标

Navigation: 地图显示 > 地图定位 >

几何要素求四角坐标

 Return to chapter overview
· 示例：

1、线图元的四角坐标（左上角和右下角）

//判断图形（多条线）四角坐标

public static IEnvelope GetGeoLineCoor(List<IFeature> lstFeature)

{

double minX = 0, minY = 0, maxX = 0, maxY = 0;

//声明一个矩形对象

IEnvelope pEnvelope = new EnvelopeClass();

if (lstFeature.Count != 0)

{

for (int i = 0; i < lstFeature.Count; i++)

{

//获得每条线的点集合

IPointCollection pPointCollection = (IPointCollection)lstFeature[i].Shape;

for (int j = 0; j <= pPointCollection.PointCount - 1; j++)

{ //[] ifeat

if (j == 0 && i == 0)

{

minX = pPointCollection.GetPoint(j).X;

maxX = pPointCollection.GetPoint(j).X;

minY = pPointCollection.GetPoint(j).Y;

maxY = pPointCollection.GetPoint(j).Y;

}

else

{

minX = Math.Min(minX, pPointCollection.GetPoint(j).X);

minY = Math.Min(minY, pPointCollection.GetPoint(j).Y);

maxX = Math.Max(maxX, pPointCollection.GetPoint(j).X);

maxY = Math.Max(maxY, pPointCollection.GetPoint(j).Y);

}

}

}

}

pEnvelope.MinX = minX;

pEnvelope.MaxX = maxX;

pEnvelope.MinY = minY;

pEnvelope.MaxY = maxY;

return pEnvelope;

}

2、面图元的四角坐标

//面四角坐标

public static IEnvelope GetGeoPolygonCoor(List<IFeature> lstFeature)

{

double minX = 0, minY = 0, maxX = 0, maxY = 0;

//创建一个矩形对象

IEnvelope pEnvelope = new EnvelopeClass();

if (lstFeature.Count != 0)

{

for (int i = 0; i < lstFeature.Count; i++)

{

IPolygon pPolygon = (IPolygon)lstFeature[i].Shape;

for (int j = 0; j <= pPolygon.PointCount - 1; j++)

{

//获取面的点集合

IPoint pPoint = pPolygon.GetPoint(j);

if (j == 0 && i == 0)

{

_minX = pPoint.X;

_maxX = pPoint.X;

_minY = pPoint.Y;

_maxY = pPoint.Y;

}

else

{

minX = Math.Min(minX, pPoint.X);

minY = Math.Min(minY, pPoint.Y);

maxX = Math.Max(maxX, pPoint.X);

maxY = Math.Max(maxY, pPoint.Y);

}

}

}

}

pEnvelope.MinX = minX;

pEnvelope.MaxX = maxX;

pEnvelope.MinY = minY;

pEnvelope.MaxY = maxY;

return pEnvelope;

}

· 备注：

该功能多为客户想要查看的元素显示在当前视野内.

· 另见参考：

演示示例代码见类文件FrmSearch.cs和Commonality.cs.


直接定位

Navigation: 地图显示 > 地图定位 >

直接定位

 Return to chapter overview
· 示例：

1、给定一个点坐标，进行定位

//点坐标

IPoint pPoint = new PointClass();

pPoint.X = "111.2345556";

pPoint.Y = "23.2345556";

//设置地图以点为中心

mapControl.Map.CenterAt = pPoint;

//刷新地图

mapControl.MapRefresh();

2、给定一个矩形，进行定位（多用于多个图元定位在当前屏幕上）

//定义矩形对象

IEnvelope pEnvelope = new EnvelopeClass();

pEnvelope.MinX = 123.38160821744314;

pEnvelope.MaxX = 123.41495323446499;

pEnvelope.MinY = 41.798595643189344;

pEnvelope.MaxY = 41.835755556226417;

//设置地图显示范围

mapControl.Map.Envelope = pEnvelope;

//刷新地图

mapControl.MapRefresh();

· 备注：

该功能常见于监控区域的显示，当前追踪点的定位等。

· 另见参考：

演示示例代码见类文件FrmMain.cs：


动态显示

Navigation: 地图显示 >

动态显示

 Return to chapter overview

突出显示查询出来或点选后的图元。


选中

Navigation: 地图显示 > 动态显示 >

选中

 Return to chapter overview
· 示例：

搜索以当前点为中心，半径为10米的图元，对符合要求的图元进行闪烁。

MapControl mapControl; //当前图层的宿主控件

HiMap.Carto.ISpatialFilter pSpatialFilter = new HiMap.Carto.SpatialFilterClass();

pSpatialFilter.Buffer = 10;//搜索半径

pSpatialFilter.QType = QueryType.Meter; //搜索单位为米

//该参数是按照度量单位为米进行查询----QueryType.Meter

pSpatialFilter.Geometry = (HiMap.Geometry.IGeometry)this.Map.PointToMapPoint(e.X, e.Y);

IFeatureClass pFeatureClass;

HiMap.Carto.IFeatureCursor pFeatureCursor;

pFeatureClass = (IFeatureClass)this.Map.Map.GetLayer(0).Class; //获取图层

pFeatureCursor = pFeatureClass.Search(pSpatialFilter);

pFeatureCursor.Flush();

IFeature pFeature = pFeatureCursor.Next();

if (pFeature != null)

{

mapControl.Flash(pFeatureCursor,Color.Blue,5,500);

}

· 备注：

· 另见参考：

演示示例代码见类文件ToolInfo.cs：


闪烁

Navigation: 地图显示 > 动态显示 >

闪烁

 Return to chapter overview
· 示例：

1、闪烁一个图元

//取得一个图层

IFeatureLayer pFeatureLayer = (IFeatureLayer)mapControl.Map.GetLayer(0);

//取得一个元数据

IFeatureClass pFeatureClass = (IFeatureClass)pFeatureLayer.Class;

//建立一个过滤器

IQueryFilter pQueryFilter=new QueryFilterClass();

//设置条件

pQueryFilter.WhereClause="id = 1";

//查询数据

IFeatureCursor pFeatureCursor = pFeatureClass.Search(pQueryFilter);

//取得一个要素

IFeature pFeature = pFeatureCursor.Next();

//如果存在,则闪烁这个要素

if (pFeature != null)

{

//一般先定位(参考定位章节),然后地图刷新

//闪烁颜色,尺寸,时间间隔

mapControl.Flash(pFeature.Shape, Color.Blue, 5, 500);

}

2、闪烁多个图元

查看mapControl1提供的闪烁方法;

3、闪烁一个结果集

查看mapControl1提供的闪烁方法;

· 备注：

· 另见参考：

演示示例代码见类文件FrmSearch.cs：


地图属性

Navigation: »No topics above this level«

地图属性

 Return to chapter overview

提取当前地图参数。


地图中心点

Navigation: 地图属性 >

地图中心点

 Return to chapter overview
· 示例：

MessageBox.Show("经度：" + this.mapControl.Map.CenterAt.X.ToString() + " ; 纬度：" + this.mapControl.Map.CenterAt.Y.ToString());

· 备注：

· 另见参考：

演示示例代码见类文件：


当前视野

Navigation: 地图属性 >

当前视野

 Return to chapter overview
· 示例：

MessageBox.Show("视野：" + this.mapControl.MapScale.ToString());

· 备注：

· 另见参考：

演示示例代码见类文件：


当前比例

Navigation: 地图属性 >

当前比例

 Return to chapter overview
· 示例：

MessageBox.Show("current scale = 1:" + Math.Round(mapControl.Map.MapDistanceScale,2),"map parameter");

· 备注：

· 另见参考：

演示示例代码见类文件：


地图工具

Navigation: »No topics above this level«

地图工具

 Return to chapter overview

包含地图常用工具以及如何自定义工具


基本工具

Navigation: 地图工具 >

基本工具

 Return to chapter overview

地图的一些常用工具。


测距

Navigation: 地图工具 > 基本工具 >

测距

 Return to chapter overview
· 示例：

//判断当前是否加载了地图

if (this.mapControl.Map != null)

{

HiMap.MapControls.Tools.ITool pTool = new HiMap.MapControls.Tools.ToolDistance() ;

pTool.OnCreate(this.mapControl);

this.mapControl.CurTool = pTool;

}

· 备注：

· 另见参考：

演示示例代码见类文件FrmMain.cs：


后一视图

Navigation: 地图工具 > 基本工具 >

后一视图

 Return to chapter overview
· 示例：

//判断当前是否加载了地图

if (this.mapControl.Map != null)

{

ICommand pCommand = new CommandAfterView();

pCommand.OnCreate(this.mapControl);

pCommand.OnClick();

}

· 备注：

· 另见参考：

演示示例代码见类文件FrmMain.cs：


前一视图

Navigation: 地图工具 > 基本工具 >

前一视图

 Return to chapter overview
· 示例：

//判断当前是否加载了地图

if (this.mapControl.Map != null)

{

ICommand pCommand = new CommandBeforeView();

pCommand.OnCreate(this.mapControl);

pCommand.OnClick();

}

· 备注：

· 另见参考：

演示示例代码见类文件FrmMain.cs：


漫游

Navigation: 地图工具 > 基本工具 >

漫游

 Return to chapter overview
· 示例：

//判断当前是否加载了地图

if (this.mapControl.Map != null)

{

HiMap.MapControls.Tools.ITool pTool = new HiMap.MapControls.Tools.ToolPan();

pTool.OnCreate(this.mapControl);

this.mapControl.CurTool = pTool;

}

· 备注：

· 另见参考：

演示示例代码见类文件FrmMain.cs：


全图

Navigation: 地图工具 > 基本工具 >

全图

 Return to chapter overview
· 示例：

//判断当前是否加载了地图

if (this.mapControl.Map != null)

{

mapControl.Map.Envelope = mapControl.Map.FullEnvelope;

mapControl.MapRefresh();

}

· 备注：

· 另见参考：

演示示例代码见类文件FrmMain.cs：


缩小

Navigation: 地图工具 > 基本工具 >

缩小

 Return to chapter overview
· 示例：

//判断当前是否加载了地图

if (this.mapControl.Map != null)

{

HiMap.MapControls.Tools.ITool pTool = new HiMap.MapControls.Tools.ToolZoomOut();

pTool.OnCreate(this.mapControl);

this.mapControl.CurTool = pTool;

}

· 备注：

· 另见参考：

演示示例代码见类文件FrmMain.cs：


放大

Navigation: 地图工具 > 基本工具 >

放大

 Return to chapter overview
· 示例：

//判断当前是否加载了地图

if (this.mapControl.Map != null)

{

HiMap.MapControls.Tools.ITool pTool = new HiMap.MapControls.Tools.ToolZoomIn();

pTool.OnCreate(this.mapControl);

this.mapControl.CurTool = pTool;

}

· 备注：

· 另见参考：

演示示例代码见类文件FrmMain.cs：


自定义工具

Navigation: 地图工具 >

自定义工具

 Return to chapter overview

根据不同需要定制绘制、漫游等工具。


点工具

Navigation: 地图工具 > 自定义工具 >

点工具

 Return to chapter overview
· 示例：

定义一个点工具类：

public class ToolDrawTempPoint : ToolClass

{

FrmBase _mfrmbase; //调用的窗体基类

public ToolDrawTempPoint(FrmBase mfrm)

{

_mfrmbase = mfrm;

}

protected override void OnMouseDown(object sender, System.Windows.Forms.MouseEventArgs e)

{

Map.DrawPoint(new Pen(Color.Red), new SolidBrush(Color.Blue), Map.PointToMapPoint(e.X, e.Y).X, Map.PointToMapPoint(e.X, e.Y).Y, 3);

_mfrmbase.cx = Map.PointToMapPoint(e.X, e.Y).X;

_mfrmbase.cy = Map.PointToMapPoint(e.X, e.Y).Y;　//以后作为一个图元传出

_mfrmbase.Show();

}

}

· 备注：

· 另见参考：

演示示例代码见类文件ToolDrawTempPoint：


线工具

Navigation: 地图工具 > 自定义工具 >

线工具

 Return to chapter overview
· 示例：

定义一个绘制线工具类：

public class ToolDrawTempPolyline : ToolClass

{

internal Panel _panel;

internal Button _btnClear;

internal Button _btnOk;

internal Button _btnCanel;

internal Form _frm;

internal MapControl mapControl;

Point point = Point.Empty;

IPoint pPoint;

IPointCollection pPointCollection = new PolylineClass();

internal FrmDrawLine _tempFrm;

public ToolDrawTempPolyline(Form mfrmMain, FrmDrawLine mfrm, MapControl mapCtrl)

{

_frm = mfrmMain;

_tempFrm = mfrm;

mapControl = mapCtrl;

CreatControl();

}

private void CreatControl()

{

_panel = new Panel();

_btnCanel = new Button();

_btnClear = new Button();

_btnOk = new Button();

_panel.Width = 240;

_panel.Height = 27;

_panel.Visible = false;

_frm.Controls.Add(_panel);

_frm.Controls.SetChildIndex(_panel, 0);

_btnClear.Text = "清除";

_btnClear.Location = new System.Drawing.Point(84, 3);

_btnClear.Width = 47;

_btnClear.Height = 20;

_btnClear.Click += new EventHandler(this.BtnClearClick);

_panel.Controls.Add(_btnClear);

_btnOk.Text = "确认";

_btnOk.Location = new System.Drawing.Point(137, 3);

_btnOk.Width = 47;

_btnOk.Height = 20;

_btnOk.Click += new EventHandler(this.BtnOkClick);

_panel.Controls.Add(_btnOk);

_btnCanel.Text = "取消";

_btnCanel.Location = new System.Drawing.Point(190, 3);

_btnCanel.Width = 47;

_btnCanel.Height = 20;

_btnCanel.Click += new EventHandler(this.BtnCanelClick);

_panel.Controls.Add(_btnCanel);

}

protected virtual void BtnClearClick(object sender, EventArgs e)

{

//刷新一下即可

point = Point.Empty;

mapControl.MapRefresh();

}

protected virtual void BtnOkClick(object sender, EventArgs e)

{

_tempFrm._mLine = pPointCollection;

_panel.Visible = false;

pPointCollection = new PolylineClass();

_tempFrm.Show();

}

protected virtual void BtnCanelClick(object sender, EventArgs e)

{

_tempFrm._mLine = null;

_panel.Visible = false;

point = Point.Empty;

_tempFrm.Show();

pPointCollection = new PolylineClass();

}

protected override void OnMouseUp(object sender, System.Windows.Forms.MouseEventArgs e)

{

base.OnMouseUp(sender, e);

//鼠标抬起，记录一个点，个点以上，绘制一次。

if (point == Point.Empty)

{

point.X = e.X;

point.Y = e.Y;

pPoint = Map.PointToMapPoint(e.X, e.Y);

pPointCollection.AddPoint(pPoint);

}

else

{

Point endPoint = new Point(e.X, e.Y);

this.Map.DrawLine(new Pen(Color.Blue), point, endPoint);

point.X = e.X;

point.Y = e.Y;

pPoint = Map.PointToMapPoint(e.X, e.Y);

pPointCollection.AddPoint(pPoint);

}

}

protected override void OnMouseDown(object sender, System.Windows.Forms.MouseEventArgs e)

{

if (_panel.Visible == false)

{

_panel.Location = new System.Drawing.Point(0, 240);

_panel.Visible = true;

}

}

}

· 备注：

· 另见参考：

演示示例代码见类文件ToolDrawTempPolyline：


面工具

Navigation: 地图工具 > 自定义工具 >

面工具

 Return to chapter overview
· 示例：

public class ToolDrawTempPolygon : ToolClass

{

internal Panel _panel;

internal Button _btnClear;

internal Button _btnOk;

internal Button _btnCanel;

internal Form _frm;

internal MapControl mapControl;

Point point = Point.Empty;

IPoint pPoint;

IPolygon pPolygon = new PolygonClass();

internal FrmDrawPolygon _tempFrm;

public ToolDrawTempPolygon(Form mfrmMain, FrmDrawPolygon mfrm, MapControl mapCtrl)

{

_frm = mfrmMain; //地图控件所在的窗体

_tempFrm = mfrm; //调用绘图工具的窗体

mapControl = mapCtrl;

CreatControl(); //在地图控件窗体中生成控件

}

private void CreatControl()

{

_panel = new Panel();

_btnCanel = new Button();

_btnClear = new Button();

_btnOk = new Button();

_panel.Width = 240;

_panel.Height = 27;

_panel.Visible = false;

_frm.Controls.Add(_panel);

_frm.Controls.SetChildIndex(_panel, 0);

_btnClear.Text = "清除";

_btnClear.Location = new System.Drawing.Point(84, 3);

_btnClear.Width = 47;

_btnClear.Height = 20;

_btnClear.Click += new EventHandler(this.BtnClearClick);

_panel.Controls.Add(_btnClear);

_btnOk.Text = "确认";

_btnOk.Location = new System.Drawing.Point(137, 3);

_btnOk.Width = 47;

_btnOk.Height = 20;

_btnOk.Click += new EventHandler(this.BtnOkClick);

_panel.Controls.Add(_btnOk);

_btnCanel.Text = "取消";

_btnCanel.Location = new System.Drawing.Point(190, 3);

_btnCanel.Width = 47;

_btnCanel.Height = 20;

_btnCanel.Click += new EventHandler(this.BtnCanelClick);

_panel.Controls.Add(_btnCanel);

}

protected virtual void BtnClearClick(object sender, EventArgs e)

{

//刷新一下即可

point = Point.Empty;

mapControl.MapRefresh();

}

protected virtual void BtnOkClick(object sender, EventArgs e)

{

_tempFrm._mPolygon = pPolygon;

_panel.Visible = false;

pPolygon = new PolygonClass();

_tempFrm.Show();

}

protected virtual void BtnCanelClick(object sender, EventArgs e)

{

_tempFrm._mPolygon = null;

_panel.Visible = false;

point = Point.Empty;

_tempFrm.Show();

pPolygon = new PolygonClass();

}

protected override void OnMouseUp(object sender, System.Windows.Forms.MouseEventArgs e)

{

base.OnMouseUp(sender, e);

//鼠标抬起，记录一个点，个点以上，绘制一次。

if (point == Point.Empty)

{

point.X = e.X;

point.Y = e.Y;

pPoint = Map.PointToMapPoint(e.X, e.Y);

pPolygon.AddPoint(pPoint);

}

else

{

Point endPoint = new Point(e.X, e.Y);

this.Map.DrawLine(new Pen(Color.Blue), point, endPoint);

point.X = e.X;

point.Y = e.Y;

pPoint = Map.PointToMapPoint(e.X, e.Y);

pPolygon.AddPoint(pPoint);

}

}

protected override void OnMouseDown(object sender, System.Windows.Forms.MouseEventArgs e)

{

if (_panel.Visible == false)

{

_panel.Location = new System.Drawing.Point(0, 240);

_panel.Visible = true;

}

}

}

· 备注：

· 另见参考：

演示示例代码见类文件ToolDrawTempPolygon.cs：


图档文件

Navigation: »No topics above this level«

图档文件

 Return to chapter overview

编辑、修改地图配置文件。


编辑

Navigation: 图档文件 >

编辑

 Return to chapter overview
· 示例：

形成图档有两种方式:

1、用桌面配置工具，形成配置文件

2、用MapControl的方法另存

SaveFileDialog _save = new SaveFileDialog();

_save.FileName = "MapDoc";

if (_save.ShowDialog() == DialogResult.OK)

{

mapControl.SaveKmd(_save.FileName + "xml");

}

· 备注：

· 另见参考：

演示示例代码见类文件FrmMain.cs：


加载

Navigation: 图档文件 >

加载

 Return to chapter overview
· 示例：

//定义一个Map对象

Map map = new Map("TstMap");

mapControl.Map = map;

//加载配置图档

mapControl.FromKmd(@"\Storage Card\maps\Mapdoc.xml");

· 备注：

· 另见参考：

演示示例代码见类文件FrmMain.cs：


速度优化

Navigation: »No topics above this level«

速度优化

 Return to chapter overview

优化显示、查询等操作


显示

Navigation: 速度优化 >

显示

 Return to chapter overview

为了达到视野舒适和提高速度的效果，可以从下面几个方面优化地图：

首先获取一个图层：

IFeatureLayer pFeatureLayer = (IFeatureLayer)mapControl.Map.GetLayer(0);

1、设置图层缩放范围

pFeatureLayer.MaxVisibleScale = 0.001;

pFeatureLayer.MinVisibleScale = 0.0006;

2、设置标注的显示范围

pFeatureLayer.MaxLabelVisibleScale = 0.001;

pFeatureLayer.MinLabelVisibleScale = 0.0004;


常见问题及解答

Navigation: »No topics above this level«

常见问题及解答

 Return to chapter overview

常见问题的一些处理办法。


地图不显示

Navigation: 常见问题及解答 >

地图不显示

 Return to chapter overview
· 地图文件没找到
· 地图设置的显示范围，当前正好没在这个范围
·


查询不到结果

Navigation: 常见问题及解答 >

查询不到结果

 Return to chapter overview

1、条件书写有误

pQueryFilter.WhereClause = new System.Text.StringBuilder("Id = 15");

“=”后面需要加一个空格


示例代码

Navigation: »No topics above this level«

示例代码

 Return to chapter overview

本文档中所有示例代码请在此处下载，下载后使用VS2005打开，选择Windows Mobile 5.0的模拟器或设备调试运行即可。

点击下载