MapXtreme入门资料整理 --(二)
问:在C#桌面与Web应用中读取硬盘上MapInfo表一法 答:二者皆可使用如下代码: using MapInfo.Data; MIConnection Connection=new MIConnection(); Connection.Open(); tables[0]=Connection.Catalog.OpenTable(@"G:/Ch_shenghui.TAB"); tables[1]=Connection.Catalog.OpenTable(@"G:/Shengjie_p.TAB"); mapControl1.Map.Load(new MapInfo.Mapping.MapTableLoader(tables)); 问:如何在MapXtreme2004桌面应用程序中的任务栏上显示出鼠标的坐标? 答: 1、添加mapControl1的MouseMove事件; 2、该事件及其中代码如下: public void MapControl1_MouseMove(object sender, MouseEventArgs e) { System.Drawing.PointF DisplayPoint = new PointF(e.X,e.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(); } 问:如何使用代码修改桌面应用程序的坐标系统 答:代码如下: Map map = mapControl1.Map; MapInfo.Geometry.CoordSys coordSys = Session.Current.CoordSysFactory.CreateLongLat(DatumID.WGS84); map.SetDisplayCoordSys(coordSys); 7.在一个程序中要找到固定点附近最近的图元,于是想用SearchNearst。 但是总是出现异常,说"不能对NonEarth坐标系应用Spherical操作" 所以想问一下,MXT04中的SearchNearst方法是不是不支持NonEarth坐标系? //这个问题在MapXtreme2004的6.0和6.1版本都会有。以后版本会改正。 //暂时解决方案:在经纬度投影坐标系中操作。 try { MapInfo.Mapping.Map _map=mapControl1.Map; MapInfo.Data.Catalog _catalog=Session.Current.Catalog; //打开非地球坐标系的图层,并设置地图坐标系 mapControl1.Map.Load(new MapTableLoader(@"E:/MapInfo/培训材料/技术培训教材与PPT/MapXtreme2004/示例/OpenTable/MAP_AREA.TAB")); Cursor.Current = Cursors.WaitCursor; MapInfo.Geometry.CoordSysFactory cf=new MapInfo.Geometry.CoordSysFactory(); MapInfo.Geometry.CoordSys Nonearth=cf.CreateFromMapBasicString("CoordSys NonEarth Units /"m/" Bounds (-2000000, -2000000) (2000000, 2000000)"); _map.SetDisplayCoordSys (Nonearth); //确定查找点-为非地球坐标的中心点 MapInfo.Geometry.DPoint pt=new MapInfo.Geometry.DPoint(_map.Center.x,_map.Center.y); //将地图坐标系转换为经纬度投影 MapInfo.Geometry.CoordSys LonLat=cf.CreateFromMapBasicString("CoordSys Earth Projection 1, 0"); _map.SetDisplayCoordSys (LonLat); //将非地球坐标下的查找点转换我经纬度投影下的点 MapInfo.Geometry.CoordinateTransform Transformer=cf.CreateCoordinateTransform(LonLat,Nonearth); MapInfo.Geometry.DPoint dpt=Transformer.CoordSys2ToCoordSys1(pt); //设置查找半径 Distance d = MapInfo.Mapping.SearchInfoFactory.ScreenToMapDistance(_map, 3); SearchInfo si = MapInfo.Data.SearchInfoFactory.SearchNearest(dpt, LonLat, d); IResultSetFeatureCollection fc = _catalog.Search("MAP_AREA", si); Session.Current.Selections.DefaultSelection.Add(fc); } finally { Cursor.Current = Cursors.Default; } nonearth问题在6.2中已经完全解决. 8.有两个MapControls,怎样使其中一个保存为.MWS MapInfo.Persistence.WorkSpacePersistence wsp = new MapInfo.Persistence.WorkSpacePersistence(); System.IO.FileStream file = new System.IO.FileStream("C:/temp/Test.mws", System.IO.FileMode.CreateNew); wsp.Save(this.mapControl2.Map.Clone() as MapInfo.Mapping.Map,file); file.Close(); 9.查看特定几个图层 假定让lyr1和lyr2两个图层充满整个地图窗口: Table[] ts= new Table[2]; ts[0] = lyr1.Table; ts[1] = lyr2.Table; IMapLayerFilter iml = MapLayerFilterFactory.FilterByTable(ts); MapLayerEnumerator mle = mapControl1.Map.Layers.GetMapLayerEnumerator(iml); mapControl1.Map.SetView(mle); 10.//创建临时层TableInfoMemTable tblInfoTemp = new TableInfoMemTable("Animation"); MapInfo.Data.Table tblTemp = cat.GetTable("Animation"); if (tblTemp != null) //Table exists close it { cat.CloseTable("Animation"); } tblInfoTemp.Columns.Add(ColumnFactory.CreateFeatureGeometryColumn(MapControl1.Map.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")); //TableInfoMemTable是TableInfo类继承来的 tblTemp = cat.CreateTable(tblInfoTemp); FeatureLayer lyr = new FeatureLayer(tblTemp); MapControl1.Map.Layers.Add(lyr); 1.从ORACLE表中加载图层的问题。。。MIConnection Connection=new MIConnection(); Connection.Open(); TableInfoServer tis1=new TableInfoServer("WORLD", "SRVR=ora8i;UID=wzzWD=11111111", "select * from world",MapInfo.Data.ServerToolkit.Oci); MapInfo.Data.Table [] tables=new MapInfo.Data.Table[2]; tables[0]=Connection.Catalog.OpenTable(tis1); TableInfoServer tis2=new TableInfoServer("WORLDCAP", "SRVR=ora8i;UID=wzzWD=11111111", "select * from worldcap",MapInfo.Data.ServerToolkit.Oci); tables[1]=Connection.Catalog.OpenTable(tis2); MapControl1.Map.Load(new MapInfo.Mapping.MapTableLoader(tables)); 2.存在SqlSever中XY坐标点的绑定代码 //XY绑定:含有x,y坐标点的图层放置在Sql Server数据库中,按xy坐标生成点图层 //1.要在存在该表的数据库中建立MAPINFO_MAPCATALOG表,否则会报错: //"An unhandled exception of type 'MapInfo.Data.TableException' occurred in mapinfo.coreengine.dll. //Additional information: 不能打开表。 ODBC 错误: ODBC RC=-1, ODBC SQLState=S0002, DBMS RC=208, DBMS Msg=[Microsoft][ODBC SQL Server Driver][SQL Server]对象名 'MAPINFO.MAPINFO_MAPCATALOG' 无效。 //2.要含xy坐标点的表建立主键,否则会报错: //"Additional information: 不能打开表。因为不能识别唯一键,不能访问远程数据。" //建立XY空间方案 MapInfo.Data.SpatialSchemaXY xy = new MapInfo.Data.SpatialSchemaXY(); xy.XColumn = "X"; xy.YColumn = "Y"; xy.NullPoint = "0.0, 0.0"; xy.StyleType = MapInfo.Data.StyleType.None; xy.DefaultStyle = new MapInfo.Styles.CompositeStyle(); xy.CoordSys = MapInfo.Engine.Session.Current.CoordSysFactory.CreateLongLat(MapInfo.Geometry.DatumID.WGS84); //建立TableInfo MapInfo.Data.TableInfoServer ti = new MapInfo.Data.TableInfoServer("Customers","Driver={SQL Server};Server=LIXIAOHUI;Database=test;Uid=sawd=sa;","select * from Us_Cust",MapInfo.Data.ServerToolkit.Odbc); ti.SpatialSchema = xy; MapInfo.Data.Table miCustomers = MapInfo.Engine.Session.Current.Catalog.OpenTable (ti); MapInfo.Mapping.FeatureLayer featureLayer = new MapInfo.Mapping.FeatureLayer(miCustomers); mapControl1.Map.Layers.Add(featureLayer); mapControl1.Map.SetView(featureLayer); 3.如何查看整个地图Map map = mapControl1.Map; IMapLayerFilter lyrFilter = MapLayerFilterFactory.FilterByType(typeof(FeatureLayer)); MapLayerEnumerator lyrEnum= map.Layers.GetMapLayerEnumerator(lyrFilter); map.SetView(lyrEnum); 或者: Map map = mapControl1.Map; IMapLayerFilter lyrFilter = new FilterByLayerType(LayerType.Normal); MapLayerEnumerator lyrEnum= map.Layers.GetMapLayerEnumerator(lyrFilter); map.SetView(lyrEnum); |