點和線的扇形緩衝區生成

2022-09-08 01:12:12 字數 3365 閱讀 4728

# coding:utf-8

# 扇形緩衝區

from shapely.ops import substring

from shapely.geometry import linestring, polygon

from math import pi

import numpy as np

import logging

logging.basicconfig(level=logging.warning,

format='%(asctime)s-%(filename)s[line:%(lineno)d]-%(levelname)s:%(message)s',

datefmt='%h:%m:%s')

def pnt2polar(p):

# 平面點轉極座標

x, y = p

length = np.sqrt(x * x + y * y)

x = round(x, 6)

y = round(y, 6)

alpha = np.arctan(abs(y / x)) if x != 0. else 0.

if x > 0:

if y > 0:

angle = alpha

elif y == 0:

angle = 0

else:

angle = pi * 2 - alpha

elif x == 0:

if y > 0:

angle = pi / 2

elif y == 0:

angle = 0

else:

angle = 3 * pi / 2

else:

if y > 0:

angle = pi - alpha

elif y == 0:

angle = pi

else:

angle = pi + alpha

return round(length, 3), round(angle, 3)

def polar2pnt(p):

# 極座標轉平面座標

length, angle = p

eps = 1e-8

if length == 0:

x, y = 0

else:

if angle < eps:

x = length

y = 0

elif angle - 3 * pi / 2 > eps:

x = length * np.cos(2 * pi - angle)

y = -length * np.sin(2 * pi - angle)

elif angle - 3 * pi / 2 == eps:

x = 0

y = length

elif angle - pi > eps:

x = -length * np.cos(angle - pi)

y = -length * np.sin(angle - pi)

elif angle - pi == eps:

x = -length

y = 0

elif angle - pi / 2 > eps:

x = -length * np.cos(pi - angle)

y = length * np.sin(pi - angle)

elif angle - pi / 2 == eps:

x = 0

y = -length

else:

x = length * np.cos(angle)

y = length * np.sin(angle)

return round(x, 3), round(y, 3)

def arcpointbuffer(p, r, fangle, tangle):

# p 是目標點

# r 是緩衝半徑

# fangle, tangle 是扇形角度

# 0 -> 2*pi x軸正方向,逆時針

if tangle > fangle:

angles = np.linspace(fangle, tangle, num=64)

else:

angles = np.linspace(fangle, 2*pi, num=32)

angles_ = np.linspace(0, tangle, num=32)

angles = np.r_[angles, angles_]

polars = np.c_[[r] * 64, angles]

vector = [polar2pnt(_) for _ in polars]

x, y = np.array(p).tolist()

vector = [[x+i, y+j] for i, j in vector]

ply = [[x, y]] + vector + [[x, y]]

return polygon(ply)

def arclinebuffer(geom, r, arc):

# geom

# r 緩衝半徑

# arc 扇形圓心角

length = geom.length

if length < r:

fl = geom

else:

fl = substring(geom, length-r, length)

ps, pe = fl.coords[0], fl.coords[-1]

vec = pe[0]-ps[0], pe[1]-ps[1]

logging.warning(f"vec:")

lgth, angle = pnt2polar(vec)

fangle = angle - arc/2

tangle = angle + arc/2

if fangle < 0:

fangle = 2*pi - (arc/2 - angle)

if tangle > 2*pi:

tangle = tangle - pi*2

logging.warning(f"angle:")

logging.warning(f"ftangle:,")

res = arcpointbuffer(pe, lgth, fangle, tangle)

return res

if __name__ == '__main__':

ls = linestring([[0, 0], [10, 0]])

arc = pi/4

res = arclinebuffer(ls, 2, arc)

res = arcpointbuffer((10, 0), 1, 0, arc)

AO 生成緩衝區

緩衝區 引數說明 pfeature 生成緩衝區的物件 radius 緩衝區半徑 ppolygonlayer 儲存緩衝區的面圖層 private subgetbuffer pfeature asifeature,radius asinteger ppolygonlayer asifeaturelaye...

使用者程序緩衝區和核心緩衝區

常常聽到有程式設計師會跟你討論 我們在讀寫檔案的時候,系統是有快取的 但實際上有一部分人把使用者程序緩衝區和系統空間的緩衝區的概念混淆了,包括這兩種緩衝區的用法和所要解決的問題,還有其它類似的概念。本文就來區分一下不同的緩衝區概念 主要針對類unix平台 使用者程序和作業系統的關係 首先我用一張圖來...

Arcgis 由點生成方形緩衝區

在arcgis軟體中,點檔案的緩衝區只能生成圓形特徵區,而不能生成我們需要的方形區域,但是我們在建立樣區的時候,以方形區域為主,那麼如何利用arcgis軟體建立方形的多邊形呢?該過程大致可分為兩步 圓形緩衝區構建 圓形緩衝區的外接多邊形構建。1.點緩衝區 在arctoolbox中anallysis ...