上个月写了一个工具是关于shp文件转换为CAD文件,
后面被吐槽说这个工具的大小为390M。
我承认,这个是“小工具”一点也不小!
那是什么原因造成的呢?
其实这个python打包的通病问题,python作为胶水语言,可以快速开发。想要打包成二进制文件交给其他人使用,这个二进制文件一般是巨大无比的。
更底层的原因是,在代码中,我们导入了geopandas这个库,geopandas很好用,是因为它引用了非常多的第三方库,所以使用pyinstaller打包的时候,往往会把这些“无用”的第三方库也打包进去我们的项目里面。
同样是这个程序,我曾打包后的文件大小是3G多,我看了一下 ,好家伙啊,它把torch-cuda依赖也打包进去了!
针对这个shp文件转换为CAD文件小工具,我们可以改进它,主要做法是,不导入geopandas,即不使用geopandas!
经过网上冲浪查资料,我发现有个纯python包叫做ezdxf,这ezdxf可以对dxf文件读写,很符合这个小工具的要求。
我有了个大体的思路,使用ogr读取矢量文件的数据。ogr是啥?ogr就是osgeo里面的子库,ogr和gdal同一个级别,区别在于gdal读写栅格数据,ogr读写矢量数据。
好了,现在的程序处理步骤如下:
1.使用ogr读取矢量文件,获取点位数据。
2.使用ezdxf将点位数据保存为dxf文件。
好了好了,现在就差代码还需要写了。
代码
import os
import ezdxf
from osgeo import ogr
class Shp2Dxf:
def __init__(self, in_file):
self.in_file = in_file
self.out_file = os.path.splitext(in_file)[0] + '.dxf'
def read_shp_by_ogr(self):
ds = ogr.Open(self.in_file)
shape = ds.GetLayer()
attribute_names = []
ldefn = shape.GetLayerDefn()
geom_list = []
for i in range(shape.GetFeatureCount()):
feature = shape.GetFeatur