确定分割形状几何体的“左”侧和“右”侧

Ric*_*ica 4 python shapely

我的问题是:如何确定已分割的旋转矩形几何图形的哪一边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包含在该侧的部分。

笔记:

  • 对于形状奇怪的“土豆”类型对象,此交集可能会导致一侧或两侧出现多个对象(请参阅 nbviewer 示例)
  • 我在这里创建了自己的函数(而不是使用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标记为“左”和“右”?

yan*_*ng5 5

这可以工作:

  1. LinearRing用分离器的端点和 Aside 中的一个点形成 a
  2. 申请object.is_ccw
  3. 如果返回True,则 Aside 位于分离器的左侧。

https://shapely.readthedocs.io/en/stable/manual.html#object.is_ccw