5

私は Shapely に慣れていません (しかし熱心です)。最近、ちょっとした道のりを発見しました。

フィオナ経由で読み込んでいるポリゴン シェープファイルがあります。このシェープファイルには、ポリゴンとマルチポリゴンの両方のアイテムが含まれており、その中のすべての座標 (つまり、外部と内部の両方) の各フィーチャに対して配列を作成する必要があります。特に、2 つのポリゴン アイテムには内部リングがあります (そしてそれらは有効です)。

ポリゴン/マルチポリゴンの外部座標へのアクセスに問題はないようですが、内部座標については何も取得していません。

ここで新しいアプローチを取る必要がありますか (つまり、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)
4

1 に答える 1

16

内側リングと外側リングの構造が異なります。どのポリゴンにも、0 個以上の内部リングを持つ外部リングが常に 1 つあります。

したがって、ジオメトリの構造を見ると、exteriorLinearRingオブジェクトであり、0 個以上のオブジェクト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)
于 2014-02-20T23:33:24.027 に答える