python - 如何使用Shapely提取内部多边形坐标?

标签 python graph gis shapely fiona

我是 Shapely 的新手(但对它充满热情),最近我发现了一些障碍。

我有一个多边形 shapefile,我正在通过 Fiona 读取它。这个 shapefile 包含多边形和多多边形项目,我需要为其中所有坐标的每个特征(即外部和/或内部)构建一个数组。值得注意的是,其中两个多边形项具有内环(并且它们是有效的)。

我似乎没有问题访问多边形/多多边形的外部坐标......但我没有为内部坐标拉任何东西。

我是否需要在这里采用新方法(即 LinearRings)...?

def convert_polygons(inFile):

    for polys in fiona.open(inFile):
        myShape = shape(polys['geometry'])
        exterior_poly = 0
        interior_poly = 0
        if isinstance(myShape, Polygon):
            print "yes, I am a polygon"
            # count how many points for each interior polygon
            try:
                interior_poly += len(myShape.interior.coords)
            except:
                pass
            # count how many points for each exterior polygon
            exterior_poly += len(myShape.exterior.coords)
            geomArray = asarray(myShape.exterior)
            print geomArray
            print "number of interior points in polygon " + str(interior_poly)
            print "number of exterior points in polygon " + str(exterior_poly)
        elif isinstance(myShape, MultiPolygon):
            print "yes, I am a MultiPolygon"
            # count how many points for each interior polygon
            try:
                interior_poly += len(myShape.interior.coords)
            except:
                pass
            try:
                # count how many points for each exterior polygon
                exterior_poly += len(myShape.exterior.coords)
            except:
                pass
            try:
                geomArray = asarray(myShape.interior)
            except:
                pass
            try:
                geomArray = asarray(myShape.exterior)
            except:
                pass
            print geomArray
            print "number of interior points in polygon " + str(interior_poly)
            print "number of exterior points in polygon " + str(exterior_poly)

最佳答案

内环和外环的结构不同。对于任何多边形,总是有 1 个外环和零个或多个内环。

因此,查看几何结构的结构,exterior 是一个 LinearRing 对象,而 interiors 是零个或多个 LinearRing 对象的列表。任何 LinearRing 对象都有 coords ,您可以将其切片以查看 coords[:] 的坐标列表。

以下是一个返回外部和内部坐标列表的 dict 的函数:

def extract_poly_coords(geom):
    if geom.type == 'Polygon':
        exterior_coords = geom.exterior.coords[:]
        interior_coords = []
        for interior in geom.interiors:
            interior_coords += interior.coords[:]
    elif geom.type == 'MultiPolygon':
        exterior_coords = []
        interior_coords = []
        for part in geom:
            epc = extract_poly_coords(part)  # Recursive call
            exterior_coords += epc['exterior_coords']
            interior_coords += epc['interior_coords']
    else:
        raise ValueError('Unhandled geometry type: ' + repr(geom.type))
    return {'exterior_coords': exterior_coords,
            'interior_coords': interior_coords}

例如。:
extract_poly_coords(myShape)

关于python - 如何使用Shapely提取内部多边形坐标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21824157/

相关文章:

python - 如何手动安装python库

python - 使用 imageio.imsave 保存 NumPy 数组会扭曲图像

python - DateTime索引不唯一且对应值相同时重采样

c++ - Boost Dijkstra 代码不起作用?

algorithm - 中介中心性的时间复杂度?

python - 为什么我使用 Windows 身份验证通过 AzureML dataprep 登录 MS SQL 失败?

javascript - 绘制对数图 (Javascript)

r - 绘制 UTM/坐标

java - 为什么 uDig 的渲染 map 看起来比我的好很多

r - 在 R 中使用 Lat 和 Long 的流程图(旅行路径)