mapinfo画扇形.docx
- 文档编号:95621
- 上传时间:2022-10-02
- 格式:DOCX
- 页数:8
- 大小:16.57KB
mapinfo画扇形.docx
《mapinfo画扇形.docx》由会员分享,可在线阅读,更多相关《mapinfo画扇形.docx(8页珍藏版)》请在冰豆网上搜索。
mapinfo中绘制基站扇形的算法讨论和工具共享
【资料名称】:
mapinfo中绘制基站扇形的算法讨论和工具共享
【资料作者】:
YZL
【资料日期】:
2009.01
【资料语言】:
中文
【资料格式】:
其它
【资料目录和简介】:
mapinfo中绘制基站扇形的算法讨论和工具共享.讨论5种算法并将我以前弄的一个工具贡献给大家试试
---- 讨论和说明
很多同仁在论坛中谈论也自己编程做了一些基站扇区(扇形、直线)图形绘制工具,包括很多规划软件都有一个问题
就是生成的扇形图形在mapinfo等gis系统中有一定失真。
当然由网友说这点失真可能不算啥了,如果是这样你就不必看下面的方法了。
下面以MAGPINFO为例来说明,MAPINFO采用的WGS-84椭球体坐标系,而我们日常一般习惯于在笛卡尔坐标系中处理,这也是处理容易失真原因
我总结了一下,很多人在编制mapinfo下生成扇形图形的时候有如下做法:
方法1:
(极端做法):
直接将直角坐标用于计算,
如:
x=r*cos(theta),y=r*sin(theta) 这种做法完全将一个地球球体表面当成平面来处理,这种做法失真最大(当然如果地表面积足够小的时候误差也不是很明显)。
这种做法论坛里很多excel2ge/excel2mapinfo都是这种方法。
我个人认为此方法不可取。
方法2:
采用直角坐标到经纬度的近似转换关系计算,这种算法采用经纬度和直角坐标之间的简单关系【/(69.093*1609)】。
如网上的“[vb+Mapx]实现扇区三叶草图形",大家可以搜索学习一下。
这种算法个人感觉也不够精确。
方法3:
采用大地主题解算算法来实现。
这种算法需要很多专业知识背景(我就是猛学了一段时间的测量专业的教材才理解的)。
大地主题解算有很多算法,我采用了白赛尔算法实现,具体算法我已经放到了上帝之眼上,大家有兴趣可以自行看看:
基站扇区绘制工具(YZL)"就是按照这个算法弄的。
方法4:
(mapinfo中,我采用mapbasic编程),将经纬度转换成直角坐标系,然后再在直接坐标系下(SETECOORDSYSnonearth语句)画线和画圆弧,然后再切换到经纬度坐标系下。
这个方案比较简单,但是从earth坐标系到nonearth坐标系的转化,暂时没有找到好的方法,而且误差也很大。
我认为不可取)方法5:
(mapinfo中,我采用mapbasic编程),想了另外一种方法:
充分利用MAPINFO自身功能,完全抛开直角坐标到经纬度的转换,实现起来很方便而且效
果很好。
下面简单介绍一下方法5:
主要思路:
采用类似于我们高中几何中常用到的辅助线的方法,直接再经纬度坐标系下处理。
mapinfo下绘制圆弧采用的命令是CreateArc。
但mapinfo中CreateArc语句没有基于两个端点和圆心来绘制的方式。
而是采用了四个点的坐标方式(这又涉及到了坐标转换的问题了)。
庆幸的是我们可以通过采用辅助圆的方式取得需要绘制圆弧的四个点的坐标:
1、使用CREATECIRCLE语句创建圆,然后再用ObjectGeography求出圆的外接矩形的左下角和右上角的坐标(左下角(minxminy)右上角(maxxmaxy)。
2、根据这两个点(minxminy)(maxxmaxy)和中心点以及起始角和终止角来绘制弧形。
3、将弧形转换成pline取出弧形的两个端点。
4、将两个端点和中心相连
5、图元合并就可以得出扇形
这种做法缺点也有:
由于mapinfo的处理精度问题,所以半径小于10m 或者大于500km均还是有一定误差,但是这已经不影响使用了。
主要算法如下:
'主要问题是mapinfo中CreateArc语句没有基于两个端点和圆心来绘制的方式。
而是采用了四个点的坐标方式。
'采用辅助圆的方式取得需要绘制圆弧的四个点的坐标
'通过这四个点绘制弧形,然后取得该弧形的两个端点坐标'通过端点坐标和圆心绘制直线
'最后合并直线和圆弧就得到了标准的扇形,效果不错
functionmycreateregion(经度,纬度,方向角,半功率角,半径asfloat)asobject
dimx,y,r,x1,y1,x2,y2,start_angle,end_angleasfloat
dimarc_obj,line1_obj,line2_obj,obj1,obj2,circle_obj asobject
dimendpointstring,endxstring,endystringasstring
dimminx,miny,maxx,maxyasfloat'''''''园的左下角和右上角坐标
X=经度
Y=纬度
r=半径
start_angle=方向角-半功率角/2
end_angle=半功率角/2+方向角
circle_obj=CreateCircle(x,y,r) ''这里绘制辅助圆,
minx=ObjectGeography(circle_obj,obj_geo_minx)
miny=ObjectGeography(circle_obj,obj_geo_miny)
maxx=ObjectGeography(circle_obj,obj_geo_maxx)
maxy=ObjectGeography(circle_obj,obj_geo_maxy)'''这四行取得绘制圆弧的关键点坐标,
if(方向角<>-270)and(半功率角<>360) then '此处的方向角是经过处理后的方向角
CreateArcintoVariablearc_obj
(minx,miny)(maxx,maxy)
start_angle end_angle
dimxx1,yy1,xx2,yy2asfloat
xx1=getArcBEGX(arc_obj)
yy1=getArcBEGY(arc_obj)
xx2=getArcENDX(arc_obj)
yy2=getArcENDY(arc_obj) '这里是取得圆弧的端点坐标
CreateLineintoVariableline1_obj
(x,y)(xx1,yy1)
CreateLineintoVariableline2_obj
(x,y)(xx2,yy2) '这里是绘制两条直线
obj1=
ConvertToRegion(Combine(arc_obj,Combine(line1_obj,line2_obj)))'合并
else
obj1=circle_obj''''''''''''''''''''''全向站的处理,直接画圆
endif
mycreateregion=obj1 '返回扇形。
endfunction
''''求圆弧端点的程序''''''''''''''''''
functiongetArcBEGX(byvalobjasobject)asfloat
if
objectinfo(obj,OBJ_INFO_TYPE)=1then
dimdasobject
d=ConvertToPline(obj)
else
getArcBEGX=ObjectNodeX(d, 1, 1)
endif
getArcBEGX=0
endfunction
functiongetArcBEGY(byvalobjasobject)asfloat
if objectinfo(obj,OBJ_INFO_TYPE)=1then
dimdasobject
d=ConvertToPline(obj)
getArcBEGY=ObjectNodeY(d, 1, 1)
else
getArcBEGY=0
endifendfunction
functiongetArcENDX(byvalobjasobject)asfloat
if objectinfo(obj,OBJ_INFO_TYPE)=1then
dimdasobject
d=ConvertToPline(obj)
getArcENDX=ObjectNodeX(d,
1,
objectinfo(d,OBJ_INFO_NPNTS))
else
getArcENDX=0
endifendfunction
functiongetArcENDY(byvalobjasobject)asfloat
if
objectinfo(obj,OBJ_INFO_TYPE)=1then
dimdasobject
d=ConvertToPline(obj)
getArcENDY
=ObjectNodeY(d, 1, objectinfo(d,OBJ_INFO_NPNTS))
else
getArcENDY=0
endifendfunction
我基于方法5做了一个简单的mapinfo基站扇区图形生成工具,大家试试看。
大家使用超级用户密码登录就可以了,密码为:
leizi_y。
这个工具实现了点、线、面图形的自定义等等功能,但没有做excel/TXT导入mapinfo这样基本的功能(我认为这个mapinfo自身已经能够足够处理了)。
欢迎大家讨论leizi_y@,qq:
31933208
大地主题解算(正算)代码:
根据经纬度和方向角以及距离计算另外一点坐标
新建模块->拷贝下面的大地主题(正算)代码,调用方法示例:
起点经度:
116.235(度)
终点纬度:
37.435(度)方向角:
50(度)
长度:
500(米)
终点经纬度("经度,纬度")=Computation(37.435,116.235,50,500)
OptionExplicit
Constpi=3.1415926535898
Privatea,b,c,alpha,e,e2,w,VAsDoublePrivateB1,L1,B2,L2AsDouble
PrivatesAsDoublePrivateA1,A2AsDouble
PrivateSubgetellipseparameter()a=6378245
b=6356752.3142
c=a^2/b
alpha
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- mapinfo 扇形