一、环境搭建
Python往postgresql中导数据,至少需要3个库包,gdal、shaply、psycopg2。
先一个一个来。
1.安装gdal
直接安会有问题,先去下个安装程序,https://www.lfd.uci.edu/~gohlke/pythonlibs/#gdal
根据python的版本选择程序。
如果不知道python的版本,可以打开cmd,输入python,回车。
根据python版本和电脑位数,选了GDAL-3.0.1-cp37-cp37m-win32.whl下载。
安装的时候,打开cmd,运行语句:pip install D:\gismap\软件\ GDAL-3.0.1-cp37-cp37m-win32.whl,输入,回车。
如果提示,
提示要升级pip,写啥就敲啥。python -m pip install --upgrade pip
升级完了,接着运行上一个语句,把GADL安装了。
2.安装shaply
先去下个安装程序,https://www.lfd.uci.edu/~gohlke/pythonlibs/#shapely
根据python版本和电脑位数,选了Shapely-1.6.4.post2-cp37-cp37m-win32.whl下载。
安装的时候,打开cmd,运行语句:pip install D:\gismap\软件\Shapely-1.6.4.post2-cp37-cp37m-win32.whl,输入,回车。
如果提示,
提示要升级pip,写啥就敲啥。python -m pip install --upgrade pip
升级完了,接着运行上一个语句,把shapely安装了。
3.安装psycopg2
这个直接在pycharm上安装就行。
File——Settings,选择Project Interpreter,选择python.exe路径,点击加号,加库包,搜索需要的库包,选中,点击Install Package安装。
装pgcopy,能把psycopg2都装上。
二、测试库包
先建个txt,readshptopg.txt,改成readshptopg.py,用pycharm打开,直接拖拽到界面里就可以,如果显示,No interpreter,就设置一下,引到python.exe所在的路径下。
敲入:
import shapely
import psycopg2
import gdal
如果有代码补全,那么就说明安装得差不多了。
然后开始一个一个包来引用。
三、确定编码
首先确定电脑的编码。
打开cmd,输入chcp,我的电脑返回“活动代码页:936”,这说明我的电脑默认编码格式是gbk的。
- 脚本结构定义
Py脚本怎么写都能执行,但还是将结构规范化一下,这是代码的整洁之美。
# coding=gbk
Import 库包
Def 函数():
if __name__ == '__main__':
执行函数
四、读取shp文件
这个是读shp,返回一个list的方法,再把list写入一个文本文档的方法。
# coding=gbk try: from osgeo import gdal from osgeo import ogr except ImportError: import gdal import ogr # pathStr,shp文件的全路径 def ReadVectorFile(pathStr): # 返回结果是一个list result=[] # 支持中文路径 gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "NO") # 属性表字段支持中文 gdal.SetConfigOption("SHAPE_ENCODING", "") strVectorFile = pathStr # 注册所有的驱动 ogr.RegisterAll() # 打开数据 ds = ogr.Open(strVectorFile, 0) # 获取该数据源中的图层个数,一般shp数据图层只有一个,如果是mdb、dxf等图层就会有多个 iLayerCount = ds.GetLayerCount() # 获取第一个图层 oLayer = ds.GetLayerByIndex(0) # 对图层进行初始化 oLayer.ResetReading() # 获取图层中的属性表表头并输出,可以定义建表语句 print("属性表结构信息:") oDefn = oLayer.GetLayerDefn() iFieldCount = oDefn.GetFieldCount() for iAttr in range(iFieldCount): oField = oDefn.GetFieldDefn(iAttr) print("%s: %s(%d.%d)" % ( \ \ oField.GetNameRef(), \ \ oField.GetFieldTypeName(oField.GetType()), \ \ oField.GetWidth(), \ \ oField.GetPrecision())) # 输出图层中的要素个数 print("要素个数 = ", oLayer.GetFeatureCount(0)) oFeature = oLayer.GetNextFeature() # 下面开始遍历图层中的要素,将对象都作为string输出 while oFeature is not None: # 获取要素中的属性表内容 lineStr=[] for iField in range(iFieldCount): lineStr.append(oFeature.GetFieldAsString(iField)) #