8.2. 空间度量算法

空间度量是GIS的一项基本内容和主要功能,也是GIS的常用工具。这一节主要是对物体之间的距离、角度、面积、中心等计算方法进行介绍。

8.2.1. 长度量算

1.两点之间的距离

二维矢量空间中的两点(x1,y1)和(x2,y2)之间的欧几里德距离,以及三维矢量空间中的两点(x1,y1,z1)和(x2,y2,z2)之间的欧几里德距离分别用公式(8-1)和公式(8-2)定义。

    D2=image0 (公式8-1)

    image1                        (公式8-2)

2.点到直线的距离

已知直线L和任意一个点P,设d(P,L)表示点P到L的距离。这是点P到直线L的最短距离。如果L是一个有限的线段,那么P在L上的基点(过P点作L的垂线,垂线和L的交点成为P在L上的基点)可能在线段之外,这就需要一个不同的计算最短距离的方法。首先要考虑点到一条直线的垂直距离。

(1)两点定义的直线

在二维和三维中,当L是通过两个点P0、P1给出的,我们可以使用矢量积直接计算出点P到L的距离。两个矢量的矢量积的模等于两矢量构成的平行四边形的面积,因为image2 ,其中image3 是两个矢量image4image5 的夹角。但是,平行四边形的面积也等于底和高的乘积。令image6 L=P0P1=(P1 - P0)、,image7 =P0P=(P - P0),如图8-1所示,这样点P到直线L的距离就是底P0P1的高。

    那么,image8 Area(平行四边形(image9 ))= image10 ,这得出了

图8-1 点到显式二维方程定义的直线的距离

      image11                              (公式8-3)

式(8-3)中,image12 为直线L的单位矢量。若要计算多个点到同一条直线的距离,则首先计算image13 是最高效的。

这里没有计算分子的绝对值,这就使公式计算出的结果是带有符号的距离,正的表示户点在直线的一边,负的表示在直线另一边。这个有时候是有用的。其他情况下,我们可能希望获得绝对值。同时可以看出,分子的形式与直线隐式方程的形式相似。

(2)二维隐式方程定义的直线

在二维中,有许多情况下,直线L是很容易通过一个隐式方程来定义f(x,y) = ax + by + c = 0。对于任意二维点P = (x,y)、距离d (P,L)可以直接用这个方程计算出。

矢量nL= (a,b)是直线L的法线矢量,利用nL我们可以计算任意点P到L的距离。首先在L上任意选一点P0,然后将矢量P0P投影到nL,如图8-2所示。

图8-2 点到二维隐式方程定义的直线的距离

具体如下:

① 因为a和b不同时为零,设a < 0或a > 0,则P0= (-c/a, 0)位于直线L上;相反,如果a = 0,则b < 0或b > 0,则P0= (0, -c/b),最后的结果是相同的。

② 对在L上的任意点P0有:nL·P0P = |nL| |P0P| cosθ= |nL| d (P, L)。

③ 对选定的点P0:nL·P0P = ( a , b)·(x+c/a , y) = ax + by + c = f(x , y) = f(P)等同于②。

最后得出公式(8-4)。

    image14                               (公式8-4)

进一步,可以用|nL|除f (x,y)的每个系数,使隐式方程规范化,即|nL| = 1。

这样则得出非常高效的公式(8-5)

      d (P , L) = f (p) = ax + by + c,当a2+ b2= 1                    (公式8-5)

对每个距离计算,这个公式只用了2次乘法运算和2次加法运算。因此,在二维中,若需要计算多个点到同一条直线L的距离,那么先得到规格化的隐式方程,然后使用这个公式。同时注意到,只是比较距离(也就是说,寻找离直线最近或最远的点),这时则不需要规范化。因为它只是通过乘以一个常数因子来改变距离的值。

当θ为L与x轴的夹角并且P0= (x0,y0) 是L上的点,那么规范化后的隐式方程有:a = -sinθ,b = cosθ,和c = x0sinθ– y0cosθ。

(3)参数方程定义的直线

在n维空间中,已知直线L的参数方程为P(t) = P0十t (P1-P0),P为任意n维空间中的任意一点。为了计算点P到直线L的距离d (P,L),从点P作直线L的垂线,交于点P(b)。则向量P0P(b)是矢量P0P在线段P0P1上的投影,如图8-3所示。

图8-3 点到参数方程定义的直线的距离

设vL= (P1-P0) 和w = (P-P0),则得到公式(8-6)。

    image15                (公式8-6)

因而

    image16             (公式8-7)

式(8-7)中,uL为直线L的单位方向矢量。

这个公式很适于在n维空间中使用,同时在计算基点P(b)也很有用。在三维空间中,和矢量积公式同样高效。但在二维中,当P(b)不是必须时,隐式公式的方法更好,尤其是计算多个点到同一条直线的距离。

(4)点到射线或线段的距离

 射线以某个点P0为起点,沿某个方向无限延伸。它可以用参数方程P(t)表达,其中t≥0、P(0)=P0是射线的起点。一个有限的线段由一条直线上两端点P0、P1间的所有点组成。同样也可以用参数方程P(t)表达,其中P(0)=P0、P(1)=P1为两个端点,并且点P(t) (0≤t≤1)是线段上的点。

计算点到射线或线段的距离与点到直线的距离的不同点是,点P到直线L的垂线与L的交点可能位于射线或线段之外。在这种情况下,实际的最短距离是点P到射线的起点的距离(图8-4)或是线段的某个端点的距离(图8-5)。

image17image18

图8-4 点到射线R的距离                      图8-5点到线段S的距离

对于图8-4,只有一个选择,就是计算P到射线端点的距离;而对于一条线段,则必须判断哪一个端点离P更近。可以分别计算点到两个端点的距离,然后取最短的,但这不是最高效的办法。而且,同时要判断点P在直线L上的基点,是否在线段外。有一个简便的方法:考虑P0P1、P0P的夹角,P1P、P0P1的夹角,如果其中有个角为90 ,则对应的线段的端点就是P在L上的基点P(b)。如果不是直角,P的基点必然落在端点的一边或另一边,要看角是锐角还是钝角,如图8-6和图8-7所示。这些考虑可以通过计算矢量的数量积是正的、负的还是零来判断。最终得出应该计算点P到P0还是到P1的距离,或者是

image19image20

图8-6 计算P0P1与P0P的夹角 图8-7 锐角时的情况

P到直线L的垂直距离。这些技术可以用到n维空间中。

     (5)三维空间中点到直线的距离

  点M0(x0, y0, z0)到直线L: image21 的距离为公式(8-8)。

(公式8-8)

                image22

其中取直线L上两相异点的坐标(x1, y1, z1)和(x2, y2, z2)则l = x2- x1, m = y2- y1, n = z2- z1

3.三维空间中线到线的空间距离

     算法的理论基础:用空间解析几何法求两异面直线间的距离。

如图8-8,空间直线k1通过点P1(x1, y2, z1),和点P2(x2, y2, z2),直线k2通过点P3(x3, y3, z3),和点P4(x4, y4,z4 )。

则k1的方程为: (x - x1) / (x2- x1) = (y - y-1) / (y2- y1) = (z - z1) / (z2– z1)

K2的方程为: (x - x3) / (x4- x3) = (y - y3) / (y4- y3) = (z - z3) / (z4- z3)

设S = S1image23 S2

其中S1= {l1, m1, n1 } = { x2- x1, y2- y1, z2- z1},

    S2= {l2, m2, n2 } = { x4- x3, y4- y3, z4- z3},

    S={l, m, n},

      则 l = m1* n2- m2* n1,  m = n1* 12 - n2* l1,  n = l1* m2- l2* m1

如图8-8所示,两异面直线k1:P = P1+ t * S1,k2:P = P3+ t * S2,过k1和k2分别作平面M1和M2,使它们都与S平行,则M1和M2的交线必平行于S。但这条交线分别与k1及k2共面,所以它与k1及k2垂直,且分别交于D1及D2,于是直线D1D2就是k1及k2的公垂线,且|D1D2|就规定为两异面直线k1及k2间的距离。设公垂线方程为P = Q + t * S,利用两直线共面的充要条件,即k1:P = P1+ t * S1,K2:P = P3+ t * S2共面的充要条件是: (P1- P3, S1, S2)=0,得出如

../_images/image055.jpg

图8-8 两异面直线K1,K2

下结论,见公式(8-9)。

(公式8-9)

  image24

也就是公垂线上任一点的位置向量要同时符合公式(8-10)。

(公式8-10)

  image25

即矩阵形式见公式(8-11)。

(公式8-11)

image26

    又如图10-27, |DlD2|=P1P3 在S上的投影的数值=|P1P3|*S/|S|,于是得:

|D1D2|=|(P3- P1)|*S/|S|=|l * (x3- x1) + m * (y3- y1) + n * (z3- z1)|/image27

很显然,算法的核心就是利用这一方法当中的中间结果和最终公式推倒所得。

4.线目标的长度计算

线目标的长度公式(8-12):

       image28               (公式8-12)

线目标的长度的精度主要通过合理地选择曲线坐标点串及适当地加密坐标点改善精度。

8.2.2. 角度量算

1.求直线a0x + b0y + c = 0与直线a1x + b1y + c = 0的夹角公式(8-13)。

    image29             (公式8-13)

    当image30 = 0,则两直线平行。

    当image31 = 0,则两直线垂直。

2.求矢量A(xa,ya,za)(二维情形时A(xa,ya),这里指的是三维情形)与矢量B(xb,yb,zb)的夹角。

那么,矢量A、B的点积表示为:a·b = xaxb+ yayb+ zazb,则两个矢量的夹角为公式(8-14)。

image32                                            (公式8-14)

8.2.3. 任意多边形面积量算

    矢量数据多边形的面积计算基于求梯形面积公式,如图8-9所示。

从图8-9可知,当上述图顺时针走向时,求出的面积为正值;逆时针走向时,求出的面积为负值。实际面积为上述面积值的绝对值。

../_images/image075.jpg

图8-9 矢量多边形面积计算

由于多边形面积计算的上述特征,在CIS分析中,常根据所求面积的正、负值,可判断多边形弧段闭合的走向是顺时针还是逆时针;也可用来判断一点和线段的空间关系,如某点在线的左侧还是右侧,如图8-10(a)中因△ABP面积为正,故P点在矢量AB的右侧;还可判断两点和线段的空间关系,如两点是否位于线段的同侧,如图8-10(b)中因△ABN面积为正,△ABM面积为负,故点M和N分别在矢量AB的两侧;如图8-10(c)中因△ABN和△ABM面积均为正,故点M和N在矢量AB的同侧等。

../_images/image077.jpg

图8-10 多边形面积计算的应用

8.2.4. 分布中心的计算

空间分析中常用分布中心来概括地表示空间的总体分布位置,用来跟踪某些地理分布的变化,如描述人口的变迁、土地利用的变化。假设有n个离散点(x1,Y1),(x2,Y2),…,(xn,Yn),可以用不同方法来表示分布中心。

1.算术平均中心

image33 ,  image34       (公式8-15)

公式(8-15)中(Cx,Cy)表示算术平均中心坐标点。

算术平均中心中没有考虑不同点在分析问题时重要性之间的差异,实际中各点的重要性是不同的,为此需进行加权计算。

2.加权平均中心

image35         image36         (公式8-16)

公式(8-16)中Wi为第i点的权重。这里关键是确定权重值,通常以该离散点表示的统计量来表示,如在研究土地利用时用它表示的面积值作权重,在研究变迁时用它表示的人口数作权重。

3.中位中心

中位中心是指到各个离散点距离和为最小的一个点(xm,Ym,),表示为公式(8-17)

image37    image38                     (公式8-17)

的值为最小。

中位中心是一个很有用的概念,大量用在选址设计中。如当n个离散点表示居民点,为确定商业布点就要用到中位中心。

4.极值中心

极值中心是指到各个离散点中最大距离为最小的一个点(Xe,Ye),表示为公式(8-18)

image39                        (公式8-18)

的值为最小。极值中心地理意义在于该点离n个离散点中所有点都不太远。

必须指出,在计算中位中心和极值中心时同样都可考虑权重问题。