我的问题是:我怎样才能确定哪一个Aside
and Bside
的侧面已经分割的旋转矩形几何体 http://nbviewer.jupyter.org/urls/dl.dropbox.com/s/ll3mchnx0jwzjnf/determine%20left-right%20split.ipynb是任意一个的“左”和“右”边LineString
分裂那个几何体?
出于此问题的目的,“左”和“右”被定义为一个对象的左侧和右侧。LineString
splitter 按顺序从一个节点“行走”到另一个节点。
我创建了这个用于分割的函数any随意的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))
上述想法在此处链接的笔记本中进行了说明(与上面的链接相同):
http://nbviewer.jupyter.org/urls/dl.dropbox.com/s/ll3mchnx0jwzjnf/define%20left-right%20split.ipynb http://nbviewer.jupyter.org/urls/dl.dropbox.com/s/ll3mchnx0jwzjnf/determine%20left-right%20split.ipynb
总结一下:A面和B面是minimum_rotated_rectangle http://shapely.readthedocs.io/en/stable/manual.html#constructive-methods周围的geom
几何学和splitter
线串在一起。什么时候side.intersection(geom)
执行后,结果是原始给定几何图形的部分geom
包含在那边。
Notes:
- 对于形状奇怪的“土豆”类型对象,此交集可能会导致一侧或两侧出现多个对象(请参阅 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
如何成功地将A和B标记为“左”和“右”?