GIS中的缓冲区计算

放肆的年华 提交于 2020-02-12 15:19:40

(1)点的缓冲

1.单点定距缓冲:以点为圆心,往往得到一个圆形。

2.单点多距缓冲:形成一个多距缓冲。

(2)线的缓冲

1.单线定距缓冲

2.单线多距缓冲

3.同距缓冲

4.按属性值缓冲

(3)面的缓冲

存在内缓冲和外缓冲之分:

  内缓冲:在指定面状要素内部建立缓冲区,可以是单个面状要素,也可以是多个面状要素同时建立;

  外缓冲:在指定面状要素外部建立缓冲区,可以是单个面状要素,也可以是多个面状要素同时建立。

(4)程序实现

 

  1 import math
  2 import turtle as f
  3 
  4 
  5 def Buffer_xy(dic_point):
  6     DR = 150
  7     DL = 200
  8     for item, value in dic_point.items():
  9         # # 计算方位角
 10         yb_ya = dic_point['B'][1]-dic_point['A'][1]
 11         xb_xa = dic_point['B'][0]-dic_point['A'][0]
 12         yc_yb = dic_point['C'][1]-dic_point['B'][1]
 13         xc_xb = dic_point['C'][0]-dic_point['B'][0]
 14 
 15         fw_AB = math.degrees(math.atan(yb_ya / xb_xa))
 16         if yb_ya > 0 and xb_xa < 0:fw_AB = 180 - fw_AB
 17         if yb_ya < 0 and xb_xa < 0:fw_AB = 180 + fw_AB
 18         if yb_ya < 0 and xb_xa > 0:fw_AB = 360 - fw_AB
 19 
 20         fw_BC = math.degrees(math.atan(yc_yb / xc_xb))
 21         if yc_yb > 0 and xc_xb < 0:fw_BC = 180 - fw_BC
 22         if yc_yb < 0 and xc_xb < 0:fw_BC = 180 + fw_BC
 23         if yc_yb < 0 and xc_xb > 0:fw_BC = 360 - fw_BC
 24 
 25         # # 计算BA方位角
 26         if fw_AB < 180: fw_BA = fw_AB + 180
 27         if fw_AB >= 180: fw_BA = fw_AB - 180
 28         # # 计算角西塔B
 29         if fw_BC > fw_BA:
 30             XTB = fw_BA - fw_BC + 2*180
 31         if fw_BC <= fw_BA:
 32             XTB = fw_BA - fw_BC
 33         # # 计算角贝塔B
 34         if fw_BA < fw_BC:
 35             BTB = fw_BC + (1/2)*XTB - 2*180
 36         if fw_BA >= fw_BC:
 37             BTB = fw_BC + (1/2)*XTB
 38         # # 计算左右缓冲点坐标
 39         X_BL = dic_point['B'][0] - DL*math.cos(BTB)
 40         Y_BL = dic_point['B'][1] - DL*math.sin(BTB)
 41         X_BR = dic_point['B'][0] + DR*math.cos(BTB)
 42         Y_BR = dic_point['B'][1] + DR*math.sin(BTB)
 43         BL = (round(X_BL, 3),round(Y_BL, 3))
 44         BR = (round(X_BR, 3),round(Y_BR, 3))
 45         return [BL,BR]
 46 
 47 def Paint(dic_point,BLR):
 48     f.setup(width = 0.7, height = 0.6)
 49     f.pensize(3)
 50     f.hideturtle()
 51     f.speed(1)
 52     # # 标注A、B、C三点的图标及字母
 53     for item,value in dic_point.items():
 54         f.pencolor("red")
 55         f.penup()
 56         f.goto(value[0],value[1])
 57         f.pendown()
 58         f.write('*',font=('黑体',25))
 59         f.penup()
 60         f.pencolor('blue')
 61         f.goto(value[0]+20,value[1]+20)
 62         f.write(item,font=('黑体',30))
 63     # # 连接A、B、C三点
 64     f.penup()
 65     f.pencolor("black")
 66     f.goto(dic_point['A'][0]+10,dic_point['A'][1]+20)
 67     f.pendown()
 68     f.goto(dic_point['B'][0]+10,dic_point['B'][1]+20)
 69     f.goto(dic_point['C'][0]+10,dic_point['C'][1]+20)
 70     # # 标注A、B、C三点的坐标
 71     f.penup()
 72     f.goto(dic_point['A'][0]-50,dic_point['A'][1]-10)
 73     f.pendown()
 74     f.write(str(dic_point['A']),font=('黑体',12))
 75     f.penup()
 76     f.goto(dic_point['B'][0]-25,dic_point['B'][1]-15)
 77     f.pendown()
 78     f.write(str(dic_point['B']),font=('黑体',12))
 79     f.penup()
 80     f.goto(dic_point['C'][0]-50,dic_point['C'][1]-15)
 81     f.pendown()
 82     f.write(str(dic_point['C']),font=('黑体',12))
 83     # # 标注缓冲点Br、Bl图标及字母
 84     f.penup()
 85     f.goto(BLR[0][0]-10, BLR[0][1]+10)
 86     f.pendown()
 87     f.write('*',font=('黑体',15))
 88     f.penup()
 89     f.goto(BLR[0][0], BLR[0][1]+20)
 90     f.pendown()
 91     f.write('Bl',font=('黑体',15))
 92 
 93     f.penup()
 94     f.goto(BLR[1])
 95     f.pendown()
 96     f.write('*',font=('黑体',15))
 97     f.penup()
 98     f.goto(BLR[1][0], BLR[1][1]+20)
 99     f.pendown()
100     f.write('Br',font=('黑体',15))
101     # # 缓冲点Br、Bl连线
102     f.pencolor('yellow')
103     f.pensize(2)
104     f.penup()
105     f.goto(BLR[0][0]-5,BLR[0][1]+22)
106     f.pendown()
107     f.goto(BLR[1][0]+5,BLR[1][1]+12)
108     f.penup()
109     f.pencolor('black')
110     f.goto(BLR[0][0]+20,BLR[0][1])
111     f.write(str(BLR[0]),font=('黑体',12))
112     f.penup()
113     f.goto(BLR[1][0]+20,BLR[1][1]-15)
114     f.write(str(BLR[1]),font=('黑体',12))
115     # # 标注DL、DR
116     f.penup()
117     f.pencolor('green')
118     f.goto(BLR[1][0]+60, BLR[1][1]+35)
119     f.pendown()
120     f.write('Dr',font=('黑体',20))
121     f.penup()
122     f.goto(BLR[0][0]-60, BLR[0][1]-10)
123     f.pendown()
124     f.write('Dl',font=('黑体',20))
125     # # 注释
126     f.penup()
127     f.pencolor('black')
128     f.goto(BLR[1][0], BLR[1][1]-90)
129     f.write('[注]Dr = 150\n    Dl = 200',font=('黑体',13))
130     f.done()
131 
132 
133 if __name__ == "__main__":
134     dic_point = {
135         'A':(320, -80),
136         'B':(0, -50),
137         'C':(-300, 130),
138     }
139     BLR = Buffer_xy(dic_point)
140     Paint(dic_point,BLR)
View Code

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!