include "mapbasic.def"
o
Mr}8|{0Declare sub Main
y:\K0Gp7?"K(t2n0MSCBSC | 移动通信网b&kB)H_Sv;^"b
Psub main
MSCBSC | 移动通信网1pr;`B%r&m^)@wnpDim obj1,obj2,obj3 as object
#Sg8R.}Q2m"Q0Dim iRow1,iRow2 as integer
hl_C!h6}`4{0Dim iNext as integer
*w5gb9e&V x0Dim x1,y1,x2,y2,x,y as float
MSCBSC | 移动通信网!L D ~5I-g-RDim objTemp as object
MSCBSC | 移动通信网aaJ7D#j2OnDim iNode,iSec as integer
3zp8]zh"K0Dim i as integer
a?T.TU0Dim len1,len2 as float
MSCBSC | 移动通信网7ywv
m;w-P,nDim min as float
MSCBSC | 移动通信网gyqZ^MSCBSC | 移动通信网+Qrgifxmin=30 ´最小线段长度,因为我发觉MapInfo中计算得到的两Line
交点与真正截断的点之间存在误差
mQI5Y1tk;w
oO0set distance units "m"
h y j Xb.V']yMc0select * from 国省道 into STable
-z d!B;c
Tq3S7c0yMcCF w5f`8m0fetch first from STable ´first
t*r3jD2A0MSCBSC | 移动通信网4{&Nh"W_!~{6nwhile not eot(STable)
Kj5@i
s"G;Z#t0obj1=STable.obj
MSCBSC | 移动通信网,KF
S6Tb9} B(\JiRow1=STable.rowid
MSCBSC | 移动通信网X{&wj&Ib7h#t9yt;C-e|jLz6o@0select * from 国省道 into temp where obj intersects obj1 and rowid<>iRow1
-\ g6z E
r)TY0rX~7_4t8a
jR/?b0if TableInfo(temp,TAB_INFO_NROWS)>0 then
X:f9jc8e;rOT0fetch first from temp
*a9FK8H[6n$S4o6\2P
N0while not eot(temp)
MSCBSC | 移动通信网x$M]~h0B!^%Qobj2=temp.obj
MSCBSC | 移动通信网x6p/P}
E FDEiRow2=temp.rowid
MSCBSC | 移动通信网!z-tLy1oobj3=IntersectNodes (obj1, obj2, INCL_CROSSINGS)
MSCBSC | 移动通信网`0cZLPDiNode=objectinfo(obj3,OBJ_INFO_NPNTS)
MSCBSC | 移动通信网o/r0x|+W#Y;i3bif iNode>0 and objectinfo(obj3,OBJ_INFO_TYPE)=OBJ_TYPE_PLINE then
MSCBSC | 移动通信网[5D H2EL"O-P´相
交点9W%X:wvx0x=ObjectNodeX(obj3,1,1)
ln'XTh,i2h0y=ObjectNodeY(obj3,1,1)
Z^1[\aToTs0MSCBSC | 移动通信网r&i6\l1i6_v`Yif objectinfo(obj2,OBJ_INFO_TYPE)=OBJ_TYPE_LINE then
MSCBSC | 移动通信网p6kEG)Cd["[|*e`&|$I$o´相交线起点
8Ahp0mc0B^0x1=ObjectGeography(obj2,OBJ_GEO_LINEBEGX)
MSCBSC | 移动通信网 | i5m1?3m%w5ey1=ObjectGeography(obj2,OBJ_GEO_LINEBEGY)
MSCBSC | 移动通信网
c!d/}|:~EC4tUs"f&p6y q!X6R0W3E,`0´相交线终点
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$nelse
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´相交线起点
]/g)B-_ Sm/C jc0x1=ObjectNodeX(obj2,1,1)
MSCBSC | 移动通信网+b0V.fG*ZFU#buy1=ObjectNodeY(obj2,1,1)
MSCBSC | 移动通信网RC(e2Q*Mq^2Kq+v;H(W0´相交线终点
MSCBSC | 移动通信网)\G6F8MpQ `;S
]x2=ObjectNodeX(obj2,iSec,iNode)
6`XKcl*gd0y2=ObjectNodeY(obj2,iSec,iNode)
MSCBSC | 移动通信网H,V
N Ibelse
MSCBSC | 移动通信网2C&dyLKcU_#^goto NextStep
MSCBSC | 移动通信网P,_Q } l-U4R5Aend if
d P4\U W9^{#Vi0end if
!J
SE'n9l.~]!Ac0MSCBSC | 移动通信网@X(Dq"fk4a^.s0Hlen1=distance(x,y,x1,y1,"m")
MSCBSC | 移动通信网&|v^+R6k
]+dlen2=distance(x,y,x2,y2,"m")
h8s,iN9xg8z0if (len1<=50*len2 and len2<=50*len1 ) and (len1>min and len2>min) then ´防止线段被分割地太小
MSCBSC | 移动通信网R+x2[sgselect * from temp into temp1 where rowid=iRow2
_6|{z;G0set target on
r"g6S&l%u|w0objTemp=createCircle(x1,y1,len1)
MSCBSC | 移动通信网8Q9m8q6_1n0oiinsert into circle(obj) values (objTemp)
MSCBSC | 移动通信网!f UC
n7uRh(xDselect * from circle into temp1
e'xh _'u-E0Objects split into target data ID=ID
MSCBSC | 移动通信网.~M#~Lu'Rsset target off
MSCBSC | 移动通信网(h
II
] @
S
N6v0Udelete from circle
)B1OB4|C^0end if
*W%Fn9N!OM+i\2|0M0Sk?`nR$l#J0end if
.Z:dJ)r4Yd5E0MSCBSC | 移动通信网 pv%}l\ LNextStep:
(tP{gjt0fetch next from temp
4uES-zE%W?h"L!h%~0wend
MSCBSC | 移动通信网V} G!}F;H9Xend if
"K9b9Mcx0MSCBSC | 移动通信网dYLJw}fetch rec iRow1 from STable
MSCBSC | 移动通信网;h;O$h4US Dfetch next from STable
U7\qu%}pY0MSCBSC | 移动通信网4BItE2^
a7q;rwend
MSCBSC | 移动通信网dZ4p&I*@]Xs4}end sub
MSCBSC | 移动通信网
[0v!pUv#hax]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对象,望大侠们能给出方案。
v TY+Ae}05。请大家帮我复核一下这个现象:MapInfo中计算得到的两Line
交点与真正截断发生的点之间存在误差,也就是根据Obj1将Obj2分隔成Obj3和obj4之后,Obj3或bj4与Obj1还是相交的,这一点放大之后看得很清楚。这是系统的误差还是计算的误差呢?
MSCBSC | 移动通信网7tT5U{*w0?$l+`