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);
}
}