Попытка разделить шейп-файл на несколько частей в зависимости от размера. Если размер файла 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 не содержит надлежащих записей
Любая помощь очень ценится.