发来自己从网上收集的mapxtreme2004的开发技术文档,整理成册,希望对各位有所帮助。
MapxTreme 2004 开发技术集锦
2006年6月 Edit By Xjh197876
http://jetz.cnblogs.com/archive/2005/11/01/265948.html
常用代码:
6080504 “10382913”为.net+MapXtreme2004技术交流专用群,欢迎加入!
QQ:67204513 Jerry42
MapXtreme+C# 求取最佳道路,添加到图层并显示
//创建临时表
MapInfo.Data.TableInfoMemTable tbl=new MapInfo.Data.TableInfoMemTable("pathTable");//构建新的内存表pathTable
tbl.Columns.Add(MapInfo.Data.ColumnFactory.CreateFeatureGeometryColumn(coordSys));
tbl.Columns.Add(MapInfo.Data.ColumnFactory.CreateStyleColumn());
MapInfo.Data.Table table=MapInfo.Engine.Session.Current.Catalog.CreateTable(tbl);
//生成路径
MapInfo.Geometry.MultiCurve pathLine=new MultiCurve (coordSys,CurveSegmentType.Linear,pointArray);
//设置线式
LineWidth width=new LineWidth(5,MapInfo.Styles.LineWidthUnit.Pixel);
int linePattern=1;
Color color=System.Drawing.Color.Red;
MapInfo.Styles.Style style=new SimpleLineStyle(width, linePattern,color);
MapInfo.Data.Feature f=new MapInfo.Data.Feature(pathLine,style);
f.Style=style;
table.InsertFeature(f);
// 添加图层,显示路线
// MapInfo.Mapping.IMapLayer layer=new MapInfo.Mapping.FeatureLayer(table);
// MapControl1.Map.Layers.Insert(2,layer);//添加到第三层
FeatureLayer lyr = new FeatureLayer(table);
MapControl1.Map.Layers.Insert(0,lyr);//添加到最上层
Cursor.Current=Cursors.Default;
大家用上面代码就可以实现了,经测试,图层确实已经成功添加!
但是,在显示的时候却看不见,谁知道,请顶我啊
QQ:67204513
Jerry429的Tip贴=011、如何在MapXtreme2004桌面应用程序中的状态栏上显示出鼠标的坐标?
011、如何在MapXtreme2004桌面应用程序中的状态栏上显示出鼠标的坐标?
1、添加mapControl1的MouseMove事件;
2、该事件及其中代码如下:
public void MapControl1_MouseMove(object sender, MouseEventArgs e)
{
System.Drawing.PointF DisplayPoint = new PointF(e.X,e.Y);
MapInfo.Geometry.DPoint MapPoint = new MapInfo.Geometry.DPoint();
MapInfo.Geometry.DisplayTransform converter = this.mapControl1.Map.DisplayTransform;
converter.FromDisplay(DisplayPoint, out MapPoint);
this.statusBar1.Text = "Cursor Location: " + MapPoint.x.ToString() + ", " + MapPoint.y.ToString();
}
请教:关于标注
正在用MapXtreme2004 +SpatialWare for sqlserver做webgis
现在有个问题,涉及到用户,每个用户都能标注,而且标注的都要存起来,下次登录后 标注的东西不会消失,各位帮忙出出主意啊
1。保存标注点位置、样式、内容等,下次登陆进来,动态生成TEXT对象 2。保存到点图层,点样式隐藏,标注内容作为点属性,不同用户建立不同图层
图层
1、加载地图,选择图层
if(!Page.IsPostBack)
{
MapControl1.Map.Clear();
MapControl1.Map.Load(MapLoader.CreateFromFile(Server.MapPath("/mymap")+"\\map\\xy.gst"));
MapControl1.SelectableLayers.Clear();
MapControl1.SelectableLayers.Add("o地名p");
}
2、清空图层
可以把图层当成一个结果集
(_tempTable as IFeatureCollection).Clear();
3、根据图层名获得图层
MapInfo.Engine.Session.Current.Catalog.GetTable(TableName)
图元
1、遍历所有结果集
Selection sl =MapInfo.Engine.Session.Current.Selections.DefaultSelection;
IResultSetFeatureCollection fc=sl[0];
IFeatureEnumerator fn=fc.GetFeatureEnumerator();
ListBox1.Items.Clear();
while(fn.MoveNext())
if(fn.Current.Geometry.GetType().ToString()=="MapInfo.Geometry.LegacyText")
ListBox1.Items.Add(((MapInfo.Geometry.LegacyText)fn.Current.Geometry).Caption);
2、根据关键字获得(第一个)图元
MapInfo.Engine.Session.Current.Catalog.SearchForFeature("Layer1",MapInfo.Data.SearchInfoFactory.SearchWhere("MI_Key='"+strKey+"'") )
两次都是,原因才发现:缺少了两个js文件,而这两个js文件,都来自<script language="javascript" src="/MapXtremeWebResources/Map.js"></script>,而虚拟主机中,没有创建这个虚拟目录。创建之,指向C:\Program Files\Common Files\MapInfo\MapXtreme\6.0\WebResources,只要读权限即可。
Mapxtreme之活活气死
都是小问题,但是都耗费了我巨大的精力和时间。在缺乏资料的情况下,一点点小问题都会非常麻烦,有时真是气死人不偿命:1、加载地图(gst文件),设定的selectable属性不管用
2、手工添加MapControl.SelectableLayers,发现添加Layer对象完全可以,但是完全无效,上下求索之后,发现只能添加图层字符串才有效!!!
3、发现无论是修改feature还是加入feature,都报告不能执行,化了几乎一天的时间,将几乎各种可能性都试验过了,包括帮助和mapinfo的官方文档,都不行。最终发现:只是因为没有开发写权限(跟上传文件夹一样)
4、自定义工具,无论用网上的还是官方的代码,都报错,说没有对象,最后怀疑是没有保持住状态,检查发现,虽然把新工具加入到maptools中,但每次postback都会消失,所有在load中每次都需加载一次。
5、创建一个鹰眼功能类,能够响应Map控件的修改事件。但是,在原来页面下代码正常,但在类中却不正常,在重新修改表后不能绘制。反复检查:session,postback,事件传递......都不是,真正的原因是,在类中如果修改后需要Invalidate();
6、7-25:在用Map.SetView Method (DPoint, CoordSys, Distance)设置范围时,想着前面取Coordsys都用这个,
MapControl1.Map.SetView(ftr.Geometry.Centroid,MapControl1.Map.GetDisplayCoordSys(),new Distance(0.3,DistanceUnit.Kilometer));
但是出错,找帮助,发现改用这个
MapControl1.Map.SetView(ftr.Geometry.Centroid,ftr.Geometry.CoordSys ,new Distance(0.3,DistanceUnit.Kilometer));
# re: Mapxtreme之活活气死 2005-10-20 22:13 first
mapxtreme 用上后总是提示session失效,这个问题还好,重新刷新后行了。
最后还提示com+无法在指定的时间内激活,没办法解决,不知什么原因,询问技术支持
答:没遇到过此类问题,让我给他发我们的程序过去,我怎么发?400多M
mapxtreme提示找不到预期图层map1 ,问技术支持
答:操作太快!
请问,我不问他们,你们能不能给个解决办法啊?
yuxin2526@163.com
回复
# re: Mapxtreme之活活气死2005-12-19 18:05 八风不动
1、加载地图(gst文件),设定的selectable属性不管用
2、手工添加MapControl.SelectableLayers,发现添加Layer对象完全可以,但是完全无效,上下求索之后,发现只能添加图层字符串才有效!!!
这两条我也遇到了,好郁闷啊!
在MapXTreme2004中创建自定义工具
前段时间,在使用MapXtreme 2004开发Web程序的时候,需要自己定义一个测量面积的工具。为此,查了一些资料,走了不少弯路,总算做成了,现在总结一下,和大家分享。
一、一般实现
一般来说,要自定义工具,只需要从MapInfo.Web.UI.WebControls.MapTool继承,创建一个子类即可,里面关键要指定:ClientCodeSource、ClientStartMethod、ClientStopMethod、CursorUrl属性,并重载Execute方法,自定制工具的逻辑就在该方法内实现。
这样,通过指定:MapControl.MapTools.CurrentTool 就可以实现了。
但是,这样的实现,功能单一,而且也将功能写死了,下面介绍一种功能稍微完整但有些复杂的方法。
二、复杂实现
实现思路如下:
1、 集成EventArgs类,创建自定义工具的事件参数,如:customAreaToolEnventArgs。
2、 继承MapInfo.Web.UI.WebControls.MapTool类,创建自己的子类。
+在该类中指定ClientCodeSource、ClientStartMethod、ClientStopMethod、CursorUrl等属性,
+在该类中加入时间和事件处理器;如:
public delegate void customAreaToolEventHander( Object sender, customAreaToolEnventArgs e );
public event customAreaToolEventHander CalculateFinished;
+并重载Execute方法,并在该方法中触发事件。
3、将自定义的工具创建成控件。
4、在Html文件中使用TagPrefix注册该控件。如:
6、加入事件处理函数。
在VS2003.NET开发环境中,通过该控件的事件属性,可以很容易的加入该事件。如:
private void myareatoolcontrol_CalculateFinished(object sender, WebGIS.customAreaToolEnventArgs e)
{
this.TextBox1.Text = string.Format("测量面积:\n{0}\n平方公里", e.Area );
}
上面也许说的不清楚,为了清楚起见,我把创建自定义控件的C#文件也贴上来,供大家交流。有什么问题,可以MSN联系:henan_lujun@hotmail.com
附代码:点击下载
.....................