MapXtreme增加基站、改变颜色、操作数据库

关于MapXtreme方面的几个问题:

需求1:

用户从客户端圈选几个小区,点击相应的按钮进行计算或其它处理,处理结束后,返回相关的框来显示处理结果,并且把选中的小区改变成红色。接着可以再处理其它小区,刚刚改变颜色的小区仍然显示改变后的颜色。

(我觉得跟你们搜索网元后的显示以及搜索频点的显示的效果类似)

两个问题:

1. 选中小区后,如何获得小区的相关信息。

我是通过获得选择集来从.tab文件获得小区的主键(已实现),然后再通过该主键利用ado.net去查询数据库来得到。不知道方法是否与你们一致。

2. 处理结束后,把选中小区显示成红色,这个还没解决好,更新失败,可能方法还有问题。

我想按你们相关类似功能的实现方法来做。改变地图后,如果不保存工作空间,那么对小区颜色的改变在下一次登陆不生效,反之下一次登陆颜色改变。你们用的是临时图层么?或是样式覆盖等其它的方法?

需求2:

新增基站。

问题:

1. 你们关于基站以及小区图层是在服务器端定时生成的,用户通过下载来进行更新。如果用户需要在地图上新增一个基站。基站及小区的画法应该如何实现。

我觉得思路应该是:为了保持一致,使用你们画基站和小区时的brush,pen等,往基站和小区天线的.tab图层里加,同时更新数据库。所以,需要知道你们使用的画笔画刷的样式以及画扇形的方法。

不知道这个思路是否正确。

答复:

需求1:

1、 方式是一致的,非常类似的功能应该是点击一个小区,在属性面板上显示小区的属性。

2、 类似于多个小区定位,给你代码

public void LocateMultisCell(ArrayList cellNameList,string layerName, Map map, Color cellColor,string labelString)

{

if(cellNameList.Count == 0)

return;

MapInfo.Data.Table isTable1 = MapInfo.Engine.Session.Current.Catalog.GetTable(layerName);

if(isTable1 != null)

isTable1.Close();

string tempLayerName = "Cell_"+ layerName;

//判断图层是否存在

MapInfo.Data.Table isTable = MapInfo.Engine.Session.Current.Catalog.GetTable(tempLayerName);

if(isTable != null)

isTable.Close();

System.Data.DataTable table = new DataTable();

DataColumn column1 = new DataColumn();

column1.DataType = System.Type.GetType("System.Int16");

column1.ColumnName = "myId";

table.Columns.Add(column1);

DataColumn column2 = new DataColumn();

column2.DataType = System.Type.GetType("System.String");

column2.ColumnName = "name";

table.Columns.Add(column2);

DataColumn column3 = new DataColumn();

column3.DataType = System.Type.GetType("System.String");

column3.ColumnName = "bcch";

table.Columns.Add(column3);

DataColumn column4 = new DataColumn();

column4.DataType = System.Type.GetType("System.String");

column4.ColumnName = "tch";

table.Columns.Add(column4);

DataColumn column5 = new DataColumn();

column5.DataType = System.Type.GetType("System.String");

column5.ColumnName = "bsic";

table.Columns.Add(column5);

DataColumn column6 = new DataColumn();

column6.DataType = System.Type.GetType("System.String");

column6.ColumnName = "chgr";

table.Columns.Add(column6);

DataRow row;

for (int i = 0; i< cellNameList.Count; i++)

{

Wellcomm.DataService.CellFreqEntity entity = (CellFreqEntity)cellNameList[i];

row = table.NewRow();

row["myId"] = 1;

row["name"] = entity.CellName;

row["bcch"] = entity.Bcch;

row["tch"] = entity.Tch;

row["bsic"] = entity.Bsic;

row["chgr"] = entity.Chgr;

table.Rows.Add(row);

}

TableInfoAdoNet tabAdo = new TableInfoAdoNet(tempLayerName);

tabAdo.ReadOnly = false;

tabAdo.DataTable = table;

MIConnection connection=new MIConnection();

connection.Open();

Table miStateInfo = connection.Catalog.OpenTable(tabAdo);

if(miStateInfo!=null)

{

MapInfo.Data.TableInfo tableInfo = MapInfo.Data.TableInfoFactory.CreateTemp(layerName);

tableInfo.Columns.Add(ColumnFactory.CreateStringColumn("id",20));

tableInfo.Columns.Add(ColumnFactory.CreateStringColumn("name", 50));

tableInfo.Columns.Add(ColumnFactory.CreateStringColumn("bcch", 20));

tableInfo.Columns.Add(ColumnFactory.CreateStringColumn("tch", 20));

tableInfo.Columns.Add(ColumnFactory.CreateStringColumn("bsic", 20));

tableInfo.Columns.Add(ColumnFactory.CreateStringColumn("chgr", 20));

tableInfo.Columns.Add(ColumnFactory.CreateIntColumn("myId"));

tableInfo.ReadOnly=false;

Table testTable = MapInfo.Engine.Session.Current.Catalog.CreateTable(tableInfo);

Table table1800 = MapInfo.Engine.Session.Current.Catalog.GetTable("DCS1800小区天线");

Table table900 = MapInfo.Engine.Session.Current.Catalog.GetTable("GSM900小区天线");

MIConnection miConn = new MIConnection();

MICommand miCommandA = miConn.CreateCommand();

MICommand miCommandB = miConn.CreateCommand();

miCommandA.CommandText="insert into "+layerName+

" (obj,MI_Style,id,name,myId,bcch,tch,bsic,chgr) "+

" select b.obj,b.MI_Style,b.id,b.name,a.myId,a.bcch,a.tch,a.bsic,a.chgr from "+ tempLayerName +" a, "+ table1800.Alias +" b where a.name = b.name";

miCommandB.CommandText="insert into "+layerName+

" (obj,MI_Style,id,name,myId,bcch,tch,bsic,chgr) "+

" select b.obj,b.MI_Style,b.id,b.name,a.myId,a.bcch,a.tch,a.bsic,a.chgr from "+ tempLayerName +" a, "+ table900.Alias +" b where a.name = b.name";

miConn.Open();

miCommandA.ExecuteNonQuery();

miCommandB.ExecuteNonQuery();

if(Wellcomm.Easywell.Gis.Util.ViewControls.NotEmptyTable(testTable))

{

MapInfo.Mapping.FeatureLayer featureLayer = new MapInfo.Mapping.FeatureLayer(testTable);

//插入到标注的后面

map.Layers.Insert(1,featureLayer);

//小区样式

MapInfo.Styles.SimpleInterior simpleInterior = new SimpleInterior(); //区域背景

simpleInterior.ForeColor = cellColor;

MapInfo.Styles.AreaStyle area = new MapInfo.Styles.AreaStyle();

area.Interior = simpleInterior;

SimpleLineStyle bor = new SimpleLineStyle();

area.Border = bor;

MapInfo.Styles.CompositeStyle compositeStyle = new MapInfo.Styles.CompositeStyle(area);

FeatureOverrideStyleModifier fsm = new FeatureOverrideStyleModifier("Style["+layerName+"]", compositeStyle);

featureLayer.Modifiers.Append(fsm);

//同邻频小区,标注显示:BCCH(BSIC) \n [chgr1]{TCH1}[chgr2]{TCH2}...

if(labelString != null && labelString != "")

Wellcomm.Easywell.Gis.Util.CustomLabelProperties.AddMultiLabel(map,testTable,labelString,cellColor);

//控制视野

//Wellcomm.Easywell.Gis.Util.ViewControls.ViewControl(testTable,map);

Wellcomm.Easywell.Gis.Util.ViewControls.NotSelect(map,testTable);

}

//关闭操作

miStateInfo.Close();

miCommandA.Cancel();

miCommandA.Dispose();

miCommandB.Cancel();

miCommandB.Dispose();

miConn.Close();

}

}

需求2:

首先,我们这边没有用户在地图上添加网元的应用场景。用户自己在地图上增加一个基站,这会引起数据库中数据的变化,如基站的覆盖、小区的归属、新增基站的归属都会发生变化,而这些变化会引起整个图层的变化,应该重新生成图层。

我认为不应该提倡这样的做法,如果一定要实现这样的操作,我认为在交互上用户发出请求后,首先更新数据库,然后生成.TAB文件,最后下载到客户机显示。

另外,基站和小区不是画上去的,是通过数据库生成MAPINFO文件,在程序中只是打开一个MAPINFO的表以增加一个图层。

以上只是个人意见,仅供参考。

posted @ 2011-06-17 23:47  googlegis  阅读(322)  评论(0编辑  收藏  举报

坐标合肥,非典型GIS开发人员 GitHub