一 : mapxtreme练习笔记
1. 获取鼠标的当前坐标 ..................................................... 2
DisplayTransform.FromDisplay 方法 (Rectangle, DRect) ........................ 2
DisplayTransform.ToDisplay 方法 (DPoint, Point) ............................. 2
2. 使某图层可选或不可选 ................................................... 3
3. 使用checkboxes控制图层可见性 .......................................... 3
4. 把当前窗口地图保存为图片 ............................................... 3
5. 设置地图视图功能的范围选定 ............................................. 4
6. 创建从一个Microsoft Access表的填图(还未实现) ......................... 4
7. 建立一个线缓冲区,并加载到地图中(还未实现) ........................... 5
8. 计算一个多边形内点的数目(已完成) ..................................... 6
9. 把当前的选择工具变为漫游工具 ........................................... 7
10. 改变绘图样式 ........................................................... 7
11. 返回选择物信息(已完成) ............................................... 7
12. 一个简单的点对点路径分析(这个路径分析是使用mapinfo服务器,得付费) ... 8
13. 把选择的结果填充到datagrid中 .......................................... 9
14. 设置导出图片的格式 ..................................................... 9
15. Feature相关程序 ...................................................... 10
1. 创建一个feature并加载到地图中 ......................................................................... 10
2. 插入一个feature ...................................................................................................... 11
3. 向地图中插入一个特殊的feature .......................................................................... 11
4. 选择geometry的样式 ............................................................................................... 11
16. 添加一个加载图片的自定义标签工具(已完成) ............................ 12
17. 比例尺和标签修饰(已完成) ............................................ 13
18. 使用专题和图例 ........................................................ 13
19. 相对路径加载地图 ...................................................... 14
20. SearchInfoFactory类 .................................................. 15
21. 可制图表的一个研究 .................................................... 17
22. 两种方法实现动态轨迹 .................................................. 19
23. 运动轨迹的代码(桌面程序用) ............................................ 22
24. MapXtreme中桌面信息工具(InfoTool)的简单实现 ...................... 26
25. 在MapXtreme2004 地图中创建一个显示动态小车的图层 ................... 27
26. 地图图元的闪烁效果制作 ................................................ 29
27. 根据名称搜索图元,高亮显示,显示信息 .................................. 30
28. 画线轨迹 .............................................................. 31
29. 多点画一线 ............................................................ 31
30. 改变线或区域的样式 .................................................... 32
31. 显示多边形 ............................................................ 32
32. 添加图元 .............................................................. 32
33. 控制显示比例 .......................................................... 33
34. 显示多行InfoTips ..................................................... 33
35. 取得选择图元的ID列表 ................................................ 35
36. 用程序选择指定层中符合条件的图元 ...................................... 36
37. 瘦控件的专题图制作 .................................................... 37
38. 一个选中的图元强调显示,用红色醒目的文字显示 .......................... 40
mapxtreme mapxtreme练习笔记
39.
41.
42.
43.
44. 在MapXtreme中的标注换行 .............................................. 43 几个报错 .............................................................. 43 在C#应用中如何读取存在ORACLE(或SQL Server)中的MapInfo表 ....... 45 读取线的节点坐标程序 .................................................. 46 常用示例 .............................................................. 47
1 设置图层可选状态 ............................................................................................................ 47
2 设置层的可用状态 ............................................................................................................ 48
3 层居中,看全图 ................................................................................................................ 49
4 放大缩小地图 .................................................................................................................... 50
5 移动层的顺序 mapControl1.Map.Layers.Move(index1,index2); ................... 51
6 图元/图层透明 .................................................................................................................. 51
7 选择全部图元 .................................................................................................................... 53
10 计算缩放比例 .................................................................................................................. 56
1. 获取鼠标的当前坐标
private void mapControl1_MouseMove(object sender, MouseEventArgs e)
{
System.Drawing.PointF DisplayPoint = new PointF(e.X, e.Y);//创建二维平面中点的 x 和 y 坐标的有序对
MapInfo.Geometry.DPoint MapPoint = new MapInfo.Geometry.DPoint();//创建图层点 MapInfo.Geometry.DisplayTransform converter =
this.mapControl1.Map.DisplayTransform; converter.FromDisplay(DisplayPoint, out MapPoint);// 显示坐标中的一个点转换为地图或图层坐标中的点
this.statusBar1.Text = "Cursor Location: " + MapPoint.x.ToString() + ", " + MapPoint.y.ToString();
}
附:
DisplayTransform.FromDisplay 方法 (Rectangle, DRect)
将显示坐标中的矩形转换为地图或图层坐标中的矩形。[www.61k.com)
public void FromDisplay( Rectangle srcRect, 显示坐标中的矩形。
out DRect destRect 地图或图层坐标中的矩形。
DisplayTransform.ToDisplay 方法 (DPoint, Point)
将地图或图层点转换为显示点。
public void ToDisplay( DPoint pntSrc, 地图或图层点
out Point pntDest 显示点。
);
mapxtreme mapxtreme练习笔记
思考:显示鼠标当前所在图元?
结合SearchIntersectsGeometry方法。(www.61k.com)
2. 使某图层可选或不可选
//所有图层不可选
MapInfo.Mapping.LayerHelper.SetSelectable(item, false);
//某一图层不可选
foreach (MapInfo.Mapping.IMapLayer layer in mapControl1.Map.Layers)
{
if (object.ReferenceEquals(layer, mapControl1.Map.Layers["GZ_River_LL"])) {
MapInfo.Mapping.LayerHelper.SetSelectable(layer, false);
}
}
附:LayerHelper 类:
该类提供帮助程序方法,用于获得并设置在默认情况下选择及编辑工具所使用的自定义属性。
//设置图层可编辑
MapInfo.Mapping.LayerHelper.SetEditable(fly, true);
3. 使用checkboxes控制图层可见性
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
this.mapControl1.Map.Layers[checkBox1.Text.ToString()].Enabled =
checkBox1.Checked;
}
4. 把当前窗口地图保存为图片
private void button1_Click(object sender, EventArgs e)
{
MapInfo.Mapping.MapExport exportObject = new
MapInfo.Mapping.MapExport(this.mapControl1.Map.Clone() as MapInfo.Mapping.Map);
exportObject.ExportSize = new MapInfo.Mapping.ExportSize(this.mapControl1.Map.Size.Width, this.mapControl1.Map.Size.Height);
exportObject.Format = MapInfo.Mapping.ExportFormat.Bmp;
//保存到剪贴板
System.Windows.Forms.Clipboard.SetDataObject (exportObject.Export());
//保存到硬盘
exportObject.Export(@"D:TempExportImage.bmp");
MessageBox.Show("保存成功!");
mapxtreme mapxtreme练习笔记
}
5. 设置地图视图功能的范围选定
MapInfo.Data.Table table = Session.Current.Catalog.OpenTable(@"C:Documents and
SettingsAdministrator桌面mapGZ-landmark-LL-Shift.TAB");
MapInfo.Mapping.FeatureLayer lyr = new FeatureLayer(table);
MapInfo.Data.SearchInfo si =
MapInfo.Data.SearchInfoFactory.SearchWhere("E_Name='Wanli Shopping Centre'");
Session.Current.Catalog.Search(lyr.Table, si,
Session.Current.Selections.DefaultSelection, ResultSetCombineMode.AddTo);
MapInfo.Data.IResultSetFeatureCollection irfc =
Session.Current.Selections.DefaultSelection[lyr.Table];
MapInfo.Data.Feature f = irfc[0];
MapInfo.Geometry.DPoint pnt = new MapInfo.Geometry.DPoint(f.Geometry.Centroid.x, f.Geometry.Centroid.y);
mapControl1.Map.Center = pnt;
mapControl1.Map.Bounds= f.Geometry.Bounds;
6. 创建从一个Microsoft Access表的填图(还未实现)
//从access中获取数据
System.Data.OleDb.OleDbDataAdapter adapter = new
System.Data.OleDb.OleDbDataAdapter("Select * from US_Cust",
@"Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:DataMapstats2000.mdb");
DataTable dt = new DataTable();
adapter.Fill(dt);
dataGrid1.DataSource = dt; //填充DataGrid控件
// 定义MapInfo表,并将其添加到catalog - 假定为坐标表
MapInfo.Geometry.CoordSysFactory csf = new
MapInfo.Geometry.CoordSysFactory();
MapInfo.Geometry.CoordSys cs =
csf.CreateLongLat(MapInfo.Geometry.DatumID.NAD83);
MapInfo.Data.SpatialSchemaXY xy = new MapInfo.Data.SpatialSchemaXY(); xy.XColumn = "X";
xy.YColumn = "Y";
xy.CoordSys = cs;
xy.NullPoint = "0.0, 0.0";
xy.StyleType = MapInfo.Data.StyleType.None;
MapInfo.Data.TableInfoAdoNet ti = new
MapInfo.Data.TableInfoAdoNet("US_Cust", dt);
ti.SpatialSchema = xy;
MapInfo.Data.Table tbl =
MapInfo.Engine.Session.Current.Catalog.CreateTable(ti);
mapxtreme mapxtreme练习笔记
//Create a feature layer and add it to the map
MapInfo.Mapping.FeatureLayer lyr = new
MapInfo.Mapping.FeatureLayer(tbl);
mapControl1.Map.Layers.Add(lyr);
附:SpatialSchemaXY:
表的服务,根据表中数据的 X 和 Y 数字值来创建 [临时] GeometryColumn。[www.61k.com]
XY 空间方案可以应用于不可制图的表,使其可制图。方法是指定包含 X 和 Y 坐标值的列以及这些值所表示的坐标系。表打开时,它包含 GeometryColumn 并可以作为图层添加到 Map 中。 几何体列 (MI_Geometry) 可以修改,它可以修改表中的 X 和 Y 值。这样就可以使用 Map 中的工具来移动几何体。X 和 Y 列被标记为只读。
7. 建立一个线缓冲区,并加载到地图中(还未实现)
MapInfo.Data.TableInfo ti =
MapInfo.Data.TableInfoFactory.CreateTemp("LineTable");
MapInfo.Data.Table t =
MapInfo.Engine.Session.Current.Catalog.CreateTable(ti);
MapInfo.Data.TableInfo ti2 =
MapInfo.Data.TableInfoFactory.CreateTemp("BufferTable");
MapInfo.Data.Table t2 =
MapInfo.Engine.Session.Current.Catalog.CreateTable(ti2);
MapInfo.Geometry.DPoint[] dPoints=new MapInfo.Geometry.DPoint[3] ; dPoints[0]=new MapInfo.Geometry.DPoint(-100, 40);
dPoints[1]=new MapInfo.Geometry.DPoint(-98,34);
dPoints[2]=new MapInfo.Geometry.DPoint(-90,25);
MapInfo.Geometry.MultiCurve curve= new MapInfo.Geometry.MultiCurve (mapControl1.Map.GetDisplayCoordSys(),MapInfo.Geometry.CurveSegmentType.Linear ,dPoints);
MapInfo.Geometry.FeatureGeometry curveBuffer = curve.Buffer(100, MapInfo.Geometry.DistanceUnit.Mile, 99);
MapInfo.Styles.SimpleLineStyle bl = new
MapInfo.Styles.SimpleLineStyle(new MapInfo.Styles.LineWidth(5, MapInfo.Styles.LineWidthUnit.Point));
MapInfo.Styles.CompositeStyle cs = new
MapInfo.Styles.CompositeStyle(null,bl, null, null);
MapInfo.Data.Feature f = new MapInfo.Data.Feature(curve, cs);
mapxtreme mapxtreme练习笔记
t.InsertFeature(f);
MapInfo.Styles.LineWidth lw=new
MapInfo.Styles.LineWidth(3,MapInfo.Styles.LineWidthUnit.Point ); MapInfo.Styles.SimpleLineStyle sl=new
MapInfo.Styles.SimpleLineStyle (lw);
MapInfo.Styles.SimpleInterior sis=new
MapInfo.Styles.SimpleInterior(9, System.Drawing.Color.Empty, System.Drawing.Color.Empty, true);
MapInfo.Styles.AreaStyle ar = new MapInfo.Styles.AreaStyle (sl,sis); MapInfo.Styles.CompositeStyle cs2 = new
MapInfo.Styles.CompositeStyle(ar,null,null,null);
MapInfo.Data.Feature f2 = new MapInfo.Data.Feature(curveBuffer, cs2); t2.InsertFeature(f2);
FeatureLayer fl = new FeatureLayer(t);
this.mapControl1.Map.Layers.Add(fl);
FeatureLayer fl2 = new FeatureLayer(t2);
this.mapControl1.Map.Layers.Add(fl2);
8. 计算一个多边形内点的数目(已完成)
Catalog catalog = Session.Current.Catalog;
Table table = catalog.GetTable("polygontable");
MapInfo.Mapping.FeatureLayer lyr = new MapInfo.Mapping.FeatureLayer(table);
MapInfo.Data.SearchInfo si = MapInfo.Data.SearchInfoFactory.SearchWhere("Field1 = 'er' ");
MapInfo.Data.Feature feature =
MapInfo.Engine.Session.Current.Catalog.SearchForFeature(lyr.Table, si);
MapInfo.Data.MIConnection connection = new MapInfo.Data.MIConnection(); connection.Open();
MapInfo.Data.MICommand command = connection.CreateCommand();
command.CommandText = "Select * from pointTable where PointTable.obj within @vb"; command.Parameters.Add("@vb", feature.Geometry);
command.Prepare();
MapInfo.Data.IResultSetFeatureCollection irfc =
command.ExecuteFeatureCollection();
MessageBox.Show(irfc.Count.ToString());
command.Dispose();
connection.Close();
irfc.Close();
mapxtreme mapxtreme练习笔记
9. 把当前的选择工具变为漫游工具
this.mapControl1.Tools.LeftButtonTool=
this.mapToolBarButtonPan.ToolId;
this.mapToolBarButtonSelect.Pushed = false;
this.mapToolBarButtonPan.Pushed = true;
10. 改变绘图样式
MapInfo.Styles.AreaStyle areaStyle = new MapInfo.Styles.AreaStyle();
MapInfo.Styles.SimpleLineStyle lineStyle = new MapInfo.Styles.SimpleLineStyle(); MapInfo.Styles.TextStyle textStyle = new MapInfo.Styles.TextStyle();
MapInfo.Styles.SimpleVectorPointStyle pointStyle = new
MapInfo.Styles.SimpleVectorPointStyle();
MapInfo.Styles.CompositeStyle cs = new MapInfo.Styles.CompositeStyle(areaStyle, lineStyle, textStyle, pointStyle);
this.mapControl1.Tools.AddMapToolProperties.CompositeStyle = cs;
11. 返回选择物信息(已完成)
public Form1()
{
InitializeComponent();
mapControl1.Tools.FeatureSelected += new
MapInfo.Tools.FeatureSelectedEventHandler(Tools_FeatureSelected);
}
//弹出信息
private void Tools_FeatureSelected(object sender,
MapInfo.Tools.FeatureSelectedEventArgs e)
{
if (e.ToolName == "Select")
{
MapInfo.Data.IResultSetFeatureCollection irfc =
MapInfo.Engine.Session.Current.Selections.DefaultSelection[0];
MapInfo.Data.Feature f = irfc[0];
MessageBox.Show(f["E_Name"].ToString())
}
}
//在listbox中显示所选物
private void button1_Click(object sender, EventArgs e)
{
MapInfo.Data.Table World =
MapInfo.Engine.Session.Current.Catalog.GetTable("GZ-landmark-LL-Shift");
mapxtreme mapxtreme练习笔记
MapInfo.Data.IResultSetFeatureCollection fc =
MapInfo.Engine.Session.Current.Selections.DefaultSelection[World];
lstFeatures.Items.Clear();
foreach (MapInfo.Data.Feature ftr in fc)
{
lstFeatures.Items.Add(ftr["E_Name"].ToString());
}
}
12. 一个简单的点对点路径分析(这个路径分析是使用mapinfo服
务器,得付费)
//need to add MapInfo.Services as a .Net Reference to the project IRouteClient client =
RouteClientFactory.GetRjsHttpClient("");
MapInfo.Geometry.DPoint start = new DPoint(-93.893312, 34.814135); MapInfo.Geometry.DPoint end = new DPoint(-94.067514, 34.636800); //simple point to point route
WayPointList wayPoints = new WayPointList(start, end);
RoutePlan routePlan = new RoutePlan(wayPoints);
RouteRequest request = new RouteRequest(routePlan,
DistanceUnit.Mile);
//return directions in response
RouteInstructionsRequest instr = new RouteInstructionsRequest(); instr.ReturnDirections = true;
request.RouteInstructionsRequest = instr;
//do not return geometry
RouteGeometryRequest geom = new RouteGeometryRequest();
geom.ReturnGeometry = false;
request.RouteGeometryRequest = geom;
//send request
RouteResponse RouteResp = client.Route(request);
String routeDistance = "";
//display results
routeDistance = RouteResp.RouteSummary.TotalDistance.ToString(); this.richTextBox1.Text="Total Distance: " +routeDistance;
System.TimeSpan time = RouteResp.RouteSummary.TotalTime;
this.richTextBox1.Text+="nTotal Time: " + time.ToString(); this.richTextBox1.Text+="nDirections:n";
if (RouteResp.RouteInstructionList!=null)
{
for (int i=0;i<RouteResp.RouteInstructionList.Length;i++)
{
mapxtreme mapxtreme练习笔记
this.richTextBox1.Text+=RouteResp.RouteInstructionList[i]+"n"; }
}
13. 把选择的结果填充到datagrid中
MapInfo.Data.MICommand cmd = Connection.CreateCommand();
cmd.CommandText = "select " + " Round(MI_Area(Obj,'sq mi','Spherical'),1) " + ",state from usa"; MapInfo.Data.MIDataReader tmpReader = cmd.ExecuteReader();
DataTable dt = new DataTable("Data");
for (int i = 0; i < tmpReader.FieldCount; i++)
{
DataColumn dc = dt.Columns.Add(tmpReader.GetName(i));
}
while (tmpReader.Read())
{
DataRow dr = dt.NewRow();
for (int i = 0; i < tmpReader.FieldCount; i++)
{
dr[i] = tmpReader.GetValue(i);
}
dt.Rows.Add(dr);
}
dataGrid1.DataSource = dt;
tmpReader.Close(); //otherwise it will cause an exception.
14. 设置导出图片的格式
dpt1 = new MapInfo.Geometry.DPoint MapInfo.Geometry.DPoint
(-99.9,40.3);
//克隆地图窗口
MapInfo.Mapping.Map map = (MapInfo.Mapping.Map) mapControl1.Map.Clone();
//create a MapExport object from the mapcontrol
MapInfo.Mapping.MapExport export = new MapInfo.Mapping.MapExport(map);
//设置大小
export.ExportSize = new MapInfo.Mapping.ExportSize(5000,5000,72); //设置范围
export.Map.SetView(dpt1,mapControl1.Map.GetDisplayCoordSys(),6000000);
//设置格式
export.Format = MapInfo.Mapping.ExportFormat.Jpeg;
mapxtreme mapxtreme练习笔记
export.Export(@"c:TemptestExport.jpeg");
15. Feature相关程序
1. 创建一个feature并加载到地图中
public static void MapInfo_Mapping_HowDoICreateFeatureAddToMap(MapControl mapControl1, MIConnection connection, double x, double y) {
Map map = mapControl1.Map;
//使用wldcty25作为一个模板
Table table = MapInfo.Engine.Session.Current.Catalog.GetTable("wldcty25"); //创建一个临时表并添加一个featurelayer
CoordSys coordSys = map.GetDisplayCoordSys();
TableInfoMemTable tableInfo = new TableInfoMemTable("temp");
tableInfo.Temporary = true;
// 添加一个 geometry column
Column column;
column = new GeometryColumn(coordSys);
column.Alias = "MI_Geometry";
column.DataType = MIDbType.FeatureGeometry;
tableInfo.Columns.Add(column);
// 添加样式 column
column = new Column();
column.Alias = "MI_Style";
column.DataType = MIDbType.Style;
tableInfo.Columns.Add(column);
Table pointTable = Session.Current.Catalog.CreateTable(tableInfo);
// 设置location并显示点
FeatureGeometry geometry = new MapInfo.Geometry.Point(coordSys, x, y); SimpleVectorPointStyle vStyle = new SimpleVectorPointStyle
(37, System.Drawing.Color.Red, 14); //矢量mapinfo符号
CompositeStyle cStyle = new MapInfo.Styles.CompositeStyle(vStyle);
//更新
MICommand cmd = connection.CreateCommand();
cmd.Parameters.Add("geometry", MIDbType.FeatureGeometry);
cmd.Parameters.Add("style", MIDbType.Style);
cmd.CommandText = "Insert Into temp (MI_Geometry,MI_Style) values
(geometry,style)";
cmd.Prepare();
cmd.Parameters[0].Value = geometry;
cmd.Parameters[1].Value = cStyle;
int nchanged = cmd.ExecuteNonQuery();
cmd.Dispose();
//把表加载到地图
map.Layers.Add(new MapInfo.Mapping.FeatureLayer(pointTable));
mapxtreme mapxtreme练习笔记
}
2. 插入一个feature
public static void MapInfo_Data_MICommand5(MICommand command, FeatureGeometry nyGeom) {
command.CommandText =
"Insert Into States (Obj, State, State_Name) " +
"Values (@stobj, 'NY', 'New York')";
command.Parameters.Add("@stobj", nyGeom);
int NumberOfRecordsAffected = command.ExecuteNonQuery();
}
3. 向地图中插入一个特殊的feature
public void Load_Table_Feature()
{
Table usa = Session.Current.Catalog["USA"];
// 获得我们所需要的属性值
Columns schema = new Columns();
schema.Add(usa.TableInfo.Columns["MI_Geometry"].Clone());
schema.Add(usa.TableInfo.Columns["MI_Style"].Clone());
schema.Add(usa.TableInfo.Columns["State"].Clone());
schema.Add(usa.TableInfo.Columns["State_Name"].Clone());
schema.Add(usa.TableInfo.Columns["Pop_1990"].Clone());
// 创建一个关键字key
Key key = new Key();
Feature feature = null;
key.Value = "20"; // 这是要检索的记录.
feature = new Feature(usa, key, schema);
// 刚创建了当feature的属性被访问时自动加载功能
// 验证功能是否有效
try
{
feature.Load();
Console.Out.WriteLine("Feature identified by Key='" + feature.Key.ToString() + "' hass successfully been retrieved.");
}
catch (FeatureException ftrException)
{
Console.Out.WriteLine(ftrException.ToString());
}
}
4. 选择geometry的样式
public static void MapInfoGeometryType(MapInfo.Geometry.Geometry geometry)
{
switch (geometry.Type)
{
mapxtreme mapxtreme练习笔记
case GeometryType.Envelope:
Envelope envelope = geometry as Envelope;
// ... treat the object as an Envelope object
break;
case GeometryType.MultiPolygon:
MultiPolygon multiPolygon = geometry as MultiPolygon;
// ... treat the object as an MultiPolygon object
break;
case GeometryType.Curve:
Curve curve = geometry as Curve;
// ... treat the object as a Curve object
break;
default:
// we should never get here
break;
}
}
16. 添加一个加载图片的自定义标签工具(已完成)
public Form1()
{
InitializeComponent();
//添加为自定义加载点工具
MapInfo.Tools.MapTool ptMapTool = new MapInfo.Tools.CustomPointMapTool(false, this.mapControl1.Tools.FeatureViewer, this.mapControl1.Handle.ToInt32(),
this.mapControl1.Tools, this.mapControl1.Tools.MouseToolProperties,
this.mapControl1.Tools.MapToolProperties);
//使用自定义光标
ptMapTool.UseDefaultCursor = false;
//ptMapTool.Cursor = new System.Windows.Forms.Cursor(@"C:Program FilesCommon FilesMapInfoMapXtreme6.1WebResourcesMapInfoWebRectangleSelection.cur");
this.mapControl1.Tools.Add("CustomAddBitmapPointTool", ptMapTool);
this.mapControl1.Tools.Used += new MapInfo.Tools.ToolUsedEventHandler(ToolUsed); MapInfo.Data.TableInfo ti = MapInfo.Data.TableInfoFactory.CreateTemp("Temp"); MapInfo.Data.Table table =
MapInfo.Engine.Session.Current.Catalog.CreateTable(ti);
FeatureLayer fl = new FeatureLayer(table);
this.mapControl1.Map.Layers.Add(fl);
}
private void ToolUsed(object sender, MapInfo.Tools.ToolUsedEventArgs e)
{
if (e.ToolName == "CustomAddBitmapPointTool")
{
MapInfo.Styles.BitmapPointStyle bitmappointstyle = new
mapxtreme mapxtreme练习笔记
MapInfo.Styles.BitmapPointStyle("GLOB1-32.bmp", MapInfo.Styles.BitmapStyles.None, new Color(),
30);
MapInfo.Geometry.Point point = new
MapInfo.Geometry.Point(this.mapControl1.Map.GetDisplayCoordSys(), e.MapCoordinate.x, e.MapCoordinate.y);
MapInfo.Data.Feature ftr = new MapInfo.Data.Feature(point, bitmappointstyle); MapInfo.Data.Table tab =
MapInfo.Engine.Session.Current.Catalog.GetTable("Temp");
tab.InsertFeature(ftr);
}
}
17. 比例尺和标签修饰(已完成)
public static void MapInfo_Mapping_ScaleBarAdornment(MapControl mapControl1) {
//创建一个scalebar
ScaleBarAdornment sba = new ScaleBarAdornment(mapControl1.Map);
//指定scalebar的位置
int x = mapControl1.Map.Size.Width - sba.Size.Width;
int y = mapControl1.Map.Size.Height - sba.Size.Height;
sba.Location = new System.Drawing.Point(x, y);
//加载到地图
ScaleBarAdornmentControl sbac = new ScaleBarAdornmentControl(sba,
mapControl1.Map);
mapControl1.AddAdornment(sba, sbac);
}
public static void MapInfo_Mapping_TitleAdornment(MapControl mapControl1)
{
// 创建Titlebar
TitleAdornment ta = new TitleAdornment(new Size(100, 50), mapControl1.Map); ta.Title = "这是我的地图";
mapControl1.Map.Adornments.Append(ta);
}
18. 使用专题和图例
? 等级符号专题(已完成)
public static void MapInfo_Mapping_Thematics_GraduatedSymbolTheme(Map map)
{
map.Load(new MapTableLoader("mexico.tab"));
FeatureLayer lyr = map.Layers["mexico"] as FeatureLayer;
// 创建一个新的分级符号专题
GraduatedSymbolTheme gradTheme = new GraduatedSymbolTheme(lyr.Table, "Pop_90"); // 创建一个分级符号对象主题
ObjectThemeLayer thmLayer = new ObjectThemeLayer("Mexico Pop Growth Rate", null,
mapxtreme mapxtreme练习笔记
gradTheme);
//加载对象主题到地图集
map.Layers.Add(thmLayer);
// 对象主题分级方式
gradTheme.GraduateSizeBy = GraduateSizeBy.Constant;
// 不显示负值
gradTheme.ShowNegativeSymbol = false;
gradTheme.PositiveSymbol = new SimpleVectorPointStyle(42, System.Drawing.Color.Red, 10.0);
thmLayer.RebuildTheme();
}
private void SetupTablePath()
{
Microsoft.Win32.RegistryKey key =
Microsoft.Win32.Registry.LocalMachine.CreateSubKey(@"SOFTWAREMapInfoMapXtreme6.7.1"); string s = (string)key.GetValue("SampleDataSearchPath");
if (s != null && s.Length > 0)
{
if (s.EndsWith("") == false)
{
s += "";
}
}
else
{
s = Environment.CurrentDirectory;
}
key.Close();
Session.Current.TableSearchPath.Path = s;
}
private void Form1_Load(object sender, EventArgs e)
{
SetupTablePath();
MapInfo_Mapping_Thematics_GraduatedSymbolTheme(mapControl1.Map);
}
19. 相对路径加载地图
private void SetupTablePath()
{
Microsoft.Win32.RegistryKey key =
Microsoft.Win32.Registry.LocalMachine.CreateSubKey(@"SOFTWAREMapInfoMapXtreme6.7.1"); string s = (string)key.GetValue("SampleDataSearchPath");
if (s != null && s.Length > 0)
mapxtreme mapxtreme练习笔记
{
if (s.EndsWith("") == false)
{
s += "";
}
}
else
{
s = Environment.CurrentDirectory;
}
key.Close();
Session.Current.TableSearchPath.Path = s;
}
private void Setup()
{
mapControl1.Map.Load(new MapTableLoader("mexico.tab"));
FeatureLayer layer = mapControl1.Map.Layers["mexico"] as FeatureLayer; LabelLayer labelLayer = new LabelLayer("Label Layer", "Label Layer"); labelLayer.Sources.Append(new LabelSource(layer.Table));
mapControl1.Map.Layers.Add(labelLayer);
}
20. SearchInfoFactory类
下面将用到的几个类
private void ShowSearchGeometry(FeatureGeometry g)
{ } { if (clear) { } Style s=null; if (g is IGenericSurface) //关闭几何形状,使用面积风格 { } else if (g is MapInfo.Geometry.Point) { s = new SimpleVectorPointStyle(34, Color.Red, 18); s = new AreaStyle(new SimpleLineStyle(new LineWidth(2, LineWidthUnit.Pixel), 2, Color.Red, false), new SimpleInterior(0)); //首先清除表中的其他几何形状 (_tempTable as IFeatureCollection).Clear(); ShowSearchGeometry(g, true); private void ShowSearchGeometry(FeatureGeometry g, bool clear)
mapxtreme mapxtreme练习笔记
} { } mapControl1.Update(); _selection.Clear(); _selection.Add(fc); } Feature f = new Feature(g, s); // A添加feature 到临时表 _tempTable.InsertFeature(f); private void SelectFeatureCollection(IResultSetFeatureCollection fc)
方法
private Map _map=null; //将被设置为从MapControl的地图
private Selection _selection=Session.Current.Selections.DefaultSelection;
//找到并选择POP_90 > 2000000所有国家 IResultSetFeatureCollection fc = _catalog.Search("mexico", si); //设置地图以显示搜索结果 _map.SetView(fc.Envelope); //作为选择显示结果 SelectFeatureCollection(fc); SearchInfo si = MapInfo.Data.SearchInfoFactory.SearchWhere("POP_90 > 2000000");
方法——在表几何体包含在搜索几何体内的位置 // 查找并选择 Georgia 和 Florida图元中包含的城市
Feature fFlorida = _catalog.SearchForFeature("usa", Feature fGeorgia = _catalog.SearchForFeature("usa", FeatureGeometry g = fFlorida.Geometry.Combine(fGeorgia.Geometry); SearchInfo si = MapInfo.Data.SearchInfoFactory.SearchWithinGeometry(g, IResultSetFeatureCollection fc = _catalog.Search("uscty_1k", si); // 设置地图来显示结果 _map.SetView(fc.Envelope); ShowSearchGeometry(g); // 作为选择结果显示 SelectFeatureCollection(fc); // 查找和KS相加的图元 Feature fKS = _catalog.SearchForFeature("usa", SearchInfo si = MapInfo.Data.SearchInfoFactory.SearchIntersectsFeature(fKS, IResultSetFeatureCollection fc = _catalog.Search("usa", si); MapInfo.Data.SearchInfoFactory.SearchWhere("State='FL'")); MapInfo.Data.SearchInfoFactory.SearchWhere("State='GA'")); ContainsType.Centroid); 方法——在表几何体包含在搜索图元几何体内的位置 MapInfo.Data.SearchInfoFactory.SearchWhere("State='KS'")); IntersectType.Geometry);
mapxtreme mapxtreme练习笔记
_map.SetView(fc.Envelope); ShowSearchGeometry(fKS.Geometry); SelectFeatureCollection(fc); 方法——在表几何体包含在搜索几何体的缓冲区内的位置
System.Drawing.Rectangle rect = mapControl1.Bounds;
System.Drawing.Point pt = new System.Drawing.Point(rect.Left, rect.Top); pt.X += rect.Width / 2;
pt.Y += rect.Height / 2;
DPoint dpt1 = new DPoint(); //转换映射及其COORDS中心点 _map.DisplayTransform.FromDisplay(pt, out dpt1); Distance d = MapInfo.Mapping.SearchInfoFactory.ScreenToMapDistance(_map, SearchInfo si = MapInfo.Data.SearchInfoFactory.SearchWithinDistance(dpt1, IResultSetFeatureCollection fc = _catalog.Search("uscty_1k", si); // show search geometry on screen for visual confirmation MapInfo.Geometry.Point p = new FeatureGeometry buffer = p.Buffer(d.Value, d.Unit, 20, ShowSearchGeometry(buffer); SelectFeatureCollection(fc); rect.Width/6); _map.GetDisplayCoordSys(), d, ContainsType.Centroid); MapInfo.Geometry.Point(_map.GetDisplayCoordSys(), dpt1); DistanceType.Spherical);
方法(已完成)——在表几何体与搜索几何体相交的位置,创建返回行的 SearchInfo
Table ti = MapInfo.Engine.Session.Current.Catalog.GetTable("usa");
MapInfo.Mapping.FeatureLayer lParks =
(MapInfo.Mapping.FeatureLayer)map.Layers["USA"];
MapInfo.Geometry.FeatureGeometry g = new
MapInfo.Geometry.Point(map.GetDisplayCoordSys(), -117, 38);
SearchInfo si = MapInfo.Data.SearchInfoFactory.SearchIntersectsGeometry(g, MapInfo.Data.IntersectType.Geometry);
IResultSetFeatureCollection fc = Session.Current.Catalog.Search("usa", si); map.SetView(fc.Envelope);
21. 可制图表的一个研究
问题由一段判断两条线交点的代码引出:
//创建临时表
MapInfo.Data.TableInfoMemTable
MapInfo.Data.TableInfoMemTable("memT");
MapInfo.Data.Table
table=MapInfo.Engine.Session.Current.Catalog.CreateTable(ti); ti=new
mapxtreme mapxtreme练习笔记
//创建直线
MapInfo.Geometry.MultiCurve line1=MapInfo.Geometry.MultiCurve.CreateLine( this.mapControl1.Map.GetDisplayCoordSys(),
new MapInfo.Geometry.DPoint(710,360),new MapInfo.Geometry.DPoint(32,69));
MapInfo.Geometry.MultiCurve line2=MapInfo.Geometry.MultiCurve.CreateLine( this.mapControl1.Map.GetDisplayCoordSys(),
new MapInfo.Geometry.DPoint(79,210),new MapInfo.Geometry.DPoint(510,120));
//显示直线
MapInfo.Data.Feature f=new MapInfo.Data.Feature(line1,new MapInfo.Styles.CompositeStyle());
table.InsertFeature(f);
f=new MapInfo.Data.Feature(line2,new MapInfo.Styles.CompositeStyle()); table.InsertFeature(f);
MapInfo.Mapping.IMapLayer layer=new MapInfo.Mapping.FeatureLayer(table); this.mapControl1.Map.Layers.Add(layer);
//获取交点
MapInfo.Geometry.MultiPoint
mpoint=line1.IntersectNodes(line2,MapInfo.Geometry.IntersectTypes.InclAll);
//显示交点
this.listBox1.Items.Add("x: "+mpoint[0].x.ToString());
this.listBox1.Items.Add("y: "+mpoint[0].y.ToString());
这段代码在编译时系统会出现如下错误:
Unable to parse statement: insert into "memT"(obj,MI_Style) values(@0,@1):Invalid identifier(obj).
原因何在?通过查看帮助文件发现原来是对Table表结构缺乏深入了解所致.
Table 类是MapXtreme中所有数据访问的基本单元。(www.61k.com)Table、Column 和所有 TAB 文件元数据信息可以从 MapInfo Table 访问。表可以是可制图(包含 FeatureGeometry 类型的列,大多数表类型的几何体列都被赋予了名称“Obj”。)或不可制图的表。表不在地图中显示时也可以打开和访问。
需要说明的是可制图的表不仅要包含FeatureGeometry 类型的列MI_Geometry,而且还要包含MI_Style列。
看来问题出自声明了TableInfoMemTable对象,却没有定义MI_Geometry列和MI_Style列. 修改部分代码如下:
//创建临时表
MapInfo.Data.TableInfoMemTable ti=new MapInfo.Data.TableInfoMemTable("memT");
ti.Columns.Add(MapInfo.Data.ColumnFactory.CreateFeatureGeometryColumn( this.mapControl1.Map.GetDisplayCoordSys()));
ti.Columns.Add(MapInfo.Data.ColumnFactory.CreateStyleColumn());
MapInfo.Data.Table
table=MapInfo.Engine.Session.Current.Catalog.CreateTable(ti);
mapxtreme mapxtreme练习笔记
再编译,通过.
其实,如果使用TableInfoFactory,可能会更简单些,因为TableInfoFactory的CreateTemp方法在创建临时表的时候,也创建了Geometry 列和 Style 列. 代码如下:
//创建临时表
MapInfo.Data.TableInfo ti=MapInfo.Data.TableInfoFactory.CreateTemp("t"); MapInfo.Data.Table
table=MapInfo.Engine.Session.Current.Catalog.CreateTable(ti)
22. 两种方法实现动态轨迹
在GIS中,动态轨迹的实现是非常有用的,可用GPS定位,热点跟踪等。[www.61k.com)在本例中,先创建一个用于呈现动态轨迹的临时图层,并在图层上添加一个点表示位体的位置。代码如下: 复制内容到剪贴板
代码:
/**//// <summary>
/// 创建动态轨迹图层
/// 2008年8月7日
/// <param name="trackLayerTableName">图层表名</param>
/// <param name="trackLayerName">图层名</param>
/// <param name="firstPoint">点初始坐标</param>
/// </summary>
protected void CreateTrackLayer(string trackLayerTableName, string trackLayerName, DPoint firstPoint)
{
MapInfo.Mapping.Map myMap = MapInfo.Engine.Session.Current.MapFactory[MapControl1.MapAlias];
//创建临时图层
MapInfo.Data.TableInfoMemTable tblInfoTemp = new MapInfo.Data.TableInfoMemTable(trackLayerTableName);
MapInfo.Data.Table tblTemp = MapInfo.Engine.Session.Current.Catalog.GetTable(trackLayerTableName);
if (tblTemp != null)
{
MapInfo.Engine.Session.Current.Catalog.CloseTable(trackLayerTableName);
}
tblInfoTemp.Columns.Add(MapInfo.Data.ColumnFactory.CreateFeatureGeometryColumn(myMap.GetDisplayCoordSys()));
tblInfoTemp.Columns.Add(MapInfo.Data.ColumnFactory.CreateStyleColumn());
tblTemp = MapInfo.Engine.Session.Current.Catalog.CreateTable(tblInfoTemp);
mapxtreme mapxtreme练习笔记
FeatureLayer workLayer = new FeatureLayer(tblTemp, AnimationLayerName, AnimationLayerName);
myMap.Layers.Add(workLayer);
//向临时图层中添加初始点
FeatureGeometry pfg = new MapInfo.Geometry.Point(workLayer.CoordSys, firstPoint.x, firstPoint.y) as FeatureGeometry;
MapInfo.Styles.CompositeStyle cstyle = new MapInfo.Styles.CompositeStyle(new MapInfo.Styles.SimpleVectorPointStyle(52, System.Drawing.Color.Blue, 30));
MapInfo.Data.Feature pft = new MapInfo.Data.Feature(tblTemp.TableInfo.Columns); pft.Geometry = pfg;
pft.Style = cstyle;
workLayer.Table.InsertFeature(pft);
}
实现动态轨迹的第一种方法是,对原来点的坐标的位置进行偏移,从实现位置的更新。[www.61k.com)代码如下:
/**//// <summary>
/// 把原来的点偏移到新的位置以实现动态轨迹
/// Glacier
/// 2008年8月7日
/// <param name="trackLayerTableName">图层表名</param>
/// <param name="newPoint">点的新坐标</param>
/// </summary>
protected void UpdateTrack(string trackLayerTableName, DPoint newPoint)
{
MapInfo.Data.Table altb = MapInfo.Engine.Session.Current.Catalog.GetTable(trackLayerTableName);
if (altb == null)
{
return;
}
//Change the positon of the existed feature.
SearchInfo si = MapInfo.Data.SearchInfoFactory.SearchWhere("");
Feature ftr = MapInfo.Engine.Session.Current.Catalog.SearchForFeature(altb, si);
if (ftr == null)
{
return;
mapxtreme mapxtreme练习笔记
}
DPoint offsetPoint = new DPoint(newPoint.x - ftr.Geometry.Centroid.x, newPoint.y - ftr.Geometry.Centroid.y);
ftr.Geometry.GetGeometryEditor().OffsetByXY(offsetPoint.x, offsetPoint.y, DistanceUnit.Degree, DistanceType.Spherical);
ftr.Geometry.EditingComplete();
ftr.Update();
}
实现动态轨迹的第二种方法是,先删除原有的点,再在新的位置添加一个新点。(www.61k.com]因为第一种方法求偏移过程中可能会产生误差,并且这种误差是会积累的。而这种方法相对来说会比较精确一点。代码如下:
/**//// <summary>
/// 把删除原有点并向图层中添加新点以实现动态轨迹
/// Glacier
/// 2008年8月7日
/// <param name="trackLayerTableName">图层表名</param>
/// <param name="newPoint">点的新坐标</param>
/// </summary>
protected void UpdateTrack(string trackLayerTableName, DPoint newPoint)
{
MapInfo.Data.Table altb = MapInfo.Engine.Session.Current.Catalog.GetTable(trackLayerTableName);
if (altb == null)
{
return;
}
//删除已有的图元,并创建一个新图元
SearchInfo si = MapInfo.Data.SearchInfoFactory.SearchWhere("");
Feature dftr = MapInfo.Engine.Session.Current.Catalog.SearchForFeature(altb, si);
if (dftr == null)
{
return;
}
altb.DeleteFeature(dftr);
MapInfo.Mapping.Map myMap = MapInfo.Engine.Session.Current.MapFactory[MapControl1.MapAlias];
FeatureGeometry pfg = new MapInfo.Geometry.Point(myMap.GetDisplayCoordSys(), new DPoint(newPoint.x, newPoint.y)) as FeatureGeometry;
mapxtreme mapxtreme练习笔记
MapInfo.Styles.CompositeStyle cstyle = new MapInfo.Styles.CompositeStyle(new MapInfo.Styles.SimpleVectorPointStyle(52, System.Drawing.Color.Blue, 30));
MapInfo.Data.Feature pft = new MapInfo.Data.Feature(altb.TableInfo.Columns);
pft.Geometry = pfg;
pft.Style = cstyle;
altb.InsertFeature(pft);
}
23.
// 定义
public int cs=0;
public int cs1=0;
MapInfo.Geometry.DPoint dp1;
MapInfo.Geometry.DPoint dp2;
FeatureLayer layerTemp1;
// 运动轨迹
private void contrail(double x,double y)
{
try
{
// 目录
Catalog Cat = MapInfo.Engine.Session.Current.Catalog;
// 创建临时层 (TableInfoMemTable 内存表/临时表)
TableInfoMemTable tblInfoTemp = new TableInfoMemTable("contrail");
// Table 打开的表
Table tblTemp = Cat.GetTable("contrail");
// 如果表不为空
if (tblTemp != null)
{
Cat.CloseTable("contrail");
}
// 列重载.构造新的 GeometryColumn 实例
tblInfoTemp.Columns.Add(ColumnFactory.CreateFeatureGeometryColumn(mapControl1.Map.GetDisplayCoordSys()));
// 构造 Style 类型的新 Column 实例
tblInfoTemp.Columns.Add(ColumnFactory.CreateStyleColumn());
// 构造 String 类型的新 Column 实例
tblInfoTemp.Columns.Add(ColumnFactory.CreateStringColumn("Name", 40)); 运动轨迹的代码(桌面程序用)
mapxtreme mapxtreme练习笔记
tblInfoTemp.Columns.Add(ColumnFactory.CreateStringColumn("Dept", 15));
// 构造 Int 类型的新 Column 实例
tblInfoTemp.Columns.Add(ColumnFactory.CreateIntColumn("Level"));
// 将临时表 加入 打开的表中
tblTemp = Cat.CreateTable(tblInfoTemp);
// 图层
FeatureLayer lyr = new FeatureLayer(tblTemp);
mapControl1.Map.Layers.Add(lyr);
// 点坐标
MapInfo.Geometry.DPoint dp;
dp.x=x;
dp.y=y;
// ---- 创建点
FeatureGeometry pt = new MapInfo.Geometry.Point(lyr.CoordSys, new DPoint(dp.x, dp.y)) as FeatureGeometry;
// 点样式
CompositeStyle cs = new CompositeStyle(new SimpleVectorPointStyle(37, System.Drawing.Color.Red,
10));
// 点图元
Feature ftr = new Feature(tblTemp.TableInfo.Columns);
// 设置图元
ftr.Geometry = pt;
ftr.Style = cs;
ftr["Name"] = "carContrail";
ftr["Dept"] = "Sales";
ftr["Level"] = 3;
// 将图元 加入 表中
tblTemp.InsertFeature(ftr);
// ---- 结束创建点
// 创建线-轨迹
if (cs1>0)
{
dp1.x=dp2.x;
dp1.y=dp2.y;
dp2.x=x;
dp2.y=y;
// Multi(多) Curve(线) 类型 第一点 第二点
MultiCurve multicurve = MapInfo.Geometry.MultiCurve.CreateLine(mapControl1.Map.GetDisplayCoordSys(),dp1,dp2);
mapxtreme mapxtreme练习笔记
// 线图元
Feature f = new Feature(multicurve,new MapInfo.Styles.SimpleLineStyle());
if (layerTemp1 != null)
{
// 清除图元
//(lyr.Table as ITableFeatureCollection).Clear();
// 插入图元
layerTemp1.Table.InsertFeature(f);
}
}
dp2.x=x;
dp2.y=y;
cs1=cs1+1;
// ---- 结束创建线
}
catch(Exception ex)
{
ex.GetType().ToString();
}
}
// 增加图层
private void AddFeatureLayer()
{
try
{
MapInfo.Data.Table tblTemp1 =Session.Current.Catalog.GetTable("Temp1");
if (tblTemp1!=null)
{
tblTemp1.Close();
}
layerTemp1=new FeatureLayer(Session.Current.Catalog.CreateTable(TableInfoFactory.CreateTemp("Temp1"), new TableSessionInfo()));
mapControl1.Map.Layers.Add(layerTemp1);
}
catch(Exception ex)
{
ex.GetType().ToString();
}
}
// 测试
private void ceshi()
{
if(cs==0)
{
mapxtreme mapxtreme练习笔记
AddFeatureLayer();
contrail(112.8546,34.1660);
}
if(cs==1)
{
contrail(112.9976,33.8425);
}
if(cs==2)
{
contrail(113.1025,33.3088);
}
if(cs==3)
{
contrail(113.6271,33.1713);
}
if(cs==4)
{
contrail(113.2361,32.4031);
}
if(cs==5)
{
contrail(113.7606,31.9018);
}
if(cs==6)
{
contrail(113.6939,31.1093);
}
if(cs==7)
{
contrail(114.1041,30.4705);
}
if(cs==8)
{
contrail(113.2361,29.7508);
}
cs=cs+1;
}
// 说明
1.定义部分为全局参数定义
2.AddFeatureLayer() 为建立一个临时层 用于存放运动轨迹
3.contrail(double x,double y) 部分为建立内存表和临时层 用于存放 点/小车 如果希望每点都保留下来 可以将点加入
AddFeatureLayer()建立的临时层 方法见画线里方法
mapxtreme mapxtreme练习笔记
4.ceshi() 用于取数据 我是直接写在窗体里的/图个方便 可以从数据库读取数据 建立个btn调用 ceshi 或者用tirme调用ceshi
24. MapXtreme中桌面信息工具(InfoTool)的简单实现
实现InfoTool的一个方法:使用Select工具,在ToolUsed事件处理函数中调用GetInfo方法(自己写的获取当前选择集的属性信息的方法)。(www.61k.com]
(1).在窗体构造函数中将ToolUsed事件处理函数添加到对应的委托中:
public Form1()
{
InitializeComponent();
// add Tools_Used to ToolUsedEventHandler to handle the Select tool's use event
mapControl1.Tools.Used += new
MapInfo.Tools.ToolUsedEventHandler(Tools_Used);
}
(2).设置当前鼠标左键工具为Select工具:
private void btnSelectTool_Click(object sender, EventArgs e)
{
mapControl1.Tools.LeftButtonTool = "Select";
}
(3).在ToolUsed处理函数中判断如果是Select工具,则调用GetInfo方法:
private void Tools_Used(object sender, MapInfo.Tools.ToolUsedEventArgs e) {
switch (e.ToolName)
{
case "Select":
{
// if the select tool used,call GetInfo method to show the feature's information
this.GetInfo(this);
// Note: the break keyword is needed
break;
}
}
}
(4).GetInfo方法的具体实现,用来获取Select工具当前选择的图元的属性信息: private void GetInfo(object sender)
{
listBox1.Items.Clear();
MapInfo.Engine.ISession session=MapInfo.Engine.Session.Current; // specify which layer dose the feature belongs to
FeatureLayer lyr = mapControl1.Map.Layers[comboBox1.Text] as
FeatureLayer;
mapxtreme mapxtreme练习笔记
// hold the default selection(the features you clicked) in the // IResultSetFeatureCollection
IResultSetFeatureCollection rsfc
=session.Selections.DefaultSelection[lyr.Table];
if (rsfc != null) // an exception will be thrown if you remove this if-clause {
// go through the default selection-the features
foreach (Feature f in rsfc)
{
// the columns of each feature
foreach (MapInfo.Data.Column col in f.Columns)
{
// show each field of every feature
listBox1.Items.Add(string.Format("{0}:{1}", col.ToString(), f[col.ToString()].ToString()));
}
}
}
}
25. 在MapXtreme2004 地图中创建一个显示动态小车的图层
private
void btnInitializeObjects_Click(object sender, System.EventArgs e)
{
Catalog Cat = MapInfo.Engine.Session.Current.Catalog;
//创建临时层
TableInfoMemTable tblInfoTemp = new TableInfoMemTable("Animation");
Table tblTemp = Cat.GetTable("Animation");
if (tblTemp != null) //Table exists close it
{
Cat.CloseTable("Animation");
}
tblInfoTemp.Columns.Add(ColumnFactory.CreateFeatureGeometryColumn(mapControl1.M
mapxtreme mapxtreme练习笔记
ap.GetDisplayCoordSys()));
tblInfoTemp.Columns.Add(ColumnFactory.CreateStyleColumn());
tblInfoTemp.Columns.Add(ColumnFactory.CreateStringColumn("Name", 40));
tblInfoTemp.Columns.Add(ColumnFactory.CreateStringColumn("Dept", 15));
tblInfoTemp.Columns.Add(ColumnFactory.CreateIntColumn("Level"));
tblTemp = Cat.CreateTable(tblInfoTemp);
FeatureLayer lyr = new FeatureLayer(tblTemp);
mapControl1.Map.Layers.Add(lyr);
//创建点-车
FeatureGeometry pt = new MapInfo.Geometry.Point(lyr.CoordSys, new DPoint(-76, 42)) as FeatureGeometry;
CompositeStyle cs = new CompositeStyle(new SimpleVectorPointStyle(37, System.Drawing.Color.Red, 10));
Feature ftr = new Feature(tblTemp.TableInfo.Columns);
ftr.Geometry = pt;
ftr.Style = cs;
ftr["Name"] = "Kelly";
ftr["Dept"] = "Sales";
ftr["Level"] = 3;
tblTemp.InsertFeature(ftr);
FeatureGeometry pt2 = new MapInfo.Geometry.Point(lyr.CoordSys, new DPoint(-119, 34)) as FeatureGeometry;
CompositeStyle cs2 = new CompositeStyle(new SimpleVectorPointStyle(44, System.Drawing.Color.Purple, 10));
Feature ftr2 = new Feature(tblTemp.TableInfo.Columns);
mapxtreme mapxtreme练习笔记
ftr2.Geometry = pt2;
ftr2.Style = cs2;
ftr2["Name"] = "Greg";
ftr2["Dept"] = "Marketing";
ftr2["Level"] = 2;
tblTemp.InsertFeature(ftr2);
}
// 对于表中所有对象的移动
private void timer1_Tick(object sender, System.EventArgs e)
{
Catalog cat = MapInfo.Engine.Session.Current.Catalog;
Table tbl = cat.GetTable("Animation");
if (tbl != null)
{
//更新点的位置
tbl.BeginAccess (MapInfo.Data.TableAccessMode.Write );
foreach (Feature fcar in tbl)
{
fcar.Geometry.GeometryEditor.OffsetByXY(0.5,0,MapInfo.Geometry.DistanceUnit.Degree,MapInfo.Geometry.DistanceType.Spherical);
fcar.Geometry.EditingComplete();
fcar.Update();
}
tbl.EndAccess ();
}
26. 地图图元的闪烁效果制作
实现查找之后如果加上一个闪烁效果会更明显,方法是用个时间控件控制,改变vstyle即可;
还可以简单的设置进程休眠时间,改变可视性,利用一个循环,控制闪烁次数。[www.61k.com] 前面一种实现代码如下:
mapxtreme mapxtreme练习笔记
用个时间控件控制,改变
vstyle
FeatureLayer fl = this.mapControl1.Map.Layers["pathLine"] as
FeatureLayer;
FeatureOverrideStyleModifier fsm2 =
new FeatureOverrideStyleModifier("fsm2", "fsm2",
new MapInfo.Styles.CompositeStyle(new
MapInfo.Styles.AreaStyle(new MapInfo.Styles.SimpleLineStyle(new
MapInfo.Styles.LineWidth(3, MapInfo.Styles.LineWidthUnit.Pixel), 2, System.Dra
wing.Color.Purple), new
MapInfo.Styles.SimpleInterior(2, System.Drawing.Color.Yellow))));
//Removes the old modifier
fl.Modifiers.Remove("fsm1");
//Adds the new modifier
fl.Modifiers.Append(fsm2);
27. 根据名称搜索图元,高亮显示,显示信息
//根据名称搜索
SearchInfo si = MapInfo.Data.SearchInfoFactory.SearchWhere("Country like '%" + txtName.Text + "%'");
IResultSetFeatureCollection ifs = MapInfo.Engine.Session.Current.Catalog.Search("world",si);
if (ifs.Count <=0)
{
return;
}
//缩放到选择图元范围
MapMain.Map.SetView(ifs.Envelope);
MapMain.Map.Scale = MapMain.Map.Scale * 2;
//高亮显示
MapInfo.Engine.Session.Current.Selections.DefaultSelection.Clear();
MapInfo.Engine.Session.Current.Selections.DefaultSelection.Add(ifs);//高亮显示也就是取默认值,默认值为高亮显示的
//输出查询信息
ListBox1.Items.Clear();
mapxtreme mapxtreme练习笔记
ListBox1.Items.Add("图层:
" + ifs.BaseTable.Alias.ToString());
foreach (Feature feature in ifs)
{
//显示每个选择图元的属性数据
foreach (Column column in
feature.Columns)
{
ListBox1.Items.Add(" " + column.ToString() + " = " + feature[column.ToString()].ToString());
} ListBox1.Items.Add("____________________________");
}
28. 画线轨迹
29. 多点画一线
mapxtreme mapxtreme练习笔记
FeatureGeometry pt = new MultiCurve(Layer.CoordSys, CurveSegmentType.Linear,点数组);
SimpleLineStyle lineStyle = new SimpleLineStyle(new LineWidth(4, LineWidthUnit.Pixel), 线样式,颜色);
CompositeStyle comStyle = new CompositeStyle(lineStyle);
Feature feature = new MapInfo.Data.Feature(Table.TableInfo.Columns);
feature.Geometry = pt;
feature.Style = comStyle;
Table.InsertFeature(feature);
30. 改变线或区域的样式
SimpleLineStyle lineStyle = new SimpleLineStyle(new LineWidth(4, LineWidthUnit.Pixel),2,System.Drawing.Color.Red,true);
AreaStyle areaStyle = new MapInfo.Styles.AreaStyle(lineStyle, new MapInfo.Styles.SimpleInterior(9,System.Drawing.Color.Blue, System.Drawing.Color.Blue, true));
Session.Current.Selections.DefaultSelection.Style.AreaStyle.ApplyStyle(areaStyle);
Session.Current.Selections.DefaultSelection.Style.LineStyle.ApplyStyle(lineStyle);
31. 显示多边形
FeatureGeometry pt =new MultiPolygon(Layer.CoordSys, CurveSegmentType.Linear,polyPoint[bean.ID_Road.Value].ToArray());
SimpleInterior polyStyle = new SimpleInterior(9, System.Drawing.Color.Blue, System.Drawing.Color.Blue, true);
CompositeStyle comStyle = new CompositeStyle(polyStyle);
Feature feature = new MapInfo.Data.Feature(Table.TableInfo.Columns);
feature.Geometry = pt;
feature.Style = comStyle;
Table.InsertFeature(feature);
32. 添加图元
mapxtreme mapxtreme练习笔记
33. 控制显示比例
1. 添加mapcontrol.map.viewchangevent事件处理委派
mapControl1.Map.ViewChangedEvent += new ViewChangedEventHandler(Map_ViewChanged);
2. 编写事件处理函数
private void map_viewchangedevent(object o, MapInfo.Mapping.ViewChangedEventArgs e) {
if (mapControl1.Map.Scale >= 1000)
mapControl1.Map.Scale = 1000;
}
34. 显示多行InfoTips
把鼠标放在图元上点击一下,就能出现tips
,但是这个tips的内容是系统生成的,并且只能显示一行,也不知道能不能编程修改它的显示方式,所以我就写了几行代码,来实现自定义的多行tips显示。[www.61k.com)
步骤:
1)在Winform中加入MapControl和一个TextBox
2)将TextBox的属性MultiLine设为True, Visable设为False,BorderStyle设为FixSingle
3)捕获MapControl1的MouseDown和MouseUp事件,函数内容如下:
private void mapControl1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
//如果没有转载任何tab文件,则返回
if(mapControl1.Map.Layers.Count == 0 || this.currentLayerName=="")/
mapxtreme mapxtreme练习笔记
/currentLayerName是顶层
Layer的名字,同时也是Table的名字
return;
MapInfo.Engine.Selection selection=MapInfo.Engine.Session.Current.Selections.DefaultSelection;
MapInfo.Data.Table table=MapInfo.Engine.Session.Current.Catalog.GetTable(currentLayerName);
MapInfo.Data.IResultSetFeatureCollectionfeatureCollection=selection[table];
//如果没有选中任何图元,或者选中多个图元,则返回
if(featureCollection==null||featureCollection.Count!=1)
return;
//取第一个图元
MapInfo.Geometry.Geometry geometry=featureCollection[0].Geometry; //创建连接和命令来查询table中的数据
MapInfo.Data.MIConnection connection=new MapInfo.Data.MIConnection();
MapInfo.Data.MICommand command=connection.CreateCommand(); command.CommandText="SELECT * FROM "+currentLayerName+" WHERE Objwithin @featureObject";
command.Parameters.Add("@featureObject",geometry);
connection.Open();
MapInfo.Data.MIDataReader dataReader=command.ExecuteReader(); int n=dataReader.FieldCount;
this.textBoxInfoTips.Clear();
//把查询到的内容放进tips中
for(int i=0;i<n;i++)
{
this.textBoxInfoTips.AppendText(dataReader.GetName(i)+"t"); }
this.textBoxInfoTips.AppendText("n");
while(dataReader.Read())
{
for(int i=0;i<n;i++)
{
object o=dataReader.GetValue(i);
if(o==DBNull.Value)
this.textBoxInfoTips.AppendText("nullt");
else
this.textBoxInfoTips.AppendText(o.ToString()+"t");
}
this.textBoxInfoTips.AppendText("n");
}
//改变tips的显示位置
mapxtreme mapxtreme练习笔记
this
.textBoxInfoTips.Location=new System.Drawing.Point(e.X,e.Y+50); this.textBoxInfoTips.Visible=true;
}
private
void mapControl1_MouseUp(object sender, System.Windows.Form
s.MouseEventArgs e)
{ this.textBoxInfoTips.Visible=false
;
}
35. 取得选择图元的
ID列表
要做瘦控件,首要的是找到一个属性,使得控件外部的数据结构能够与控件内部的图元关联起来。[www.61k.com]
例如图元的ID。
下面的源码是取出当前选择的所有图元的ID列表,传出给控件外使用。
//1 获得最上层的选择
MapInfo.Data.IResultSetFeatureCollection featureCollection=MapInfo.Engine.Session.Current.Selections.DefaultSelection[0];
if(featureCollection.Count==0)
{
return;
}
//2 创建列表,用以存放ID
ArrayList featureList=new ArrayList();
//3 创建连接和命令来查询table中的数据
MapInfo.Data.MIConnection connection=new MapInfo.Data.MIConnection(); connection.Open();
MapInfo.Data.MICommand command=connection.CreateCommand();
command.CommandText="SELECT ID FROM "+featureCollection.Table.Alias+" WHERE obj=obj";
MapInfo.Data.MIDataReader dataReader=command.ExecuteReader(); //4 遍历所有选择,取出它们的ID
while(dataReader.Read())
{
int featureId=(int)dataReader.GetValue(0);
featureList.Add(featureId);
}
//5 关闭连接(必须执行此步,否则会出现运行时错误)
mapxtreme mapxtreme练习笔记
dataReader.Close();
dataReader.Dispose();
command.Cancel();
command.Dispose();
connection.Close();
connection.Dispose();
36. 用程序选择指定层中符合条件的图元
瘦控件中重要一环是图元选择的联动,
即用户对控件内的图元进行鼠标选择可以反映到控件外部的数据结构中,外部的数据结构的图元选择也可以反映到控件内。[www.61k.com)
下面的源代码正是实现用程序选择指定层中符合条件的图元的。
public void FeaturesSelect(int[] featureList,string layerName)
{
MapInfo.Data.Table table=MapInfo.Engine.Session.Current.Catalog.GetTable(layerName);
if(table==null)
return;
MapInfo.Data.IResultSetFeatureCollectionfeatures=MapInfo.Data.FeatureCollectionFactory.CreateResultSetFeatureCollection(table,null);
foreach(int featureId in featureList)
{
MapInfo.Engine.Session.Current.Catalog.Search(
table,
MapInfo.Data.SearchInfoFactory.SearchWhere("ID="+featureId.ToString()),
features,
MapInfo.Data.ResultSetCombineMode.AddTo);
}
MapInfo.Engine.Session.Current.Selections.DefaultSelection.Clear();
MapInfo.Engine.Session.Current.Selections.DefaultSelection.Add(features); }
mapxtreme mapxtreme练习笔记
37. 瘦控件的专题图制作
Color featureColor = Color.FromArgb(150,R,G,B);
//把同色的图元ID放在一起
if(!color2FeatureIdList.ContainsKey(featureColor))
mapxtreme mapxtreme练习笔记
{ ArrayList al=
new ArrayList();
al.Add(featureId);
color2FeatureIdList.Add(featureColor,al);
}
else
{
ArrayListal=(ArrayList)color2FeatureIdList[featureColor];
al.Add(featureId);
}
//把arraylist中的所有feature都选进featureCollection中
SelectFeatureIntoCollection(table,featureId,featureCollection); }
}
catch(ArgumentException)
{
Trace.WriteLine("数据表中无法找到指定的列","输入数据错误");
return ;
}
catch(InvalidCastException)
{
Trace.WriteLine("数据列值不能转成数字类型","输入数据错误");
return ;
}
catch(System.OverflowException)
{
Trace.WriteLine("数据列值超出数值最大范围","输入数据错误");
return ;
}
catch(System.FormatException)
{
Trace.WriteLine("数据列值格式错误,出现了非数字的字母","输入数据错误"); return ;
}
//创建连接
MapInfo.Data.MIConnection connection=new MapInfo.Data.MIConnection(); connection.Open();
//创建ResultSet图层
// MapInfo.Mapping.FeatureLayer themeLayer = newMapInfo.Mapping.FeatureLayer(featureCollection.Table,"themeLayer","themeLayer");
// mapControl1.Map.Layers.Insert(0,themeLayer);
mapxtreme mapxtreme练习笔记
// MapInfo.Mapping.FeatureLayer layer=(MapInfo.Mapping.FeatureLayer)
mapControl1.Map.Layers[0];
// layer.Enabled = true;
//事实证明,用ResultSet图层会影响原来的tab文件的数据,所以此处改用TableInfoMemTable
MapInfo.Data.TableInfoMemTable themeTableInfo= new MapInfo.Data.TableInfoMemTable("themeLayer");
foreach(MapInfo.Data.Column col in table.TableInfo.Columns) //复制表结构 {
MapInfo.Data.Column col2=col.Clone();
col2.ReadOnly=false;
themeTableInfo.Columns.Add(col2);
}
MapInfo.Data.Table themeTable = MapInfo.Engine.Session.Current.Catalog.CreateTable(themeTableInfo);
MapInfo.Data.MICommand command1=connection.CreateCommand();
command1.CommandText = "Insert into " +themeTable.Alias + " Select * From "+featureCollection.Table.Alias;//复制图元数据
command1.Prepare();
command1.ExecuteNonQuery();
command1.Cancel();
command1.Dispose();
//逐个检索颜色
foreach(System.Drawing.Color color in color2FeatureIdList.Keys)
{
Color BorderColor = Color.FromArgb(0,0,0);
ArrayList al=(ArrayList)color2FeatureIdList[color];
string whereClause=CreateWhereClause(al);
//创建style
MapInfo.Styles.SimpleLineStyleline = new MapInfo.Styles.SimpleLineStyle(newMapInfo.Styles.LineWidth(1,MapInfo.Styles.LineWidthUnit.Pixel), 2,BorderColor);//1无边界色,2有边界色
MapInfo.Styles.SimpleInteriorinterior = new MapInfo.Styles.SimpleInterior(2,color); //2实习,3斑马线
MapInfo.Styles.AreaStyle area= new MapInfo.Styles.AreaStyle(line,interior);
MapInfo.Styles.CompositeStyle cs = new MapInfo.Styles.CompositeStyle(area,null,null,null);
//批量更新图元颜色
MapInfo.Data.MICommand command=connection.CreateCommand();
mapxtreme mapxtreme练习笔记
command.CommandText = "update " +themeTable.Alias + " set obj=obj,
MI_Style=@style"+whereClause;
command.Parameters.Add("@style",cs);
command.Prepare();
command.ExecuteNonQuery();
command.Cancel();
command.Dispose();
}
//关闭连接
connection.Close();
connection.Dispose();
//把新表添加为顶图层
MapInfo.Mapping.FeatureLayer themeFeatureLayer = new MapInfo.Mapping.FeatureLayer(themeTable);
this.mapControl1.Map.Layers.Insert(0,themeFeatureLayer);
}
/// <summary>
/// 把table中ID=featureId的图元选进featureCollection中
/// </summary>
/// <param name="table">MapInfo的数据表</param>
/// <param name="featureId">图元id</param>
/// <param name="featureCollection">引用的图元选择集</param>
private void SelectFeatureIntoCollection(MapInfo.Data.Table table,intfeatureId,MapInfo.Data.IResultSetFeatureCollection featureCollection)
{
MapInfo.Engine.Session.Current.Catalog.Search(
table,
MapInfo.Data.SearchInfoFactory.SearchWhere("ID="+featureId.ToString
()),
featureCollection,
MapInfo.Data.ResultSetCombineMode.AddTo);
}
38. 一个选中的图元强调显示,用红色醒目的文字显示
1、不可能直接改原先的图元,所以必须要在一个新的图层上进行操作
2、新的图层因为不同的人用,会放置不同的东西,用固定图层不合适,得用动态生成的图层
mapxtreme mapxtreme练习笔记
碰到很多问题,如下:
1、原来的图层,默认设置了autolabel,所以可以直接显示,但是mapxtreme2004并不支持对图层的autolabel的设置。(www.61k.com]要想在程序中自动标注,必须得依赖labellayer。
2、用固定的设置好autolabel的图层不行,那么能否动态的将一个设置好autolabel属性的固定层复制成一个动态图层呢?我没有找到图层的clone方法。
3、试验过程中,试过复制图层,在旁边动态创建一个标注文字的方式。但文字随放大缩小变化,很不好快。
最终解决方法:
1、创建一个ShowLayer,同时也创建一个LabelLayer,关联,并设置好显示效果。
2、强调显示时,用Feature.Clone复制图元。但是必须注意,要保证ShowLayer的列与被复制的图元的列一致才行。
3、如果强调点的位置偏移,可以重新调整坐标系。
创建ShowLayer的代码:
public ShowLayerSys(Map MainMap)
{
map=MainMap;
_tempTable=MapInfo.Engine.Session.Current.Catalog.GetTable("ShowLayer");
if(_tempTable==null)
{
TableInfo ti= TableInfoFactory.CreateTemp("ShowLayer"); // create tableinfo with just obj and style cols
ti.Columns.Add(new Column("ID",MapInfo.Data.MIDbType.String,50,0));
ti.Columns.Add(new Column("f_name",MapInfo.Data.MIDbType.String,50,0));
_tempTable = MapInfo.Engine.Session.Current.Catalog.CreateTable(ti);
}
map.Layers.Insert(0, new FeatureLayer(_tempTable));
//设置标注层
LabelLayer layer = new LabelLayer();
MainMap.Layers.Add(layer);
LabelSource source = new LabelSource(MapInfo.Engine.Session.Current.Catalog.GetTable("ShowLayer"));
source.DefaultLabelProperties.Caption = "f_name";
source.DefaultLabelProperties.Style.Font.ForeColor=System.Drawing.Color.Blue; //字体颜色 //source.DefaultLabelProperties.Style.Font.BackColor =System.Drawing.Color.PowderBlue ; //字体背景
source.DefaultLabelProperties.Style.Font.TextEffect=MapInfo.Styles.TextEffect.Box; //边缘效果
source.DefaultLabelProperties.Style.Font.FontWeight =MapInfo.Styles.FontWeight.Bold ; //粗体
source.DefaultLabelProperties.Layout.Alignment=MapInfo.Text.Alignment.CenterRight; //相对位置
source.DefaultLabelProperties.Layout.Offset=2;
layer.Sources.Append(source);
mapxtreme mapxtreme练习笔记
}
强调显示的代码:
MapInfo.Styles.SimpleVectorPointStyle sty=new SimpleVectorPointStyle();
sty.Color=System.Drawing.Color.Blue ;
Feature f=(Feature)ftr.Clone();
f.Style=sty;
_tempTable.InsertFeature(f);
很久没有写随笔了,也很久没看xtrem了,手生!
今天想实现往一个图层加入一个文字,如下:
//加入一个文字对象作为其描述
MapInfo.Styles.TextStyle sty2=new TextStyle();
sty2.Font.ForeColor=System.Drawing.Color.Red;
sty2.Font.TextEffect=TextEffect.Halo;
DRect drect=new DRect(ftr.Geometry.Centroid.x+2,ftr.Geometry.Centroid.y,ftr.Geometr
y.Centroid.x+30,ftr.Geometry.Centroid.y+12);
LegacyText lt=new LegacyText(ftr.Geometry.CoordSys,drect,ftr["f_name"].ToString());
Feature f2=new Feature(lt,sty2);
_tempTable.InsertFeature(f2);
ftr是传入的一个图元。(www.61k.com] Halo我很喜欢,可以在纷乱的背景下依然清楚的显示文字。
其实,我最希望实现的是,能够把一个图元复制到新图层,然后,修改它的autolabel属性,使文字颜色变红最好。可惜,我现在只能做到在gst中设置好,打开时能够显示(原来我以为不行,这次却莫名其妙的好了)。
加点的一般方法:
Catalog _catalog=MapInfo.Engine.Session.Current.Catalog;
MapInfo.Geometry.Point pt = new MapInfo.Geometry.Point(map.GetDisplayCoordSys(),dp); MapInfo.Styles.SimpleVectorPointStyle vs = new MapInfo.Styles.SimpleVectorPointStyle(); vs.PointSize = 8;
vs.Color = Color.DarkMagenta;
Feature ft2=new Feature(tb.TableInfo.Columns);
string strID=DateTime.Now.ToString("hhmmss");
ft2.Geometry=pt;
ft2["f_name"]=PointName;
ft2["ID"]=strID;
ft2["MI_Style"]=vs;
tb.InsertFeature(ft2);
Feature
ft3=MapInfo.Engine.Session.Current.Catalog.SearchForFeature(tb.Alias,MapInfo.Data.SearchInfoFactory.SearchWhere("ID="+strID+" and f_name='"+PointName+"'"));
return ft3.Key.Value;
但是每次添加的都是五角星,如果想添加其他形状该怎么办?MapInfo中有一个默认的符号
mapxtreme mapxtreme练习笔记
库(自己看英文帮助,查词霸,猜得意思)VectorPointStyleRepository,其中有36个元素,每个元素的值是一个SimpleVectorPointStyle类型。(www.61k.com]
Property Value
The element SimpleVectorPointStyle at the specified index.
这样,就不用生成新的样式,直接调用它就行了,把vs的赋值直接换成这个:
MapInfo.Styles.SimpleVectorPointStyle vs = (MapInfo.Styles.SimpleVectorPointStyle)MapInfo.Engine.Session.Current.StyleRepository.VectorPointStyleRepository[2]; //索引的范围0-35
39. 在MapXtreme中的标注换行
在我使用MapXtreme开发WebGIS过程中,客户提出一个新需求:希望在一个图元的标注中呈现一条或者多条数据,并且这些数据的组合是可定制的。比如一个图元的标注包含名称,地理位置,坐标等。刚开始个人认为是一个简单的功能,将用于标注的多条字符串加在一起成一条字符串再赋值给标注就可以了。但是结局正如你所预见的一样,光添加数据是不够的。用户需要快速区分标注中的每条数据,如果就那么一条长字符找起来就不方便了。也可能添加的字符串太长,看起来也不好看。最终的解决办法是每一条数据换行显示。
在翻查了MapXtreme的MapXtreme2004DeveloperReference.chm的帮助后也没有找到什么捷径或者特殊功能字符比如 r n 什么的。最后直接加入回车符Chr(13)来让标注换行。
Dim strLabel = str1 & vbCr & str2 & vbCr & str3 & vbCr & str4
也许你的数据来源于一个数据库表,那么希望直接用SQL语句来返回一个带回车符的字段。
Oracle:
Dim strSql = "select " & str1 & " || '" & vbCr & "' || " & str2 & " as field from tabName" 40.
更改mapxtreme中定制符号的路径
MapInfo.Engine.Session.Current.StyleRepository.BitmapPointStyleRepository.Reload(System.IO.Path.Combine(Application.StartupPath, "icon"));
41. 几个报错 Table.BeginAccess(TableAccessMode.Write);这句代码,报错率非常高。
我们在修改一个表的时候,通常要begin一下,然后处理,处理完之后再end一下
在反复的begin与end中,一旦拿不到锁,就报错了。通常这个问题引起,是另一个表正在处理时,发生异常,你try完之后,没有endAccess引起的
Table.DeleteFeature(feature);这句代码的报率也很高,网上流传这么一些代码:
mapxtreme mapxtreme练习笔记
foreach(Featrue fea in Table)
{
Table.DeleteFeature(feature);
}
用来删除表的数据,这里报错率通常是由于
Table.BeginAccess(TableAccessMode.Write);这个异常引起的
所以最好处理就是try一下Table.BeginAccess(TableAccessMode.Write);正常后,再执行删除表数据
这里有一点提的,其实里面的东西最后还是执行delete from table where
之类的语句,这样等于一条一条执行。(www.61k.com]
还不如直接执行delete from table就OK了,foreach来干什么。那个MISql操作的,几乎和ADO.net的操作一个样,不用担心不会。
最后一个就是最严重的问题了。
产生的问题是这样的:地图上画上的点,一开始好好的,然后点一下放大或细小,一会正常,一会又点不见了,再点一下,点又出来了,就这样反反复复。
一会正常,一会不正常。
经常反复大量研究表明:地图是存在Session中的,在研究中发现,Session经常不确定性的会丢失,所以,最好在画点的逻辑里加上一些处理:
我是这样处理的:
if (CommonHelper.Get<string>("Command", "") == "" || map.CustomProperties["layerCount"] == null || (int)map.CustomProperties["layerCount"] != map.Layers.Count)
{
RUnitMapView mapView = new RUnitMapView(map);
mapxtreme mapxtreme练习笔记
map.CustomProperties["layerCount"] = map.Layers.Count;//预防Session的layer丢失
}
找了一个地方保存下地图的图层数,由于生成了点之后,地图的图层一定会和初始图层不一样。(www.61k.com)所以,用了这个来做为判断Session是否丢失.
如果Session丢失,重新加载一下数据点的处理。这样,终于解决了问题.
42.在C#应用中如何读取存在ORACLE(或SQL Server)中的MapInfo表 答:读取ORACLE中表的方法如下代码:
using MapInfo.Data; //这里要添加对MapInfo数据的引用
MIConnection Connection=new MIConnection();
Connection.Open();
MapInfo.Data.Table [] tables=new MapInfo.Data.Table[4];
TableInfoServer tis1=new
TableInfoServer("WORLD","SVR=MYORACLE;UID=system;PWD=manager","select * from world",MapInfo.Data.ServerToolkit.Oci);
tables[0]=Connection.Catalog.OpenTable(tis1);
TableInfoServer tis2=new
TableInfoServer("WORLDCAP","SVR=MYORACLE;UID=system;PWD=manager","select * from worldcap",MapInfo.Data.ServerToolkit.Oci);
tables[1]=Connection.Catalog.OpenTable(tis2);
TableInfoServer tis3=new
TableInfoServer("wldcty25","SVR=MYORACLE;UID=system;PWD=manager","select * from wldcty25",MapInfo.Data.ServerToolkit.Oci);
tables[2]=Connection.Catalog.OpenTable(tis3);
TableInfoServer tis4=new
TableInfoServer("OCEAN","SVR=MYORACLE;UID=system;PWD=manager","select * from OCEAN",MapInfo.Data.ServerToolkit.Oci);
tables[3]=Connection.Catalog.OpenTable(tis4);
mapxtreme mapxtreme练习笔记
MapControl1.Map.Load(new MapInfo.Mapping.MapTableLoader(tables));
Connection.Close();
而读取存放在SQL Server2000中的表时,应当使用如下修改过的代码:
/* SQL Server数据库连接*/
MIConnection Connection=new MIConnection();
Connection.Open();
MapInfo.Data.Table [] tables=new MapInfo.Data.Table[2];
TableInfoServer tis1=new TableInfoServer("CH_SHENGHUI","DRIVER={SQL
Server};SERVER=YC31;DATABASE=MYWEBGIS;Trusted_Connection=Yes","select * from CH_SHENGHUI",MapInfo.Data.ServerToolkit.Odbc);//注意这里使用的是Odbc,且区分大小写。[www.61k.com] tables[0]=Connection.Catalog.OpenTable(tis1);
TableInfoServer tis2=new TableInfoServer("CH_SHENGJIE_P","DRIVER={SQL
Server};SERVER=YC31;DATABASE=MYWEBGIS;Trusted_Connection=Yes","select * from CH_SHENGJIE_P",MapInfo.Data.ServerToolkit.Odbc);//注意这里使用的是Odbc,且区分大小写。 tables[1]=Connection.Catalog.OpenTable(tis2);
mapControl1.Map.Load(new MapInfo.Mapping.MapTableLoader(tables));
Connection.Close();
/*上面的TableInfoServer语句分开来写可以表达成如下方法。*/
/*
TableInfoServer tiServer = new TableInfoServer("SHENGHUI");
tiServer.ConnectString = "DRIVER={SQL
Server};SERVER=YC31;DATABASE=MYWEBGIS;Trusted_Connection=Yes";
tiServer.Query = "Select * from CH_SHENGHUI";
tiServer.Toolkit = ServerToolkit.Odbc;
MapTableLoader tl = new MapTableLoader(tiServer);
mapControl1.Map.Load(tl);
*/
43. 读取线的节点坐标程序
mapxtreme mapxtreme练习笔记
private void menuItem2_Click(object sender, System.EventArgs e)
{
string TableList = null;
string tabname=null;
foreach (MapInfo.Data.Table tab in MapInfo.Engine.Session.Current.Catalog) {
TableList = TableList + "Table: " + tab.ToString() + "n";
if (tab.ToString().IndexOf ("Highway")>0) tabname=tab.Alias.ToString();
Console.WriteLine("Table: " + tab.ToString());
}
MapInfo.Data.Feature
myfc=MapInfo.Engine.Session.Current.Catalog.SearchForFeature(tabname,MapInfo.Data.SearchInfoFactory.SearchWhere("Highway='I 10'"));
MapInfo.Geometry.MultiCurve c=(MapInfo.Geometry.MultiCurve)myfc.Geometry ;
foreach(MapInfo.Geometry.Curve c1 in c)
{
MapInfo.Geometry.DPoint []d=c1.SamplePoints();
for (int i=0;i<c.MultiCurveEditor[0].ControlPointCount;i++)
{
MessageBox.Show(this,d.x.ToString()+","++d.y.ToString());
}}
}
44. 常用示例
1 设置图层可选状态
mapxtreme mapxtreme练习笔记
{
mapxtreme mapxtreme练习笔记
mapControl1.Map.Layers[layerName].Enabled=status;
}
}
3 层居中,看全图
/// <summary>
/// 使指定层全部呈现在地图的可见范围中
/// </summary>
/// <param name="tableAlias">层别名</param>
public void LayerCenter(string layerName)
{
MapInfo.Data.Table[] tables=new MapInfo.Data.Table[1];
tables[0] = MapInfo.Engine.Session.Current.Catalog.GetTable(layerName);
if(tables[0]==null)
return;
if(mapControl1.Map.Layers[layerName]==null)
return;
if(mapControl1.Map.Layers[layerName].Enabled == false) mapControl1.Map.Layers[layerName].Enabled = true;
MapInfo.Mapping.IMapLayerFilter iMapLayerFilter = MapInfo.Mapping.MapLayerFilterFactory.FilterByTable(tables);
MapInfo.Mapping.MapLayerEnumerator mapLayerEnumerator = mapControl1.Map.Layers.GetMapLayerEnumerator(iMapLayerFilter); mapControl1.Map.SetView(mapLayerEnumerator);
OnFeatureUnclick();
mapxtreme mapxtreme练习笔记
}
4 放大缩小地图
/// <summary>
/// 放大地图
/// </summary>
/// <param name="times">放大倍数,有效值1-10</param> public void ZoomIn(uint times)
{
if(times<1 || times>10) return;
MapInfo.Geometry.Distance previousZoom=this.mapControl1.Map.Zoom;
mapControl1.Map.Zoom=new MapInfo.Geometry.Distance(previousZoom.Value/(2*times),previousZoom.Unit);
}
/// <summary>
/// 缩小地图
/// </summary>
/// <param name="times">缩小倍数,有效值1-10</param> public void ZoomOut(uint times)
{
if(times<1 || times>10) return;
MapInfo.Geometry.Distance previousZoom=this.mapControl1.Map.Zoom;
mapControl1.Map.Zoom=new MapInfo.Geometry.Distance(previo
mapxtreme mapxtreme练习笔记
usZoom.Value*(2*times),previousZoom.Unit);
}
5 移动层的顺序
mapControl1.Map.Layers.Move(index1,index2);
6 图元/图层透明
/// <summary>
/// 设置层的透明与否
/// </summary>
/// <param name="layerName">层名</param>
/// <param name="opaqueType">不透明类型 ALL 全部不透明 BORDER 只有边界不透明(内部透明) NONE 全部透明</param>
/// <param name="borderColor">如果是边界不透明,此处设置边界颜色</param>
public void LayerTransparent(string layerName,OpaqueType opaqueType,System.Drawing.Color borderColor)
{
MapInfo.Styles.CompositeStyle compositeStyle = GetOpaqueStyle(opaqueType,borderColor);
//创建连接和命令来更新table中的数据
MapInfo.Data.MIConnection connection=new MapInfo.Data.MIConnection(); connection.Open();
MapInfo.Data.MICommand command=connection.CreateCommand();
command.CommandText = "update " + layerName + " set obj=obj,MI_Style=@style";
mapxtreme mapxtreme练习笔记
command.Parameters.Add("@style",compositeStyle);
command.Prepare();
command.ExecuteNonQuery();
//关闭连接
command.Cancel();
command.Dispose();
connection.Close();
connection.Dispose();
}
/// <summary>
/// 创建style
/// </summary>
/// <param name="opaqueType">不透明类型:ALL全部不透明(白色实心);BORDER边界不透明(填充部分透明);NONE全透明</param>
/// <param name="borderColor">如果opaqueType=BORDER,此处设定边界颜色</param>
/// <returns>组合style</returns>
private MapInfo.Styles.CompositeStyle GetOpaqueStyle(OpaqueType opaqueType,System.Drawing.Color borderColor)
{
MapInfo.Styles.SimpleInterior simpleInterior;
if(opaqueType==OpaqueType.ALL)
simpleInterior= new MapInfo.Styles.SimpleInterior(); //缺省构造函数是白色实心
else
simpleInterior= new MapInfo.Styles.SimpleInterior(1); //0是线透明,1是面透明
mapxtreme mapxtreme练习笔记
MapInfo.Styles.LineWidth lineWidth =
new MapInfo.Styles.LineWidth(1,MapInfo.Styles.LineWidthUnit.Point);
MapInfo.Styles.SimpleLineStyle simpleLineStyle;
if(opaqueType==OpaqueType.ALL)
simpleLineStyle = new MapInfo.Styles.SimpleLineStyle(lineWidth); else if(opaqueType==OpaqueType.BORDER)
simpleLineStyle = new MapInfo.Styles.SimpleLineStyle(lineWidth,2,borderColor); //2表示填充透明,即能够显示轮廓
else
simpleLineStyle = new MapInfo.Styles.SimpleLineStyle(lineWidth,0); //0表示全部透明,即连轮廓都看不到
MapInfo.Styles.AreaStyle areaStyle = new MapInfo.Styles.AreaStyle(simpleLineStyle,simpleInterior);
MapInfo.Styles.CompositeStyle compositeStyle = new MapInfo.Styles.CompositeStyle(areaStyle,null,null,null);
return compositeStyle;
}
7 选择全部图元
MapInfo.Engine.Session.Current.Catalog.Search(
table,
mapxtreme mapxtreme练习笔记
MapInfo.Data.SearchInfoFactory.SearchAll(),
MapInfo.Engine.Session.Current.Selections.DefaultSelection, MapInfo.Data.ResultSetCombineMode.Replace);
8 设置坐标系
缺省情况下,MapXtreme使用的CoordSys是经纬度投影(LongLat)和WGS84基准面。(www.61k.com]我想修改投影类型为 CoordSysType.TransverseMercator ,基准面为DatumID.Pulkovo1942
MapInfo.Geometry.CoordSysFactory coordSysFactory=MapInfo.Engine.Session.Current.CoordSysFactory;
mapControl1.Map.SetDisplayCoordSys(coordSysFactory.CreateCoordSys("mapinfo:coordsys 8,1001,7,117,0,1,20500000,0"));
coordSysFactory.CreateCoordSys("mapinfo:coordsys 8,1001,7,117,0,1,20500000,0") 默认的原点是(B=0,L=117),如果要把原点设在(23,117)应该怎么写这个字符串呢?
coordSysFactory.CreateCoordSys("mapinfo:coordsys 8,1001,7,114,23,1,20500000,25000000")
9 保存新画的层为tab文件
下面的源码是新建一个永久表,然后在表中添加feature,然后保存为硬盘上的tab文件。
private MapInfo.Data.Table CreateNewMapDataTable(string tableName) {
//以下代码是建立永久表
MapInfo.Data.TableInfoNative tableInfoNative=newMapInfo.Data.TableInfoNative(tableName);
mapxtreme mapxtreme练习笔记
tableInfoNative.TablePath=@"D:DATA"+tableName+".TAB"; tableInfoNative.Columns.Add(MapInfo.Data.ColumnFactory.CreateIntColumn("ID"));
tableInfoNative.Columns.Add(MapInfo.Data.ColumnFactory.CreateStyleColumn());
MapInfo.Geometry.CoordSys coordSys =mapControl1.Map.GetDisplayCoordSys();
tableInfoNative.Columns.Add(MapInfo.Data.ColumnFactory.CreateFeatureGeometryColumn(coordSys));
MapInfo.Data.Table table =MapInfo.Engine.Session.Current.Catalog.CreateTable(tableInfoNative);
//以下代码是建立临时表
// MapInfo.Data.TableInfo tableInfo =MapInfo.Data.TableInfoFactory.CreateTemp(tableName);
// tableInfo.Columns.Add(MapInfo.Data.ColumnFactory.CreateIntColumn("ID"));
// MapInfo.Data.Table table =MapInfo.Engine.Session.Current.Catalog.CreateTable(tableInfo);
MapInfo.Mapping.FeatureLayer featureLayer = newMapInfo.Mapping.FeatureLayer(table);
this.mapControl1.Map.Layers.Add(featureLayer);
return table;
}
private void AddFeaturesAndSave()
{
mapxtreme mapxtreme练习笔记
MapInfo.Styles.SimpleLineStyle simpleLineStyle = newMapInfo.Styles.SimpleLineStyle(new MapInfo.Styles.LineWidth(1,MapInfo.Styles.LineWidthUnit.Point));
MapInfo.Styles.CompositeStyle compositeStyle = newMapInfo.Styles.CompositeStyle(null,simpleLineStyle, null, null);
MapInfo.Geometry.CoordSys coordSys =mapControl1.Map.GetDisplayCoordSys();
MapInfo.Data.Table table = CreateNewMapDataTable("NewTable"); MapInfo.Data.TableInfo tableInfo = table.TableInfo;
while(……)
{
MapInfo.Data.Feature feature = newMapInfo.Data.Feature(tableInfo.Columns);
feature.Geometry = ……
feature.Style = ……
feature["ID"] = ……
table.InsertFeature(feature);
}
tableInfo.WriteTabFile(); //保存为.tab文件
mapControl1.Refresh();
}
10 计算缩放比例
/// <summary>
/// 重画控件时计算缩放比例
mapxtreme mapxtreme练习笔记
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void mapControl1_Paint(object sender,PaintEventArgs e)
{
MapInfo.Geometry.Distance zoomDistance=this.mapControl1.Map
.Zoom;
double zoom=Convert.ToDouble(Convert.ToInt32(zoomDistance.V
alue*16.09))/10;
this.statusBar1.Text="缩放比例:"+zoom.ToString()+" 千米"; 45.
46.
47.
二 : 《练习五》
教学目标:
1.使学生进一步巩固20以内的进位加法和退位减法。
2.培养学生观察、口头表达等能力。
3.让学生初步体会数学知识与日常生活的密切联系,具有初步的应用意识。
4.培养学生的数感。
教学重点:进一步巩固20以内的进位加法和退位减法。
教学难点:培养学生观察、口头表达等能力。
教学过程:
一、计算,寻找规律。
1、第1题。
(1)让学生独立完成第1组(一列3题为一组)和第2组。
(2)组织学生观察每一组算式,找一找有什么规律?
(引导学生说出:第一个数不变,第2个数逐渐多1,得数逐渐少1。减去越大的数,得数就越小。)
(3)引导学生先观察第3组算式,用刚才发现的规律,写出得数。
(4)比较第4组和其他3组的区别。
(引导学生说出,第一个数如果每次多1,第2个数不变,得数也会每次多1。)
(5)引导学生根据第4组的算式规律自己写出一组算式。
如:12-5,13-5,14-5。
(可以组织学生小组讨论)
2.第2题。
(1)学生独立完成。
(2)引导学生发现规律。
3.第6题。
(1)让学生独立计算。
(2)观察算式,看一看有什么规律?
(3)引导学生进行交流。
二、游戏(比比谁钓得多)。
1.游戏准备:每组一些鱼形的算式卡片,一个写着数字的竹篓。
2.游戏要求:小组同学根据本组竹篓上的数字,选择相对应的算式。老师计时,比一比在1分钟内,哪个小组钓到的鱼最多。
3.游戏结果交流:每组代表读出本小组中的算式,其他小组给予评价。
三、解决问题。
1.第4题。
学生在独立完成的基础上进行小组交流。只要学生能够说出合适的理由,以下算式都是正确的,12-3=9,或3+9=12,11-4=7或4+7=11。教师可以引导学生用适当的方式标出答案。
2.第5题,小熊射门。
(1)小朋友们观察图,说说你看到了什么?
小熊在踢球,小兔子、小猴子、小浣熊在为它加油呐,小狐狸当守门员。
(2)找出题目中的数学问题。
一共有几个球?踢了( )个,还剩( )个。
(3)大家依据图,把问题填完整。(可以用小组交流,集体讨论的形式)
四、总结:
这节课,小朋友的计算都得到了提高,还找出了许多算式的规律。在做游戏的过程中,小朋友都表现得很积极,4人小组合作也完成得不错,老师给每个小朋友都加上一颗智慧星。
板书: 练习五
15-7= 12-4=
15-8= 13-4=
15-9= 14-4=
三 : 练习五
教学内容:教材第46-47。
教学目的:
通过折一折、搭一搭、数一数、剪一剪、拼一拼等实践活动,加深对平面图形的认识。
教学过程 :
一、导入 新课
我们已经认识了一些平面图形,谁能说说我们学过了哪些平面图形?
今天啊,我们将继续研究它们上一节练习课。
二、练习。
1、1
(1) 出示第1题,要求学生沿着图中的虚线折一折,说一说折出了什么图形?
(2) 展开,说一说在折出的图形,哪些是你认识的?
2、2。
(1)读题理解题意,什么叫两次对折?
(2)学生选择一种折法在小组中交流,并说说折出的是什么图形?
(3)集体交流并参与教科书说说正方形纸对折两次一般有几种折法?各折出什么图形?
3、3。
(1)出示第3题图,说说图中有哪些图形?指指各种图形分别在哪里?
(2)指导学生数图形的个数,要求学生把图形分成左、中、右三部分,从左往右,从上往下有序地数。
(3)完成统计表,集体交流。
4、4。
(1)要求学生用6根同样长的小棒搭出三角形、长方形和平行四边形,并说说你是怎样搭的?(2)用8根小棒能搭出什么图形?试一试,让学生先搭,然后相互交流。
5、5。
请学生拿出一张平行四边形的纸,想一想怎样才能剪 出两个三角形,三个三角形、四个三角形。
6、6。
(1)出示第6题图,引导学生看图,说说图中是怎样把长方形转化平行四边形。
(2)学生动手按照书中的两幅图折一折、剪一剪、拼一拼。
7、7。
(1)用书附页中的图形,照样子拼出书上的三种图形。
(2)试一试,你还能拼出别的图形吗?学生动手拼图,集体交流,说说你是怎样拼的?
三、作业 布置。
四、教学后记:以游戏形式.比较直观的教具,学生的学习兴趣强.
四 : 练习五1
练习五1
教学内容:p46.1—5
教学目标:
进一步掌握两位数加、减两位数的口算方法,能正确、快速地口算出和在100以内的两位数加两位数及相应的减法。
教学过程:
一、练习指导
1、p46.1
出示题目。
先自由口算,再独立口算。
评讲:1、比较分析每组中两题的区别和联系。
2、小结加、减法在算法上的共同点。
2、p46.2
师生合作进行口算(教师出示教具带领学生口算。)
学生同桌合作练习。
3、p46.3
出示题目,学生根据要求进行估算。
引导学生总结出估算的方法。
任意指其中一题要求估算出结果。
4、46.4
口算比赛。
评讲。
5、46.5
出示题目,要求说出题目含义。
让学生根据题意提出求和或求差的一步计算的问题,并口算出结果。
二、课堂练习
1、 先口算出上、下两数的和,再算出这两个数的差。
本文标题:五笔练习-mapxtreme练习笔记61阅读| 精彩专题| 最新文章| 热门文章| 苏ICP备13036349号-1