Разделите шейп-файл на несколько частей, используя PyShp - PullRequest
0 голосов
/ 19 марта 2019

Попытка разделить шейп-файл на несколько частей в зависимости от размера. Если размер файла zip-файла Shapefile превышает 10 МБ, он будет разделен на куски.

Ранее мы использовали Geopandas для этой задачи, и она работала нормально, но потребляла больше оперативной памяти для выполнения этой задачи. Так что попробуйте библиотеку PyShp.

Основная проблема в том, что он генерирует разделенные файлы, но в Shapefile не было вставлено ни одной записи, и файл DBF также отсутствует.

Я что-то упустил в следующем коде, пожалуйста, дайте мне знать

import os
import math
import csv
import zipfile
import shutil
from shutil import copyfile
import shapefile

path = '<shapefile_data_path>'
storage_path = '<path_to_extract_zip_file>'
current_dir = '<path_for_divided_shapefiles>'
ALLOWED_SIZE = 10
procs = []

# Here filepath means Shapefile's zip file path
def function_name(filepath):
    file_name = file_path.split('/')[-1]
    name = file_name.split('.zip')[0]
    storage_file = os.path.join(storage_path, file_name)
    storage_file = storage_file.replace('\\', '/')
    src = path +'/'+file_path
    shutil.copy(src,storage_file)
    statinfo = os.stat(storage_file)
    if (statinfo.st_size >> 20) > ALLOWED_SIZE:
        storage_path_1 = storage_path + '/' + name
        zip_ref = zipfile.ZipFile(storage_file)
        zip_ref.extractall(storage_path_1)
        zip_ref.close()
        prj_file_path = ''
        for _file1 in os.listdir(storage_path_1):
            print _file1
            if _file1.endswith('.prj'):
              prj_file_path = os.path.join(storage_path_1, _file1)

        for _file1 in os.listdir(storage_path_1):
            if _file1.endswith('.shp'):
                file_size = statinfo.st_size >> 20
                parts = int(math.ceil(float(file_size) / float(ALLOWED_SIZE)))
                # data = gpd.read_file(storage_path_1 + '/' + _file1)
                data = shapefile.Reader(storage_path_1 + '/' + _file1)
                records = data.records()
                num_lines = len(data)
                increment = int(num_lines / parts)
                start_index = 0
                part = 1
                file_name_new = file_name.split('.zip')[0]

            while start_index < num_lines:
                part_name = '{1}_part{0}'.format(part, file_name_new)
                outpath = os.path.join(current_dir, part_name)
                os.mkdir(outpath)
                outfile = os.path.join(outpath, part_name)
                end_index = start_index + increment
                if end_index > num_lines:
                  end_index = num_lines

                chunk = records[start_index:end_index]
                with open(outfile,'w') as f:
                    f.write(str(chunk))

                copyfile(prj_file_path, os.path.join(outpath, file_name_new+'.prj'))
                shutil.make_archive(outpath, 'zip', outpath)
                shutil.rmtree(outpath)
                start_index = end_index
                part += 1

При записи в новый шейп-файл возникли трудности с созданным zip-файлом. Файл DBF отсутствует, а файл SHP не содержит надлежащих записей

Любая помощь очень ценится.

...