mapx学习笔记资料手册

上传人:飞*** 文档编号:44493322 上传时间:2018-06-09 格式:DOC 页数:58 大小:196KB
返回 下载 相关 举报
mapx学习笔记资料手册_第1页
第1页 / 共58页
mapx学习笔记资料手册_第2页
第2页 / 共58页
mapx学习笔记资料手册_第3页
第3页 / 共58页
mapx学习笔记资料手册_第4页
第4页 / 共58页
mapx学习笔记资料手册_第5页
第5页 / 共58页
点击查看更多>>
资源描述

《mapx学习笔记资料手册》由会员分享,可在线阅读,更多相关《mapx学习笔记资料手册(58页珍藏版)》请在金锄头文库上搜索。

1、MAPX 学习使用笔记学习使用笔记 资料资料Mapxtreme 下面应该有三种图层下面应该有三种图层 一种是固定图层 当你新建一个固定图层的时候会生成*.tab 等文件 一种是临时图层 不生成*.tab 文件 一种是用户绘制图层 用户自己使用 CDC(Graphics) 进行绘图 如果你想对多边形进行编辑 至少你要响应 Mapxtreme 的鼠标事件 通过鼠标事件来确定当前用户在进行何种操作。 一般的过程是这样的: 1.新建一个图层(建议临时图层或者用户绘制图层) 2.根据多边形的点的位置绘制图元或者用 CDC 绘制过变形 同时确定各个点在 Mapxtreme 地图窗口的位置 建立各个点的鼠标

2、响应区域 3.通过鼠标落下的时候通过各个点的响应区域判断那个点被选中 鼠标移动 和抬起时要做响应的处理 来改变多边形选中点的位置 重重新给多边形的点赋值 如果使用临时图层 需要对临时图层里面的多边形图元的点参数进行更改 如果是 CDC 绘图的话只要更改 CDC 绘图即可 整个过程中需要考虑到地图坐标与 Mapxtreme 窗口坐标之间的转化。通过对象编辑工具,用户可以在地图图层中创建和修改图元。有四种标准的对象创建工具:通过对象编辑工具,用户可以在地图图层中创建和修改图元。有四种标准的对象创建工具:“添加添加 点” 、 “添加线条” 、 “添加折线”和“添加区域” 。 注:若要设置所使用的工具

3、,请设置 Map.CurrentTool 属性。 对象编辑工具将新图元添加到在 Layers.InsertionLayer 属性中指定的任何图层中。只能有一个插入图 层,并且默认情况下是没有插入图层。在没有任何插入图层时将当前工具设置为对象创建工具将导致 错误。 MapX 还支持对现有地图图元的修改。若要编辑图元,则对于您要更改的任何图层,必须将 Layer.Editable 属性设置为真。然后,可以使用内置的“箭头”工具,在当前选择中移动图元或调整图 元的大小。若要移动选定图元,只需单击并在选代码名称:向已存在的图层中添加数据代码名称:向已存在的图层中添加数据作者/收集者:xyz2004 开

4、发环境:MapX + Delphi代码:procedure TForm1.Button2Click(Sender: TObject);varlyrnew:CMapxLayer;ds: CMapxDataset;rvs: CMapxRowvalues;rv: CMapxRowvalue;ptNew: CMapXpoint;ftrNew: CmapXFeature;beginlyrNew := Map1.Layers.item(1);ds := Map1.Datasets.Add(miDataSetLayer, lyrNew,emptyparam,emptyparam,emptyparam,emp

5、typaram,emptyparam,emptyparam);/rvs := ds.Rowvalues1.Clone ;rv:= CoRowvalue.Create;rvs:=CoRowvalues.Create;rv.Dataset:=ds;rv.Field:=ds.Fields.Item(1); /假设 mi 表有两个字段,填充之rv.value :=item1;rvs.Add(rv);rv.Field:=ds.Fields.Item(2);rv.value :=item2;rvs.Add(rv);ptNew:=CoPoint.Create;ptNew.Set_(map1.centerx,

6、 map1.centery);ftrNew := map1.FeatureFactory .CreateSymbol(ptNew,emptyparam);ftrNew := lyrNew.AddFeature(ftrNew, rvs); / 图元+属性,即 feature+Rowvalues/ftrNew = lyrNew.AddFeature(ftrNew);/ftrNew.Update (True, rvs);end.代码名称:在代码名称:在 MapXMapX 中实现图元闪烁原码中实现图元闪烁原码作者/收集者:zlx开发环境:Delphi + MapX代码:MapX 图元分三种类型: 1、

7、线(Line),即 miFeatureTypeLine 2、区域(Region),即 miFeatureTypeRegion 3、点符号(Symbol),即 miFeatureTypeSymbol 加入一个时钟控件,并在时钟控件中实现以下代码: procedure TMapFrm.tmFlashSelectTimer(Sender: TObject); var ft: CMapXFindFeature; lyr: CMapXLayer; bExist: Boolean; i: Integer; str: String; ds: CMapXDataset; begin bExist := Fal

8、se; for i := 1 to mapCity.Layers.Count do begin if mapCity.Layers.Itemi.Name = m_strSelLyr then begin bExist := True; break; end; end; if not bExist then begin tmFlashSelect.Enabled := False; MsgFrm := TMsgFrm.Create(Self); MsgFrm.m_strMsg := Format(图层%s信息不存在!,m_strSelLyr); MsgFrm.ShowModal; MsgFrm.

9、Free; Exit; end; lyr := mapCity.Layers._Item(m_strSelLyr); ds := mapCity.Datasets.Add(miDataSetLayer, lyr ,EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam); lyr.Find.FindDataset := ds; lyr.Find.FindField := ds.Fields.Item1; str := Format(%d,m_nSelID); ft := lyr.Find.Search(str

10、,EmptyParam); if ft.FindRC mod 10 min_x = rc-max_x = vl0.x; rc-min_y = rc-max_y = vl0.y; else rc-min_x = rc-min_y = rc-max_x = rc-max_y = 0; /* =0 ? no vertices at all */ for(i=1; i if(vli.x min_x) rc-min_x = vli.x; if(vli.y min_y) rc-min_y = vli.y; if(vli.x rc-max_x) rc-max_x = vli.x; if(vli.y rc-m

11、ax_y) rc-max_y = vli.y; 当点满足落在多边形外包矩形内的条件,要进一步判断点(v)是否在多边形(vl:np)内。本程序采用 射线法,由待测试点(v)水平引出一条射线 B(v,w),计算 B 与 vl 边线的交点数目,记为 c,根据奇内偶 外原则(c 为奇数说明 v 在 vl 内,否则 v 不在 vl 内)判断点是否在多边形内。具体原理就不多说。为计算线段间是否存在交点,引入下面的函数:(1)is_same 判断 2(p、q)个点是(1)否(0)在直线 l(l_start,l_end)的同侧;(2)is_intersect 用来判断 2 条线段(不是直线)s1、s2 是(1

12、)否(0)相交;以下是引用片段:以下是引用片段:/* p, q is on the same of line l */ static int is_same(const vertex_t* l_start, const vertex_t* l_end, /* line l */ const vertex_t* p, const vertex_t* q) double dx = l_end-x - l_start-x; double dy = l_end-y - l_start-y; double dx1= p-x - l_start-x; double dy1= p-y - l_start-y

13、; double dx2= q-x - l_end-x; double dy2= q-y - l_end-y; return (dx*dy1-dy*dx1)*(dx*dy2-dy*dx2) 0? 1 : 0); /* 2 line segments (s1, s2) are intersect? */ static int is_intersect(const vertex_t* s1_start, const vertex_t* s1_end, const vertex_t* s2_start, const vertex_t* s2_end) return (is_same(s1_start

14、, s1_end, s2_start, s2_end)=0 下面的函数 pt_in_poly 就是判断点(v)是(1)否(0)在多边形(vl:np)内的程序:以下是引用片段:以下是引用片段:int pt_in_poly ( const vertex_t* vl, int np, /* polygon vl with np vertices */ const vertex_t* v) int i, j, k1, k2, c; rect_t rc; vertex_t w; if (np x x rc.max_x | v-y y rc.max_y) return 0; /* Set a horizo

15、ntal beam l(*v, w) from v to the ultra right */ w.x = rc.max_x + DBL_EPSILON; w.y = v-y; c = 0; /* Intersection points counter */ for(i=0; i j = (i+1) % np; if(is_intersect(vl+i, vl+j, v, else if(vli.y=w.y) k1 = (np+i-1)%np; while(k1!=i k2 = (i+1)%np; while(k2!=i if(k1 != k2 if(k2 0 then begin hbr :

16、= CreateSolidBrush(clRed); if (Ptinregion(rgn,point.X,point.Y)=True) then FillRgn(Form1.Canvas.Handle,rgn,hbr); deleteObject(rgn); DeleteObject(hbr); end; end;通过经纬度坐标来计算地表上两点间的距离通过经纬度坐标来计算地表上两点间的距离 Post By:2008-6-7 13:55:00 现在许多地图的坐标系统用的是 WGS1984 坐标系,其坐标单位为经纬度,那么如何通过用经纬度坐标计算地表上两点间的距离呢?这里不需要涉及到坐标投影,直接用经纬度坐标求解圆弧的长度是计算地表上两点间距离的精确方法。如果考虑地表的高程变化,使用经纬度结合

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号