利用多边形工具:wMap.CurrentTool = ( MapXLib.ToolConstants )10; 计算代码写在:wMap_PolyToolUsed(…)中。
if (e.toolNum == 10) { //获取屏幕上的点 MapXLib.Points pts = (MapXLib.Points)e.points; MapXLib.Point pt1, pt2; double d = 0.0; //计算顺序两个点距离,累计得到总距离 for (int i = 1; i < pts.Count; i++) { pt1 = pts._Item(i); pt2 = pts._Item(i + 1); d += axMap1.Distance(pt1.X, pt1.Y, pt2.X, pt2.Y); } MessageBox.Show(string.Format("距离为:{0:f2} 公里", d)); } |
写在地图控件的SelectionChanged()事件中,确保图层可选layer.Selectable = true; //第一层,注:MapX的索引号从“1”开始 MapXLib.Layer lyr = wMap.Layers._Item(1); //显示第一个图元的信息 MessageBox.Show ( lyr.Selection._Item(1).KeyValue ); |
设置MapControl属性: MouseWheelSupport = miFullMouseWheelSupport; |
思路:将实时数据查询放到一个datatable中,循环地查询每一个feature,将对应的feature坐标修改掉,最后刷新地图。 //获取【灯】数据 System.Data.DataTable dt = ds.Tables[0]; //更新【灯】图层 MapXLib.Layer lyr = wMap.Layers._Item("灯"); lyr.KeyField = "Name"; foreach (MapXLib.Feature fe in lyr.AllFeatures) { System.Data.DataRow[] drs = dt.Select("名称 = '" + fe.KeyValue.ToString() + "'"); double dx = Convert.ToDouble(drs[0]["经度"].ToString()); double dy = Convert.ToDouble(drs[0]["纬度"].ToString()); //重设point坐标 fe.Point.Set(dx, dy); //更新feature fe.Update(fe, new MapXLib.RowValuesClass()); } //刷新地图 lyr.Refresh();
通常会用一个Timer通过Tick事件来刷新地图,这样的刷新会使得地图有明显的闪烁。解决方法如下,设置地图控件属性“RedrawInterval = 3000”即可。 |
(接上篇) 4) Layer.Style 图层样式 //重写图层样式 lyr.OverrideStyle = true; //使用位图作为图元样式 lyr.Style.SymbolType = MapXLib.SymbolTypeConstants.miSymbolTypeBitmap; //指定位图名称 lyr.Style.SymbolBitmapName = "LITE2-32.bmp"; //指定位图大小 lyr.Style.SymbolBitmapSize = 20; //位图白色部分为透明 lyr.Style.SymbolBitmapTransparent = true; 5) Layer.LabelProperties.Style 标注样式 //字体 lyr.LabelProperties.Style.TextFont.Name = "华文中宋"; //大小 lyr.LabelProperties.Style.TextFont.Size = 16; //粗体 lyr.LabelProperties.Style.TextFont.Bold = true; //颜色 lyr.LabelProperties.Style.TextFontColor = (uint)MapXLib.ColorConstants.miColorNavy; //位置 lyr.LabelProperties.Position = MapXLib.PositionConstants.miPositionCC; //偏移 lyr.LabelProperties.Offset = 15; 6) MapXLib.Feature 图元要素 A. Attach(mapControl.GetOcx())将独立的图元连接到地图上,使地图坐标应用于相应要素 B. KeyValue = “xx” 对应Layer.KeyField的值 C. Point = pt 指定地图要素(某个点) //将数据库中的点坐标依次读出到一个dataset中,构成point的feature,计入lyr中 lyr.KeyField = "Name"; for (int i = 0; i < ds.Tables[0].Rows.Count; i++) { //新建一个feature MapXLib.Feature fe = new MapXLib.FeatureClass(); //将独立的图元连接到地图,以便地图坐标系应用于相应图元。 fe.Attach(wMap.GetOcx()); //新建一个点 MapXLib.Point pt = new MapXLib.PointClass(); //定义点的坐标 double dx = Convert.ToDouble(ds.Tables[0].Rows[i]["经度"].ToString()); double dy = Convert.ToDouble(ds.Tables[0].Rows[i]["纬度"].ToString()); pt.Set(dx, dy); //设置字段的值 fe.KeyValue = ds.Tables[0].Rows[i]["名称"].ToString(); fe.Point = pt; //加入图层中 lyr.AddFeature(fe, new MapXLib.RowValuesClass()); } 7) MapXLib.Point 点 A. Set(double x, double y) 设置点的坐标 8) 如果图层中图元的样式根据数据库中数据分级显示,则所有layer样式都不能用,因为layer样式将会覆盖feature的样式。对每一个feature进行样式的赋值: //定义样式 MapXLib.Style sNormal = new MapXLib.Style(); //设置样式 sNormal.SymbolType = MapXLib.SymbolTypeConstants.miSymbolTypeBitmap; sNormal.SymbolBitmapName = "PIN4-32.BMP"; sNormal.SymbolBitmapTransparent = true; sNormal.SymbolBitmapSize = 20; //feature应用样式 fe.Style = sNormal; |
1. 首先在路径中查找相关文件,如果有就先删除。 using System.IO; //查看【灯.*】文件是否存在,如果存在就删掉 if (File.Exists(Application.StartupPath + "\\MapData\\灯.DAT")) File.Delete(Application.StartupPath + "\\MapData\\灯.DAT"); 2. 几个重要的对象 1) MapXLib.Fields 字段集 A. AddStringField(字段名,长度,是否索引) B. AddFloatField(字段名,是否索引) //新建一个Fields集合:Fields 集合用于描述或定义数据表的列结构 MapXLib.Fields flds = new MapXLib.FieldsClass(); //增加文本型字段 flds.AddStringField("Name", 50, false); 2) MapXLib.LayerInfo 用于定义要添加的图层 A. 属性Type = MapXLib.LayerInfoTypeConstants.miLayerInfoTypeNewTable; B. 方法AddParameter(属性名,属性值) a) “FileSpec”:xxx.tab 文件名称 b) “Visible”:true / false 图层是否可见 c) “AutoCreateDataset”:true / false 是否自动创建dataset d) “Fields” :MapXLib.Fields 与图层相关的字段集 //新建一个layerInfo MapXLib.LayerInfo mLayerInfo; mLayerInfo = new MapXLib.LayerInfoClass(); //指定layerInfo的Type,选定建立NewTable mLayerInfo.Type = MapXLib.LayerInfoTypeConstants.miLayerInfoTypeNewTable; //LayerInfo.AddParameter方法用于设置这些参数。 //确定文件路径:一个字符串属性,应该设置为要创建的图层的文件路径。 mLayerInfo.AddParameter("FileSpec", @Application.StartupPath + "\\MapData\\灯.tab"); //确定图层可视:控制图层是否可见。该属性是一个布尔值,默认值为 True。 mLayerInfo.AddParameter("Visible", true); //确定自动创建dataset mLayerInfo.AddParameter("AutoCreateDataset", true); //把字段加入图层 mLayerInfo.AddParameter("Fields", flds); 3) MapXLib.Layer 图层 A. _Name = “xxx” 图层名称 B. AutoLabel = true / false 自动标注 C. Selectable = true / false 是否可选 D. KeyField = “xx” 关键字段 E. AddFeature(MapXLib.Feature,MapXLib.RowValuesClass)向图层中加入新要素 //把新生成的图层加入到mapControl中 MapXLib.Layer lyr = wMap.Layers.Add(mLayerInfo, 0); lyr._Name = "灯"; // 控制图层是否自动标记。 lyr.AutoLabel = true; //将 MapX 设置为识别用户何时单击此图层。 lyr.Selectable = true; (未完待续,接下篇) |
题记:介绍.NET环境下的MapX5.0如何进行空间查询,首先选中一个点,查询在一段距离内的信息。其中,地图控件为wMap,请确保当前工具为“选择”。 wMap.GeoSet = Application.StartupPath + "\\Data\\地图.gst"; wMap.CurrentTool = MapXLib.ToolConstants.miSelectTool;
源代码如下: private void wMap_SelectionChanged(object sender, EventArgs e) { //设置查询的图层 MapXLib.Layer lyr = wMap.Layers._Item("图层名称"); //如果选择集中选中一个 if (lyr.Selection.Count == 1) { //确定图层表中的列(字段)名 lyr.KeyField = "字段名称"; //提取第一个点的X,Y坐标 double dblX = lyr.Selection._Item(1).CenterX; double dblY = lyr.Selection._Item(1).CenterY; //生成用于查询的中心点 MapXLib.Point p = new MapXLib.Point(); //将该点设为选中的点 p.Set(dblX, dblY); //Features 集合对象表示在图层中查询结果对应的 Feature 对象集合 MapXLib.Features Feas = lyr.SearchWithinDistance(p, 10,MapXLib.MapUnitConstants.miUnitKilometer,MapXLib.SearchTypeConstants.miSearchTypeEntirelyWithin);
//对于查询结果的处理,循环装入datatable中 DataTable dt = new DataTable(); dt.Columns.Add("字段名称"); for (int i = 1; i <= Feas.Count; i++) dt.Rows.Add(Feas._Item(i).KeyValue); //将查询结果在datagrid中显示 dg.DataSource = dt; } } |