关于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的表以增加一个图层。
以上只是个人意见,仅供参考。