• MapXtreme2004初学者资料(整理)有些功能很有价值


    由于项目的需要我现在又开始研究GIS了。由于我们项目是用.net开发的,所以GIS工具也是当前最新的MapXtreme2004,对于新事物我都有一种冲动,所以研究起来也相当有劲, 
    不过这个也不是那么容易,中文资料太少(本人英语水平有限,正在努力中……),通过网络还是找到了很多零散的资料,在此整理一下。留于以后研究。 
    1.asp.net中如何用MapControl 动态加载地图 
    MapControl1.Map.Clear(); 
    MapGeosetLoader gl=new MapGeosetLoader(@"F:\test.gst"); 
    MapControl1.Map.Load(gl); 
    其实根据不同的格式加载地图的办法也有多种,MapWorkSpaceLoader 
    2.创建MSW文件 
    MapInfo.Persistence.WorkSpacePersistence wsp = new MapInfo.Persistence.WorkSpacePersistence(); 
    wsp.Save ("c:\\temp\\newwork.mws"); //保存文件 
    3.创建InfoTool的事件 
    InfoTool的事件与button不一样,而是 InfoRetrieved。 
    创建后将是这样: 
    private void InfoToolControl1_InfoRetrieved(object sender, MapInfo.Web.UI.WebControls.InfoToolEventArgs e) 

      string Info = ""; 
      foreach(MapInfo.Data.ITableFeatureCollection fc in e.Features) 
      { 
        foreach(MapInfo.Data.Feature f in fc) 
        { 
           Info= string.Format(Info + f[1].ToString() + " "); 
         } 
      fc.Table.Close(); 
      } 

    4.如何通过web.config来加载地图 
    在web.config中,在下添加的Key

    In the HTML view of the form under the mapinfowebuiwebcontrols:MapControl tag, set the following properties: 
    在HTML视图中,更改 mapinfowebuiwebcontrols:MapControl的属性MapAlias必须以.MSW结尾 
    UseDesigntimeWorkspace="fale" ,这一句要删除WorkspaceFileName="WebForm1MapControl1.mws" 
    5.在添加了新层后如何更新地图让InfoTool可以获取他的信息 
    MapInfo.Data.Table tab = MapInfo.Engine.Session.Current.Catalog.OpenTable(@"C:\Program Files\MapInfo\MapXtreme2004\Maps\World\world.tab"); 
    MapInfo.Mapping.FeatureLayer fl = new MapInfo.Mapping.FeatureLayer(tab); 
    this.MapControl1.Map.Layers.Add(fl); 
    this.MapControl1.SelectableLayers.Add(fl.Name);

    6.MapXtreme2004应用问答- - by jerry429 
    问:如何在桌面程序中更改地图的坐标系? 
    问:在C#应用中如何读取存在ORACLE(或SQL Server)中的MapInfo表? 
    问:在C#桌面与Web应用中读取硬盘上MapInfo表一法 
    问:如何在MapXtreme2004桌面应用程序中的任务栏上显示出鼠标的坐标? 
    问:如何使用代码修改桌面应用程序的坐标系统? 
    问:如何在桌面程序中更改地图的坐标系? 
    答:代码如下: 
        using MapInfo.Geometry; 
        //要使用到MapInfo.Geometry命名空间 
        Map map = mapControl1.Map; 
        MapInfo.Geometry.CoordSys coordSys = Session.Current.CoordSysFactory.CreateLongLat(DatumID.NAD83); 
        //DatumID为枚举类型,其中列出了经纬度坐标系统的大量枚举类型,参阅帮助可获取更多信息。 
        map.SetDisplayCoordSys(coordSys); 
    问:在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); 
       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,且区分大小写。 
       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); 
       */ 
    问:在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);

    posted @ 2006-01-05 17:28 路灯十三 阅读(332) | 评论(1) | 编辑

    从MapX到MapXtreme2004[2]-图层操作

            Mapx中基本的图层操作还是比较简单的,集中在对Layers和Layer的处理上,对别的没有太多要求。 
    在MapXtreme中,要完成类似功能,发生了一点变化,如下: 
    1、图层的显示 
    在MapXtreme中,图层的显示控制发生了奇怪的变化,有一个IsVisible属性,但它是只读的,不能通过它来改变图层的显示。要控制图层的显示与隐藏,可以通过设置Layer.Enable来控制。 
    2、图层的动态添加 
    代码如下: 
            Catalog _catalog=MapInfo.Engine.Session.Current.Catalog; 
            MapInfo.Data.Table _tempTable=null; 
            Map _map=MapControl1.Map ;    
            TableInfo ti = TableInfoFactory.CreateTemp("临时");  
            _tempTable = _catalog.CreateTable(ti); 
            _map.Layers.Insert(0, new FeatureLayer(_tempTable)); 
    可以看出:加图层实际就是加表;Catalog对象统管表的加载以及列举; 
    查帮助还可以了解:表信息其实还可以包括表的类型和坐标系。类型是指原生表,文本,access ... 
    上面的ti也可以这样取得,但是,上面的表默认是MeMTab,应该是内存中的吧。 
            CoordSys cs=_map.GetDisplayCoordSys(); 
            TableInfo ti = TableInfoFactory.CreateTemp("临时",MapInfo.Data.TableType.Native,cs); 
    以上只能算是学习心得,肯定错误百出,但总比什么都没有强,至少能够提供一个思路。至于表如何保存,Mapx中的动画层和标签层在MapxTreme中如何对应,因为暂时不急用,先放着。

    posted @ 2006-01-05 17:26 路灯十三 阅读(311) | 评论(0) | 编辑

    OleDbDataAdapter 类

    OleDbDataAdapter 类

    表示一组数据命令和一个数据库连接,它们用于填充 DataSet 和更新数据源。

    有关此类型所有成员的列表,请参阅 OleDbDataAdapter 成员

    System.Object 
    System.MarshalByRefObject 
    System.ComponentModel.Component 
    System.Data.Common.DataAdapter 
    System.Data.Common.DbDataAdapter 
    System.Data.OleDb.OleDbDataAdapter

    [Visual Basic]
    NotInheritable Public Class OleDbDataAdapter
       Inherits DbDataAdapter
       Implements IDbDataAdapter
    [C#]
    public sealed class OleDbDataAdapter : DbDataAdapter,
       IDbDataAdapter
    [C++]
    public __gc __sealed class OleDbDataAdapter : public DbDataAdapter,
       IDbDataAdapter
    [JScript]
    public class OleDbDataAdapter extends DbDataAdapter implements
       IDbDataAdapter
    线程安全

    此类型的所有公共静态(Visual Basic 中为 Shared)成员是线程安全的。但不保证任何实例成员是线程安全的。

    备注

    OleDbDataAdapter 充当 DataSet 和数据源之间用于检索和保存数据的桥接器。OleDbDataAdapter 通过以下方法提供这个桥接器:使用Fill 将数据从数据源加载到 DataSet 中,使用 Update 将 DataSet 中所作的更改发回数据源。

    当 OleDbDataAdapter 填充 DataSet 时,它将为返回的数据创建必需的表和列(如果它们还不存在的话)。但是,除非MissingSchemaAction 属性设置为 AddWithKey,否则这个隐式创建的架构中就将不包括主键信息。也可以使用 FillSchema,让OleDbDataAdapter 创建 DataSet 的架构,并在用数据填充它之前就将主键信息包括进去。有关更多信息,请参见向 DataSet 添加现有约束。

    请注意,包括 MSDataShape 提供程序在内的某些 OLE DB 提供程序并不返回基表或主键信息。其结果是,OleDbDataAdapter 不能为任何已创建的 DataTable 正确地设置 PrimaryKey 属性。在这种情况下,应该显式指定 DataSet 中表的主键。

    OleDbDataAdapter 还包括 SelectCommandInsertCommandDeleteCommandUpdateCommand 和 TableMappings 属性,以便于数据的加载和更新。

    当创建 OleDbDataAdapter 的实例时,属性都设置为其初始值。有关这些值的列表,请参见 OleDbDataAdapter 构造函数。

    示例

    [Visual Basic, C#, C++] 以下示例使用 OleDbCommandOleDbDataAdapter 和 OleDbConnection 从 Access 数据源选择记录,并用选定行填充 DataSet。然后返回已填充的 DataSet。为完成此任务,向该方法传递一个已初始化的 DataSet、一个连接字符串和一个查询字符串,后者是一个 SQL SELECT 语句。

    [Visual Basic] 
    Public Function SelectOleDbSrvRows(dataSet As DataSet, connection As String, query As String) As DataSet
        Dim conn As New OleDbConnection(connection)
        Dim adapter As New OleDbDataAdapter()
        adapter.SelectCommand = new OleDbCommand(query, conn)
        adapter.Fill(dataset)
        Return dataset
    End Function
    
    [C#] 
    public DataSet SelectOleDbSrvRows(DataSet dataset,string connection,string query) 
    {
        OleDbConnection conn = new OleDbConnection(connection);
        OleDbDataAdapter adapter = new OleDbDataAdapter();
        adapter.SelectCommand = new OleDbCommand(query, conn);
        adapter.Fill(dataset);
        return dataset;
    }
    
    
    [C++] 
    public:
    DataSet* SelectOleDbSrvRows(DataSet* dataset,String* connection,String* query) 
    {
        OleDbConnection* conn = new OleDbConnection(connection);
        OleDbDataAdapter* adapter = new OleDbDataAdapter();
        adapter->SelectCommand = new OleDbCommand(query, conn);
        adapter->Fill(dataset);
        return dataset;
    }

    [JScript] 没有可用于 JScript 的示例。若要查看 Visual Basic、C# 或 C++ 示例,请单击页左上角的“语言筛选器”按钮 语言筛选器

    要求

    命名空间: System.Data.OleDb

    平台: Windows 98, Windows NT 4.0, Windows ME, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 系列

    程序集: System.Data (在 System.Data.dll 中)

    请参见

    OleDbDataAdapter 成员 | System.Data.OleDb 命名空间 | OleDbConnection | OleDbCommand | DataSet | DataTable

  • 相关阅读:
    8.9乘船问题
    8.8几个背包问题
    8.7贪心策略例题:字典序最小问题
    8.6贪心策略例题:区间覆盖问题
    8.5贪心策略例题:区间选点问题
    8.4贪心策略例题:区间调度问题
    SQL 报表 生成月份临时表
    CentOS8 .NET Core项目部署
    Django with database on SQL Server
    SQL 父子表,显示表中每条记录所在层级
  • 原文地址:https://www.cnblogs.com/googlegis/p/2978819.html
Copyright © 2020-2023  润新知