当前位置: 首页 > 知识库问答 >
问题:

确定拆分形状几何图形的“左侧”和“右侧”

纪实
2023-03-14

我的问题是:如何确定已拆分的旋转矩形几何体的侧边侧边是拆分该几何体的任意线串的“左”和“右”边?

对于这个问题,"左"和"右"被定义为从节点到节点"行走"时,按顺序的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))

上面的想法在此处链接的笔记本中进行了说明(与上面的链接相同):

http://nbviewer.jupyter.org/urls/dl.dropbox.com/s/ll3mchnx0jwzjnf/determine左右分开。ipynb

总结:A面和B面是围绕geom几何体和拆分器线串的最小旋转矩形的两侧。当侧。执行交点(geom),结果是该侧包含的原始给定几何体的部分。

注意事项:

  • 对于形状奇怪的马铃薯类型的对象来说,这个交叉点可能会导致一侧或两侧有多个对象(参见nb观察者示例)
  • 我在这里创建了我自己的函数(而不是使用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

我如何才能成功地将甲和乙标为“左”和“右”?

共有2个答案

邴修远
2023-03-14

我不是工具箱中最清晰的地理信息系统工具,我正努力想办法在公认的答案中“在旁边添加一个点”到线性环中。这是我能找到的黑客。

我将相交分离器LineString的两点投射到第一个多边形的外部,这为我提供了一个沿着外部线串的距离。如果距离正在增加,那么第一个多边形是分裂的“右侧”。

下面是一个示例代码:

from shapely.ops import split
from shapely.geometry import Polygon, LineString, Point


def rhs_split(poly, splitter):
    intersect_splitter = splitter.intersection(poly)
    geomcollect = split(poly, splitter)
    polya, polyb = geomcollect.geoms[0], geomcollect.geoms[1]
    # Test directionality
    pt0 = Point(intersect_splitter.coords[0])
    pt1 = Point(intersect_splitter.coords[1])
    start_dist = polya.exterior.project(pt0)
    end_dist = polya.exterior.project(pt1)
    return polya if end_dist > start_dist else polyb


print(
    rhs_split(
        Polygon([(0, 0), (0, 1), (1, 1), (1, 0), (0, 0)]),
        LineString([(0.5, -0.1), (0.5, 1.1)]),
    )
)
# POLYGON ((0.5 1, 1 1, 1 0, 0.5 0, 0.5 1))
print(
    rhs_split(
        Polygon([(0, 0), (0, 1), (1, 1), (1, 0), (0, 0)]),
        LineString([(0.5, 1.1), (0.5, -0.1)]),
    )
)
# POLYGON ((0 0, 0 1, 0.5 1, 0.5 0, 0 0))
涂承运
2023-03-14

这可能会起作用:

  1. 用分离器的endpoint和Aside中的一个点形成一个Linearring
  2. 应用object.is_ccw
  3. 如果返回True,则Aside位于拆分器的左侧。

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

 类似资料:
  • 问题内容: 以任何方式在左侧和右侧(水平?)上获得盒子阴影,而没有骇客或图像。我在用: 但它给周围的阴影。 我周围没有边界。 问题答案: 注意: 我建议在下面查看@Hamish的答案;它不涉及此处所述解决方案中不完善的“掩盖”。 您可以使用多个框阴影来接近;每一侧一个 编辑 在顶部和底部的顶部再添加2个阴影,以掩盖流血的阴影。

  • 我需要从条形图中删除右侧图例。 这是我的密码。 谢谢

  • 问题内容: 我想在的标题上添加一个小图标。因此,我设置了一个空标题并添加了一个包含a 和as的图形。这样,图标显示在文本结尾附近。我希望它始终显示在的右侧边框旁边。我怎样才能做到这一点?我也尝试使用a 并将其添加到中间,在右侧添加,但是没有获得TitledPane的最大大小。所以我试图将MaxWidth设置为Max- Value,但这没有帮助 有人知道该怎么办吗? 编辑:我创建的“自定义”控件将在

  • 我有一个geopandas df和一列形状优美的点对象。我想从shapely point对象中提取坐标(lat/lon),以生成纬度和经度列。一定有一个简单的方法可以做到这一点,但我想不出来。 我知道你可以像这样提取单个坐标: 我可以为整个df创建一个函数,但我认为有一种更高效、更优雅的方法。

  • 虽然这一形状的名字叫立方体(CubeGeometry),但它其实是长方体,也就是长宽高可以设置为不同的值。其构造函数是: THREE.CubeGeometry(width, height, depth, widthSegments, heightSegments, depthSegments) 这里,width是x方向上的长度;height是y方向上的长度;depth是z方向上的长度;后三个参数

  • 在创建物体时,需要传入两个参数,一个是几何形状(Geometry),另一个是材质(Material)。本章将介绍几何形状的创建,第4章介绍材质,第5章介绍如何使用这两者创建网格。 几何形状(Geometry)最主要的功能是储存了一个物体的顶点信息。WebGL需要程序员指定每个顶点的位置,而在Three.js中,可以通过指定一些特征来创建几何形状,例如使用半径创建一个球体,从而省去程序员一个个指定顶