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

6

我是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个回答

17

内环和外环结构不同。对于任何多边形,始终存在一个具有零个或多个内环的外环。

因此,查看几何图形的结构时,exterior是一个LinearRing对象,而interiors是一个包含零个或多个LinearRing对象的列表。任何LinearRing对象都将具有coords属性,您可以使用coords[:]来切片并查看坐标列表。

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

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)

好的...嗯,我已经通过了那个障碍...但是我无法从.coords列表中删除一个坐标(即项目)?我一直得到:>> TypeError:'CoordinateSequence'对象不支持项目删除>> for i in sorted(removeList,reverse = True): del ring.coords [i] - user14696

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接