我的问题是:如何确定已分割的旋转矩形几何图形的哪一边Aside和哪一边是分割该几何图形的任意边的“左”和“右”边?BsideLineString
LineString出于此问题的目的,“左”和“右”被定义为按顺序从一个节点“行走”到另一个节点时分离器的左侧和右侧。
我创建了这个函数,用于将任意几何图形(非集合)分割为两侧shapely- “左”和“右”:
import shapely.geometry as geo
import shapely.ops as ops
def splitLR(geom, splitter):
"""Split a geometry into a 'left' and 'right' side using the shapely API"""
if not isinstance(splitter, geo.LineString):
raise TypeError("The splitter must be a LineString")
if not splitter.is_simple:
raise ValueError("Only simple splitter objects allowed")
if hasattr(geom, "__iter__"):
raise ValueError("Geometry collections not allowed")
geom_extents = geo.GeometryCollection([geom, splitter]).minimum_rotated_rectangle
sides = ops.split(geom_extents, splitter)
try:
Aside, Bside = sides
except TypeError:
# only 1 result - rotated rectangle wasn't split
if len(ops.split(geom,splitter)) == 1:
# geom isn't split by splitter
raise ValueError("the splitter does not appear to split the geometry")
else:
# splitter too small for algorithm
raise ValueError("the splitter must extend beyond minimum_rotated_rectangle "
"of the combined geometry")
# determine which is Lside and Rside here
Lside,Rside = get_LRsides(Aside, Bside, splitter)
return tuple(side.intersection(geom) for side in (Lside, Rside))
Run Code Online (Sandbox Code Playgroud)
上述想法在此处链接的笔记本中进行了说明(与上面的链接相同):
http://nbviewer.jupyter.org/urls/dl.dropbox.com/s/ll3mchnx0jwzjnf/define%20left-right%20split.ipynb
minimum_rotated_rectangle总结一下:A 边和 B 边是周围geom几何体和线串在一起的两条边splitter。执行时side.intersection(geom),结果是原始给定几何图形geom包含在该侧的部分。
笔记:
ops.split),因为该ops.split函数只返回一个分割对象的“包”,并且没有办法确定它们位于哪一边(据我所知)目前我的调用get_LRsides只是执行这个函数,这显然毫无价值:
def get_LRsides(Aside, Bside, splitter):
"""Determine the 'left' and 'right' sides of an already split geometry"""
return Aside,Bside
Run Code Online (Sandbox Code Playgroud)
如何成功地将A和B标记为“左”和“右”?
这可以工作:
LinearRing用分离器的端点和 Aside 中的一个点形成 aobject.is_ccwTrue,则 Aside 位于分离器的左侧。https://shapely.readthedocs.io/en/stable/manual.html#object.is_ccw
| 归档时间: |
|
| 查看次数: |
2902 次 |
| 最近记录: |