物探论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 459|回复: 0

MapXtreme实用技巧与源码10例

[复制链接]
发表于 2013-3-12 21:32:58 | 显示全部楼层 |阅读模式
1 设置图层可选状态
/**////
/// 改变层的可选择状态
///
///
///
public bool LayerSelectableStatusUpdate(string tableAlias,bool selectableStatus)
{
if(mapControl1.Map.Layers[tableAlias]==null)
return false;



MapInfo.Mapping.LayerHelper.SetSelectable(mapControl1.Map.Layers[tableAlias],selectableStatu

s);
return true;
}

2 设置层的可用状态


/**////
/// 改变层的可用状态为status
///
///
///
public void LayerEnableStatusUpdate(string layerName,bool status)
{
if(mapControl1.Map.Layers[layerName]!=null && mapControl1.Map.Layers[layerName].Enabled!

=status)
{
mapControl1.Map.Layers[layerName].Enabled=status;
}
}
3 层居中,看全图


/**////
/// 使指定层全部呈现在地图的可见范围中
///
/// 层别名
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();
}



4 放大缩小地图


/**////
/// 放大地图
///
/// 放大倍数,有效值1-10
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);
}
/**////
/// 缩小地图
///
/// 缩小倍数,有效值1-10
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(previousZoom.Value*

(2*times),previousZoom.Unit);
}


5 移动层的顺序
mapControl1.Map.Layers.Move(index1,index2);

6 图元/图层透明


/**////
/// 设置层的透明与否
///
/// 层名
/// 不透明类型 ALL 全部不透明 BORDER 只有边界不透明(内部透明)

NONE 全部透明
/// 如果是边界不透明,此处设置边界颜色
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";
command.Parameters.Add("@style",compositeStyle);
command.Prepare();
command.ExecuteNonQuery();

//关闭连接
command.Cancel();
command.Dispose();
connection.Close();
connection.Dispose();
}
/**////
/// 创建style
///
/// 不透明类型:ALL全部不透明(白色实心);BORDER边界不透明(填充部

分透明);NONE全透明
/// 如果opaqueType=BORDER,此处设定边界颜色
/// 组合style
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是面透明

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,
MapInfo.Data.SearchInfoFactory.SearchAll(),
MapInfo.Engine.Session.Current.Selections.DefaultSelection,
MapInfo.Data.ResultSetCombineMode.Replace);


8 设置坐标系
缺省情况下,MapXtreme使用的CoordSys是经纬度投影(LongLat)和WGS84基准面。我想修改投影类型为

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);
           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()
       {
          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 计算缩放比例


/**////
/// 重画控件时计算缩放比例
///
///
///
protected void mapControl1_Paint(object sender,PaintEventArgs e)
{
MapInfo.Geometry.Distance zoomDistance=this.mapControl1.Map.Zoom;
double zoom=Convert.ToDouble(Convert.ToInt32(zoomDistance.Value*16.09))/10;
this.statusBar1.Text="缩放比例:"+zoom.ToString()+" 千米";
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|物探论坛 ( 鄂ICP备12002012号 微信号:iwutan )

GMT+8, 2024-5-13 03:52 , Processed in 0.073254 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表