交点

上一篇 / 下一篇  2008-06-16 10:19:01 / 个人分类:网上的一些源程序

include "mapbasic.def"
o Mr}8|{0Declare sub Main
y:\ K0Gp7?"K(t2n0MSCBSC | 移动通信网b&kB)H_Sv;^"b P
sub mainMSCBSC | 移动通信网1pr;`B%r&m^)@wnp
Dim obj1,obj2,obj3 as object
#S g8R.}Q2m"Q0Dim iRow1,iRow2 as integer
hl_ C!h6}`4{0Dim iNext as integer
*w5gb9e&V x0Dim x1,y1,x2,y2,x,y as floatMSCBSC | 移动通信网!LD ~5I-g-R
Dim objTemp as objectMSCBSC | 移动通信网a aJ7D#j2On
Dim iNode,iSec as integer
3zp8]zh"K0Dim i as integer
a?T.TU0Dim len1,len2 as floatMSCBSC | 移动通信网7ywv m;w-P,n
Dim min as floatMSCBSC | 移动通信网gyqZ^
MSCBSC | 移动通信网+Qrgifx
min=30 ´最小线段长度,因为我发觉MapInfo中计算得到的两Line交点与真正截断的点之间存在误差
mQI5Y1tk;w oO0set distance units "m"
h y j Xb.V']yMc0select * from 国省道 into STable
-z d!B;c Tq3S7c0
yMcCFw5f`8m0fetch first from STable ´first
t*r3jD2A0MSCBSC | 移动通信网4{&Nh"W_!~{6n
while not eot(STable)
Kj5@i s"G;Z#t0obj1=STable.objMSCBSC | 移动通信网,KF S6Tb9} B(\J
iRow1=STable.rowidMSCBSC | 移动通信网X{&wj&Ib7h#t9yt

;C-e |jLz6o@0select * from 国省道 into temp where obj intersects obj1 and rowid<>iRow1
-\ g6z E r)TY0
rX~7_4t8a jR/?b0if TableInfo(temp,TAB_INFO_NROWS)>0 then
X:f9j c8e;rOT0fetch first from temp
*a9FK8H[6n$S4o6\2P N0while not eot(temp)MSCBSC | 移动通信网x$M] ~h0B!^%Q
obj2=temp.objMSCBSC | 移动通信网x6p/P} E FDE
iRow2=temp.rowidMSCBSC | 移动通信网!z-tLy1o
obj3=IntersectNodes (obj1, obj2, INCL_CROSSINGS)MSCBSC | 移动通信网`0cZLPD
iNode=objectinfo(obj3,OBJ_INFO_NPNTS) MSCBSC | 移动通信网o/r0x|+W#Y;i3b
if iNode>0 and objectinfo(obj3,OBJ_INFO_TYPE)=OBJ_TYPE_PLINE thenMSCBSC | 移动通信网[5D H2EL"O-P
&acute;相交点
9W%X:wvx0x=ObjectNodeX(obj3,1,1)
ln'X Th,i2h0y=ObjectNodeY(obj3,1,1)
Z^1[\aTo Ts0MSCBSC | 移动通信网r&i6\l1i6_v`Y
if objectinfo(obj2,OBJ_INFO_TYPE)=OBJ_TYPE_LINE thenMSCBSC | 移动通信网p6kE G)Cd["[|*e`&|$I$o
&acute;相交线起点
8Ahp0mc0B^0x1=ObjectGeography(obj2,OBJ_GEO_LINEBEGX) MSCBSC | 移动通信网 |i5m1?3m%w5e
y1=ObjectGeography(obj2,OBJ_GEO_LINEBEGY) MSCBSC | 移动通信网 c!d/} |:~EC4t

Us"f&p6y q!X6R0W3E,`0&acute;相交线终点
M0Z!`:`eg!Sv'`*|0x2=ObjectGeography(obj2,OBJ_GEO_LINEENDX)
7F,z8L3a ?~m!gn y+|0y2=ObjectGeography(obj2,OBJ_GEO_LINEENDY)
_| i,DZ4j}0MSCBSC | 移动通信网5CnH?P)@d|3}5F$n
else
6}Femfm+i8`i8g3w0if objectinfo(obj2,OBJ_INFO_TYPE)=OBJ_TYPE_PLINE and objectinfo(obj2,OBJ_INFO_NPOLYGONS)=1 then
.yT TgI)p0iSec=objectinfo(obj2,OBJ_INFO_NPOLYGONS)
U Hrn I7V4e?0iNode=objectinfo(obj2,OBJ_INFO_NPOLYGONS+iSec)
ru;N1ER?%}1|@0MSCBSC | 移动通信网 o\;p _/]Z5N7V ^$t
&acute;相交线起点
]/g)B-_ Sm/C jc0x1=ObjectNodeX(obj2,1,1) MSCBSC | 移动通信网+b0V.f G*ZFU#bu
y1=ObjectNodeY(obj2,1,1) MSCBSC | 移动通信网RC(e2Q*Mq^

2Kq+v;H(W0&acute;相交线终点 MSCBSC | 移动通信网)\G6F8MpQ `;S ]
x2=ObjectNodeX(obj2,iSec,iNode)
6` XKcl*g d0y2=ObjectNodeY(obj2,iSec,iNode) MSCBSC | 移动通信网H,V NIb
elseMSCBSC | 移动通信网2C&dyLKcU_#^
goto NextStepMSCBSC | 移动通信网P,_Q } l-U4R5A
end if
d P4\U W9^{#Vi0end if
!J SE'n9l.~]!Ac0MSCBSC | 移动通信网@X(Dq"fk4a^.s0H
len1=distance(x,y,x1,y1,"m")MSCBSC | 移动通信网&|v^+R6k ]+d
len2=distance(x,y,x2,y2,"m")
h8s,i N9xg8z0if (len1<=50*len2 and len2<=50*len1 ) and (len1>min and len2>min) then &acute;防止线段被分割地太小MSCBSC | 移动通信网R+x2[ sg
select * from temp into temp1 where rowid=iRow2
_6|{z;G0set target on
r"g6S&l%u| w0objTemp=createCircle(x1,y1,len1)MSCBSC | 移动通信网8Q9m8q6_1n0oi
insert into circle(obj) values (objTemp) MSCBSC | 移动通信网!fUC n7uRh(xD
select * from circle into temp1
e'xh_'u-E0Objects split into target data ID=IDMSCBSC | 移动通信网.~M#~Lu'Rs
set target offMSCBSC | 移动通信网(h II ] @ S N6v0U
delete from circle
)B1O B4|C^0end if
*W%Fn9N!OM+i\2|0M0
Sk?`nR$l#J0end if
.Z:dJ)r4Yd5E0MSCBSC | 移动通信网 pv%}l\L
NextStep:
(tP{ gjt0fetch next from temp
4uES-zE%W?h"L!h%~0wendMSCBSC | 移动通信网V } G!}F;H9X
end if
"K9b9Mcx0MSCBSC | 移动通信网dYLJw}
fetch rec iRow1 from STableMSCBSC | 移动通信网;h;O$h4US D
fetch next from STable
U7\qu%}pY0MSCBSC | 移动通信网4BItE2^ a7q;r
wendMSCBSC | 移动通信网dZ4p&I*@]Xs4}
end subMSCBSC | 移动通信网 [0v!pUv#h ax]

Yl)o*f#ZZ*i$W1d1g0’=================
+c7o*W0jN$K01。以上程序中,国省道.Tab是包含Line、PLine的线对象表,Circle.tab是临时表,用来创建截断所需的Circle区域对象,两个表必须是打开的。程序运行的结果就是将国省道.tab表中的所有相交线对象按相交点分割。
S:D0q.\8O)bT z02。程序的思路按顺序访问表,每次取出一个对象obj1,查找与其相交的所有对象,顺序处理这些对象,比如obj2,找出Obj1和Obj2的交点Node;以Obj2的起点或终点为心,这个点与交点Node间的距离为半径作Circle,将Obj2设为目标,选择Circle,分割Obj2.
i;Gn;@Pa#b03。注意:在一次大循环中,Obj1并不分割,分割的只是与它相交的所有对象,Obj1本身要在以后的循环中由其它对象对其进行分割。
E%UH:_8p;rSN-Wq04。程序目前只能处理Line对象和只有一个Section的Pline对象,对于多个Section的PLine对象,望大侠们能给出方案。
vTY+Ae}05。请大家帮我复核一下这个现象:MapInfo中计算得到的两Line交点与真正截断发生的点之间存在误差,也就是根据Obj1将Obj2分隔成Obj3和obj4之后,Obj3或bj4与Obj1还是相交的,这一点放大之后看得很清楚。这是系统的误差还是计算的误差呢?MSCBSC | 移动通信网7tT5U{*w0?$l+`

TAG: 交点 integerDim sub floatDim objectDim

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar