Проблемы с многокомпонентными фигурами с использованием PyShp при создании нового Shapefile

У меня есть шейп-файл (blockgroups.shp), который я скачал с: https://github.com/GeospatialPython/pyshp/tree/master/shapefiles

Я хочу создать новый Shapefile только с четырьмя атрибутами (bkg_key, pop1990, white и black), используя PyShp.

Я пробовал с этим кодом:

import shapefile
file= "blockgroups.shp"
outFile = "newblockgroup3000"
sf = shapefile.Reader(file)
shapeRec= sf.shapeRecords()
w = shapefile.Writer(shapefile.POLYGON)
w.field('BKG_KEY', 'C', 40)
w.field('POP1990', 'N', 40)
w.field('NWHITES', 'N', 40)
w.field('NBLACKS', 'N', 40)
for row in shapeRec:
    bkg_key = row.record[1]
    pop1990 = row.record[2]
    white = row.record[7]
    black = row.record[8]
    points = row.shape.points
    parts = row.shape.parts
    w.parts = parts
    w.poly([points])
    w.record(bkg_key,pop1990,white,black)
    w.save(outFile)

Это работает для всех форм, кроме одной.

Существует запись, которая имеет более одной части. Запись, состоящая из более чем одной части, представляет собой "BKG_KEY = 060750601001" и "POP = 4531". В новом шейп-файле эта запись имеет странную форму, потому что pyShp автоматически соединяет первую и последнюю вершины, которые происходят из разных частей объекта.

Если я выберу только записи, которые "POP1990 <4531", и записи, которые "POP1990>4531" (исключая упомянутую запись), это сработает, поэтому проблема возникает только при наличии записей, состоящих из нескольких частей.

Есть ли способ сохранить количество частей исходного шейп-файла, когда я создаю новый? Как я могу справиться с этой проблемой.

Буду признателен за помощь. Спасибо

0 ответов

Я нашел этот вопрос, когда искал решение сохранить несколько фигур в одном шейп-файле, используя pyshp. Ваш код помог мне решить мою проблему, и поэтому я предоставлю решение для этого.

import shapefile

file= "blockgroups.shp"
outFile = "newblockgroup3000"
sf = shapefile.Reader(file)
shapeRec= sf.shapeRecords()
w = shapefile.Writer(shapefile.POLYGON)
w.field('BKG_KEY', 'C', 40)
w.field('POP1990', 'N', 40)
w.field('NWHITES', 'N', 40)
w.field('NBLACKS', 'N', 40)

for row in shapeRec:
    bkg_key = row.record[1]
    pop1990 = row.record[2]
    white = row.record[7]
    black = row.record[8]
    points = row.shape.points
    parts = row.shape.parts
    geom = []

    # handle parts here
    for i in range(len(parts)):
        xy = []
        pt = None
        if i < len(parts) - 1:
            pt = points[parts[i]:parts[i + 1]]
        else:
            pt = points[parts[i]:]
        for x, y in pt:
            xy.append([x, y])
        geom.append(xy)

    w.poly(geom)
    w.record(bkg_key,pop1990,white,black)
w.save()

Результат перед редактированием:

Результат после редактирования:

Другие вопросы по тегам