关闭

GIS2004鹰眼

646人阅读 评论(0) 收藏 举报

要实现鹰眼功能有两个主要问题:用户在鹰眼窗口上点击的时候地图自动定位到相应的位置;当地图视图(包括缩放比例和中心)发生变化的时候,鹰眼窗口上的导航矩形框相应

变化以指示用户当前所处的位置。
第一个问题可以通过客户端捕获用户在鹰眼窗口上点击的位置,发送到服务器,服务器端把该位置转换为地图坐标并更新地图的中心点来实现。为了便于保持地图或者页面上其它

Web Control的状态,这个回发应该用HTTP POST来实现。
第二个问题复杂一些,需要在地图的视图改变的时候根据地图当前的边距生成一个矩形框,然后把这个矩形框放到一个临时图层里面并添加到鹰眼窗口上。因为地图视图改变事件

难以捕获,可以在MapControl的PreRender事件里来实现这个功能,这样在每次页面生成的时候都生成一次导航矩形框。

首先在.aspx文件上添加两个MapInfo.Web.UI.WebControls.MapControl。一个叫mcEagle,小一些做为鹰眼窗口。一个叫mcMain,用来显示主地图。
<MapInfoWebUIWebControls:MapControl id="mcEagle" style="Z-INDEX: 101; LEFT: 8px; POSITION: absolute; TOP: 8px" runat="server"
WorkspaceFileName="WebForm1mcEagle.mws" Height="150px" Width="200px" BorderStyle="Solid" BorderWidth="1px" MapAlias="Map11"
UseDesigntimeWorkspace="True" Format="Gif"></MapInfoWebUIWebControls:MapControl>
<mapinfowebuiwebcontrols:MapControl id="mcMain" style="Z-INDEX: 102; LEFT: 8px; POSITION: absolute; TOP: 168px" runat="server"
WorkspaceFileName="WebForm1mcMain.mws" Height="600px" Width="800px" BorderStyle="Solid" BorderWidth="1px" MapAlias="Map12"
DisplayCoordSys="经度/纬度" UseDesigntimeWorkspace="True" Format="Gif" Zoom="3000"></mapinfowebuiwebcontrols:MapControl>

再放置一个隐藏的input来保存用户点击鹰眼窗口的位置
<INPUT id="iPoint" type="hidden" runat="server" NAME="iPoint">

在页面的Page_Load事件里写以下代码
mcEagle.Attributes.Add("onclick","Form1.iPoint.value=event.offsetX + '|' + event.offsetY;Form1.submit()");

if(iPoint.Value != "")
{
string []point;
int screenX = -1;
int screenY = -1;

point = iPoint.Value.Split('|');

try
{
screenX = Convert.ToInt32(point[0]);
screenY = Convert.ToInt32(point[1]);
}
catch(Exception)
{
}

if ( screenX >= 0 && screenY >= 0 )
{
System.Drawing.Point pntClick = new System.Drawing.Point(screenX,screenY);
DPoint pntCenter = new DPoint(0,0);
mcEagle.Map.DisplayTransform.FromDisplay(pntClick, out pntCenter);
mcMain.Map.Center = pntCenter;
}

iPoint.Value = "";
}

为mcMain的PreRender事件添加事件处理方法
private void mcMain_PreRender(object sender, System.EventArgs e)
{
if(mcMain.Map.Layers.Count == 0)
return;

//创建样式
MapInfo.Geometry.Rectangle rectangle = new MapInfo.Geometry.Rectangle(mcEagle.Map.GetDisplayCoordSys(),mcMain.Map.Bounds);
MapInfo.Styles.AreaStyle aStyle = new AreaStyle();
aStyle.Border = StockStyles.RedLineStyle();
aStyle.Interior = new SimpleInterior(0);
CompositeStyle cStyle = new MapInfo.Styles.CompositeStyle(aStyle);


//创建内存临时表
TableInfoMemTable tableInfo = new TableInfoMemTable("EagleEyeTemp");
tableInfo.Temporary = true;

Column column;
column = new GeometryColumn(mcEagle.Map.GetDisplayCoordSys());
column.Alias = "MI_Geometry";
column.DataType = MIDbType.FeatureGeometry;
tableInfo.Columns.Add(column);

column = new Column();
column.Alias = "MI_Style";
column.DataType = MIDbType.Style;
tableInfo.Columns.Add(column);

MapInfo.Data.Table map_table;
MIConnection conn = new MIConnection();
conn.Open();
MICommand cmd = conn.CreateCommand();

if(MapInfo.Engine.Session.Current.Catalog["EagleEyeTemp"] == null)
{
map_table = MapInfo.Engine.Session.Current.Catalog.CreateTable(tableInfo);

cmd.Parameters.Add("geometry",MIDbType.FeatureGeometry);
cmd.Parameters.Add("style",MIDbType.Style);
cmd.CommandText = "Insert Into EagleEyeTemp (MI_Geometry,MI_Style) values (geometry,style)";
cmd.Prepare();
cmd.Parameters[0].Value = rectangle;
cmd.Parameters[1].Value = cStyle;
int nchanged = cmd.ExecuteNonQuery();
}
else
{
map_table = MapInfo.Engine.Session.Current.Catalog["EagleEyeTemp"];

cmd.Parameters.Add("geometry",MIDbType.FeatureGeometry);
cmd.CommandText = "Update EagleEyeTemp Set MI_Geometry = geometry";
cmd.Prepare();
cmd.Parameters[0].Value = rectangle;
int nchanged = cmd.ExecuteNonQuery();
}

//创建临时图层
MapInfo.Mapping.FeatureLayer temp_layer = new FeatureLayer(map_table,"EagleEyeTemp");

for(int i = 0;i < mcEagle.Map.Layers.Count;i++)
{
if(mcEagle.Map.Layers[i].Alias == "EagleEyeTemp")
{
mcEagle.Map.Layers.Remove("EagleEyeTemp");
break;
}
}

mcEagle.Map.Layers.Add(temp_layer);
}

建议将
this.MapControl1.Map.Layers.Add(temp_layer);
改为
this.MapControl1.Map.Layers.Insert(1,temp_layer);

不然会被后面的图层覆盖

function cc()
{
document.Form1.iPoint.Value=event.x+ '|' + event.y;
document.Form1.txtSpotType.value=document.Form1.iPoint.Value;
Form1.submit();
}
 

隐藏文本框的赋值 直接会丢 但是再导一遍就不会了

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:320686次
    • 积分:4193
    • 等级:
    • 排名:第7611名
    • 原创:50篇
    • 转载:203篇
    • 译文:0篇
    • 评论:78条
    最新评论
    自己收藏的网站