MapObject 2.1在C#中的使用

时间:2025-01-19 08:29:48

 1. MapObject 2.1的控件加入控件TabTools

 

选择 COM Components=>MapObjects 2.1 Map Control, 加进来后是 控件

 

2. 加载地图

 

layer; //图层

gds; // 图层对应的数据

m_db = new (); // 图层集连接

 

// 打开 图层集连接:设置 .shp 文件所在的目录路径

m_db.Database = ();

m_db.Connect();

 

// 查找图层: 地图(如果没有找到,则为空)

gds = m_db.FindGeoDataset("sample1");

 

// 将图层加载到 控件中 => axMap1

layer = new ();

= gds;

= ConvertColorToMapSymbolColor(); // layer中的颜色与C#定义不同,使用了自定义的方法转换

= 1; // 图层线宽 或 点的粗细度

= true; // 图层是否可视

(layer); // 这个方法实际上是 Insert(0, layer),所以后面加载的地图在图层中的下标更小,显示级别更高(同区域,会由更高的级别覆盖低级别的图元)

 

// 自定义转换颜色方法

private UInt32 ConvertColorToMapSymbolColor(Color color)

{

return Convert.ToUInt32( + * 256 + * 256 * 256);

}

 

3. 各种操作

 

a. 放大

 

// 设置当前操作的图标

// (是为了后面 MouseDownEvent 事件区分当前操作是放大、缩小、平移、选择等。

// 可以不设置,用其他变量记录也可以,主要是让操作人容易看清当前的操作状态)

= ;

 

private void axMap1_MouseDownEvent(object sender, AxMapObjects2._DMapEvents_MouseDownEvent e)

{

switch ()

{

case :

{

// 选择放大到的区域

rect = ();

 

if (rect == null || < 0.00005 || < 0.00005)

{

// 如果选择区域很小,可以认为是 单击、点选。就在当前范围下,放大 1.5 ( 1/1.5 = 0.6667 )

rect = ;

(0.6667);

}

 

// 当选择的区域设置为 当前显示区域

= rect;

 

break;

}

case ....

 

b. 缩小

 

缩小与放大相似

 

= ;

 

private void axMap1_MouseDownEvent(object sender, AxMapObjects2._DMapEvents_MouseDownEvent e)

{

switch ()

{

       case ...

       case :

       {

             

rect = ();

if (rect == null || < 0.00005 || < 0.00005)

{

rect = ;

                     (1.5); // 缩小为原来的 2/3 ( 1 / (2/3) = 3/2 = 1.5)

              }

              else

              {

                     // 计算缩小率

                     double dRate = / * 10;

                     (dRate);

              }

              = rect;

             

              break;

       }

 

 

c. 平移、拖动

 

= ;

 

private void axMap1_MouseDownEvent(object sender, AxMapObjects2._DMapEvents_MouseDownEvent e)

{

switch ()

{

              case ...

       case :

              {

                     ();

              break;

              }

      

d. 选择图元

 

= ;

 

private void axMap1_MouseDownEvent(object sender, AxMapObjects2._DMapEvents_MouseDownEvent e)

{

switch ()

{

              case ...

       case :

              {

                     trackRect = ();

              // 获取当前选择的图层(只在一层图层中查)

                     layer = (currentLayerIndex) as ;;

 

                     // 获取的图元集合=> selectRecs

              selectRecs;

             

                     // 根据不同的图层类型(点、线、面),有不同的查找方式

                     switch ()

              {

                            case :

                            case :

                            {

                                   selectRecs = (trackRect, , );

                                   break;

                            }

                     case :

                            default:

                            {

                                   selectRecs = (trackRect, (1.5F), );

                                   break;

                            }

                     }

                     break;

              }

 

e. 获取图层属性字段列表

 

tableDesc;

tableDesc = ;

for (short k = 0; k < ; k++)

{

       fieldname = tableDesc.get_FieldName(k);

}

 

e. 通过图层属性数据查找数据

 

string expression;

field = ( <地图属性的字段> );

switch ()

{

       case :

       case :

       {

              expression = ("{0}={1}", <地图属性的字段>, <属性值>);

              break;

       }

       case :

       {

              expression = ("{0}='{1}'", <地图属性的字段>, <属性值>);

              break;

       }

       default:

       {

              expression = ;

              break;

       }

}

 

if (expression == )

{

       continue;

}

 

recs = (expression);

 

f. 高亮显示选择的图元

 

private void highlightLayerRecordset(string fieldName, layer, selectRecs, int layerIndex)

{

       // 是定义一组颜色相同的图元列表。同一个图层允许有多个颜色显示定义组。

       // 这里是利用 GroupRenderer 定义一组高亮显示的图元列表

       gRen = ();

       renColor;

 

       if( gRen == null )

       {

              gRen = new ();

              = true;

              = gRen;

       }

 

       if( == 0 )

       {

              renColor = new ();

              (renColor);

       }

       else

       {

              renColor = ()gRen.get_Renderer(0);

       }

 

       // 先清除原来选择的图元的选择颜色

       for (short i = Convert.ToInt16( - 1); i >= 0; i--)

       {

              (i);

       }

 

       object v;

       int selectCount = ;

       // 有时候 对象的 Count 的值是 -1,但实际上有数据

       if (selectCount <= 0)

       {

              selectCount = 0;

              ();

              while ( == false )

              {

                     selectCount++;

                     ();

              }

       }

 

       vmRen = new ();

       sym;

       = false;

       = ; // 与图层相同的样式类型:点、线、面

       = fieldName

       = Convert.ToInt16(selectCount); // 初设图元个数

 

       ();

       int index=0;

       while ( == false)

       {

              v = (fieldName).Value;

 

              try

              {

                     if( () == "" )

                     {

                            continue;

                     }

 

                     vmRen.set_Value(Convert.ToInt16(index), ());

                    

                     sym = vmRen.get_Symbol(Convert.ToInt16(index));

                     = ;

                     = ConvertColorToMapSymbolColor(); // 设置为黄色

 

                     index++;

              }

              finally

              {

                     ();

              }

       }

 

       // 有时候,在上面循环中会将一些不需要的图元排除,这里可以再次重设

       = Convert.ToInt16(index);

 

       if ( > 0)

       {

              (vmRen);

       }

 

(Convert.ToInt16(layerIndex));

}

 

h. 闪烁图元3

/// <summary>

/// 闪烁图元3

/// </summary>

/// <param name="symbols">图元列表</param>

/// <param name="toCenter">是否自动将 图元的区域 移到 中心区域位置 显示</param>

private void FlashShape( layer, ArrayList symbols, bool toCenter)

{

       shapeExtent = null;

       object shape = null;

       shape = symbols[0];

 

       switch ()

       {

              case :

              {

                     #region // 将面型(多边形)图元 合并为 一个面型图元

 

                     p;

                     p = shape as ;

 

                    for (int i = 1; i < ; i++)

                     {

                            p = (symbols[i], ) as ;

                     }

 

                     shape = p;

                     // 得到合并后的新图元的区域,是为了后面将当前新图元居中显示用

                     shapeExtent = ;

 

                     break;

 

                     #endregion

              }

              case :

              {

                     #region // 合并线性图元

 

                     L;

                     L = shape as ;

 

                    for (int i = 1; i < ; i++)

                     {

                            L = (symbols[i], ) as ;

                     }

 

                     shape = L;

                     shapeExtent = ;

 

                     break;

 

                     #endregion

 

              }

              case :

              default:

              {

                     p;

 

                     p = shape as ;

 

                     // 点没有宽度,所以将设为全图的2% 大小

                     shapeExtent = new ();

                     = - / 100;

                     = + / 100;

                     = + / 100;

                     = - / 100;

 

                     break;

              }

       }

 

       if (shape != null)

       {

              if (toCenter)

              {

                     // 放大至少达到当前范围的5%

                     rectExtent = ;

                     double factor, factorX, factorY;

 

                     factorX = () * 20 / ();

                     factorY = () * 20 / ();

                     factor = (factorX > factorY) ? factorX : factorY;

 

                     if (factor < 1 && factor > 0)

                     {

                            (factor);

                     }

 

                     // 居中

                     double deltaX, deltaY;

 

                     deltaX = () - ();

                     deltaY = () - ();

 

                     if (() == false)

                     {

                            (deltaX, deltaY);

                     }

 

                     = rectExtent;

                     ();

              }

 

              // 合并的图元闪烁3

              (shape, 3);

       }

}