一、环境搭建

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的。

  1. 脚本结构定义

Py脚本怎么写都能执行,但还是将结构规范化一下,这是代码的整洁之美。

# coding=gbk

Import 库包

Def 函数():

if __name__ == '__main__':

执行函数

四、读取shp文件

这个是读shp,返回一个list的方法,再把list写入一个文本文档的方法。

# coding=gbktry:from osgeo import gdalfrom osgeo import ogrexcept ImportError:import gdalimport ogr# pathStr,shp文件的全路径def ReadVectorFile(pathStr):# 返回结果是一个listresult=[]# 支持中文路径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))# 获取要素中的几何体oGeometry = oFeature.GetGeometryRef()lineStr.append(str(oGeometry))# print(lineStr)result.append(lineStr)# 循环oFeature = oLayer.GetNextFeature()print("数据集关闭!")return resultif __name__ == '__main__':result=ReadVectorFile(r'D:\gismap\data\v6_time_cnty_pts_utf_wgs84\v6_time_cnty_pts_utf_wgs84.shp')f_new=open(r'D:\gismap\data\v6_time_cnty_pts_utf_wgs84\v6_time_cnty_pts_utf_wgs84.txt','a',encoding='utf-8')for r in result:for p in r:f_new.write(p+'\t')f_new.write('\n')f_new.close()

好像这里没有能用的到shapely的方法,shapely是相对轻量级的gis库包,可以用来构建rtree和进行点面判断等。

五、Pg库建表语句

直接将之前shp生成的txt文件作为源,写入数据库。

既然要写入,至少要进行两个步骤的操作。

其一是建表。

其二是插入。

先写v6_time_cnty_pts_utf_wgs84.shp这个的建表语句,建表的时候最好加上字段说明,否则时间长了,都不知道这个表是干什么的了。

建表语句如下,顺便见了个索引。

--建表

CREATE TABLE public. v6_time_cnty_pts_utf_wgs84(

gid SERIAL8 PRIMARY KEY NOT NULL,

name_py varchar(40),

name_ch varchar(45),

name_ft varchar(45),

x_coor float8,

y_coor float8,

pres_loc varchar(60),

type_py varchar(15),

type_ch varchar(15),

lev_rank varchar(1),

beg_yr int8,

beg_rule varchar(1),

end_yr int8,

end_rule varchar(1),

note_id int8,

obj_type varchar(7),

sys_id int8,

geo_src varchar(10),

compiler varchar(12),

gecomplr varchar(10),

checker varchar(10),

ent_date varchar(10),

beg_chg_ty varchar(21),

end_chg_ty varchar(30),

geom geometry

);

--建立索引

CREATE INDEX v6_time_cnty_pts_utf_wgs84_index ON v6_time_cnty_pts_utf_wgs84 USING btree(gid);

--表说明

COMMENT ON TABLE public.v6_time_cnty_pts_utf_wgs84 IS '第6版中国历史地理时间序列点数据';

COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.gid IS '主键ID';

COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.name_py IS '拼音名称';

COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.name_ch IS '简体中文名称';

COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.name_ft IS '繁体中文名称';

COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.x_coor IS '经度';

COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.y_coor IS '纬度';

COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.pres_loc IS '现所在地';

COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.type_py IS '建制类型拼音';

COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.type_ch IS '建制类型简体中文';

COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.lev_rank IS '建制等级';

COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.beg_yr IS '建制开始时间';

COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.beg_rule IS '开始时间精度';

COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.end_yr IS '建制结束时间';

COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.end_rule IS '结束时间精度';

COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.note_id IS '系统id';

COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.obj_type IS 'geometry对象类型';

COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.sys_id IS '系统id';

COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.geo_src IS 'geometry数据来源';

COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.compiler IS '编辑人员';

COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.gecomplr IS '绘制人员';

COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.checker IS '审核人员';

COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.ent_date IS '结束时间';

COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.beg_chg_ty IS '建制开始原因';

COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.end_chg_ty IS '建制结束原因';

COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.geom IS 'geometry对象';

六、Insert语句

插一条数据进去。

INSERT INTO v6_time_cnty_pts_utf_wgs84(name_py,name_ch,name_ft,x_coor,y_coor,pres_loc,type_py,type_ch,lev_rank,beg_yr,beg_rule,end_yr,end_rule,note_id,obj_type,sys_id,geo_src,compiler,gecomplr,checker,ent_date,beg_chg_ty,end_chg_ty,geom) VALUES('Luowubu','罗婺部','羅婺部',102.40378,25.88668,'云南省禄劝彝族苗族自治县西北七十二里云龙','Bu','部','6',960,null,1253,null,80317,'       POINT',80317,'FROM_FD',null,null,null,null,'新建','撤销',st_geomfromtext('POINT(102.4037799950270653 25.88667999033716072)',4326))

七、Python写入pg库

先测试一下,能不能连接成功

# coding=gbkimport psycopg2conn = psycopg2.connect(database="postgres", user="postgres", password="123456", host="127.0.0.1", port="5432")print('连接成功')

打印“连接成功就说明连接成功了。

先执行个建表语句。

# coding=gbk
import psycopg2
# 连接数据库
conn = psycopg2.connect(database="postgres", user="postgres", password="123456", host="127.0.0.1", port="5432")
print('连接成功')
# 建立游标
cur = conn.cursor()
cur.execute('''--建表
CREATE TABLE public. v6_time_cnty_pts_utf_wgs84(
  gid SERIAL8 PRIMARY KEY NOT NULL,
  name_py varchar(40),
  name_ch varchar(45),
  name_ft varchar(45),
  x_coor float8,
  y_coor float8,
  pres_loc varchar(60),
  type_py varchar(15),
  type_ch varchar(15),
  lev_rank varchar(1),
  beg_yr int8,
  beg_rule varchar(1),
  end_yr int8,
  end_rule varchar(1),
  note_id int8,
  obj_type varchar(7),
  sys_id int8,
  geo_src varchar(10),
  compiler varchar(12),
  gecomplr varchar(10),
  checker varchar(10),
  ent_date varchar(10),
  beg_chg_ty varchar(21),
  end_chg_ty varchar(30),
  geom geometry
);
--建立索引
CREATE INDEX v6_time_cnty_pts_utf_wgs84_index ON v6_time_cnty_pts_utf_wgs84 USING btree(gid);
--表说明
COMMENT ON TABLE public.v6_time_cnty_pts_utf_wgs84 IS '第6版中国历史地理时间序列点数据';
COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.gid IS '主键ID';
COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.name_py IS '拼音名称';
COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.name_ch IS '简体中文名称';
COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.name_ft IS '繁体中文名称';
COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.x_coor IS '经度';
COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.y_coor IS '纬度';
COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.pres_loc IS '现所在地';
COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.type_py IS '建制类型拼音';
COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.type_ch IS '建制类型简体中文';
COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.lev_rank IS '建制等级';
COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.beg_yr IS '建制开始时间';
COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.beg_rule IS '开始时间精度';
COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.end_yr IS '建制结束时间';
COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.end_rule IS '结束时间精度';
COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.note_id IS '系统id';
COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.obj_type IS 'geometry对象类型';
COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.sys_id IS '系统id';
COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.geo_src IS 'geometry数据来源';
COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.compiler IS '编辑人员';
COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.gecomplr IS '绘制人员';
COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.checker IS '审核人员';
COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.ent_date IS '结束时间';
COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.beg_chg_ty IS '建制开始原因';
COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.end_chg_ty IS '建制结束原因';
COMMENT ON COLUMN public.v6_time_cnty_pts_utf_wgs84.geom IS 'geometry对象';''')

建表完成之后,用之前生成的txt文件写库。

# coding=gbkimport psycopg2# 连接数据库conn = psycopg2.connect(database="postgres", user="postgres", password="123456", host="127.0.0.1", port="5432")print('连接成功')# 建立游标cur = conn.cursor()f=open(r'D:\gismap\data\v6_time_cnty_pts_utf_wgs84\v6_time_cnty_pts_utf_wgs84.txt','r',encoding='utf-8')# 按行读入txtflines=f.readlines()for line in flines:# 去掉干扰,切词abbrlist=line.replace("'"," ").split('\t')# name_py,name_ch,name_ft,x_coor,y_coor,pres_loc,type_py,type_ch,lev_rank,beg_yr,beg_rule,end_yr,end_rule,note_id,obj_type,sys_id,geo_src,compiler,gecomplr,checker,ent_date,beg_chg_ty,end_chg_ty,geomname_py='null'if (abbrlist[0]!=''):name_py="'"+abbrlist[0]+"'"name_ch='null'if (abbrlist[1]!=''):name_ch="'"+abbrlist[1]+"'"name_ft='null'if (abbrlist[2]!=''):name_ft="'"+abbrlist[2]+"'"x_coor='null'if (abbrlist[3]!=''):x_coor=abbrlist[3]y_coor='null'if (abbrlist[4]!=''):y_coor=abbrlist[4]pres_loc='null'if (abbrlist[5]!=''):pres_loc="'"+abbrlist[5]+"'"type_py='null'if (abbrlist[6]!=''):type_py="'"+abbrlist[6]+"'"type_ch='null'if (abbrlist[7]!=''):type_ch="'"+abbrlist[7]+"'"lev_rank='null'if (abbrlist[8]!=''):lev_rank="'"+abbrlist[8]+"'"beg_yr='null'if (abbrlist[9]!=''):beg_yr=abbrlist[9]beg_rule='null'if (abbrlist[10]!=''):beg_rule="'"+abbrlist[10]+"'"end_yr='null'if (abbrlist[11]!=''):end_yr=abbrlist[11]end_rule='null'if (abbrlist[12]!=''):end_rule="'"+abbrlist[12]+"'"note_id='null'if (abbrlist[13]!=''):note_id=abbrlist[13]obj_type='null'if (abbrlist[14]!=''):obj_type="'"+abbrlist[14]+"'"sys_id='null'if (abbrlist[15]!=''):sys_id=abbrlist[15]geo_src='null'if (abbrlist[16]!=''):geo_src="'"+abbrlist[16]+"'"compiler='null'if (abbrlist[17]!=''):compiler="'"+abbrlist[17]+"'"gecomplr='null'if (abbrlist[18]!=''):gecomplr="'"+abbrlist[18]+"'"checker='null'if (abbrlist[19]!=''):checker="'"+abbrlist[19]+"'"ent_date='null'if (abbrlist[20]!=''):ent_date="'"+abbrlist[20]+"'"beg_chg_ty='null'if (abbrlist[21]!=''):beg_chg_ty="'"+abbrlist[21]+"'"end_chg_ty='null'if (abbrlist[22]!=''):end_chg_ty="'"+abbrlist[22]+"'"geom='null'if (abbrlist[23]!=''):geom="st_geomfromtext('"+abbrlist[23]+"',4326)"# 拼接sql语句sqltxt="INSERT INTO v6_time_cnty_pts_utf_wgs84(" \"name_py,name_ch,name_ft,x_coor,y_coor,pres_loc,type_py,type_ch,lev_rank,beg_yr,beg_rule," \"end_yr,end_rule,note_id,obj_type,sys_id,geo_src,compiler,gecomplr,checker,ent_date," \"beg_chg_ty,end_chg_ty,geom) VALUES("+name_py+","+name_ch+","+name_ft+","+x_coor+","+y_coor+","\+pres_loc+","+type_py+","+type_ch+","+lev_rank+","+beg_yr+","+beg_rule+","+end_yr+","+end_rule+","\+note_id+","+obj_type+","+sys_id+","+geo_src+","+compiler+","+gecomplr+","+checker+","+ent_date+","\+beg_chg_ty+","+end_chg_ty+","+geom+")"print(sqltxt)# 执行sqlcur.execute(sqltxt)# 关闭连接conn.commit()conn.close()print('插入完成')

另外的文件就按照这个流程来就可以,polygon格式有点不同,详见下一篇。

要是觉得写脚本麻烦,就直接用postgis导入也可以。

从零开始,构建电子地图网站:0_3_数据处理python(1)相关推荐

  1. postgis安装_从零开始,构建电子地图网站:0_2_数据处理postgis

    软件安装完,开始数据处理. 从China Historical GIS下载一份数据. 一.数据下载 数据来源: China Historical GIS: https://sites.fas.harv ...

  2. 从零开始,构建电子地图网站:0_9_web+InitializingBean启动加载本地缓存

    我有点忘了当初的宏愿了,所以要回到网站上看看,http://worldmap.harvard.edu/maps/chinaX. 先下载个有道翻译,看下左侧的Overlays,忽然发现除了<中国历 ...

  3. 从零开始构建一个的asp.net Core 项目(一)

    最近突发奇想,想从零开始构建一个Core的MVC项目,于是开始了构建过程. 首先我们添加一个空的CORE下的MVC项目,创建完成之后我们运行一下(Ctrl +F5).我们会在页面上看到"He ...

  4. 拼图登陆拼图二维码验证_如何使用拼图快速轻松地构建静态网站

    拼图登陆拼图二维码验证 by Rick West 由里克·韦斯特(Rick West) 如何使用拼图快速轻松地构建静态网站 (How to use Jigsaw to quickly and easi ...

  5. 从零开始构建自己的爬虫代理IP数据库并定期检验IP有效性...

    ProxyIPPool 从零开始构建自己的代理IP池:根据代理IP网址抓取新的代理IP:对历史代理IP有效性验证 源码地址:https://github.com/TOMO-CAT/ProxyIPPoo ...

  6. 为什么谷歌会从零开始构建一个全新的操作系统?

    腾讯科技编者按 <快公司>网站日前发表文章,对谷歌开发一个全新操作系统的原因进行了分析,解释了现有操作系统存在的问题,并对谷歌此举的动机进行了推测,以下为原文: 上周,谷歌一个团队做了一件 ...

  7. 海量数据处理-Python

    文章目录 海量数据处理-Python 海量数据处理的困难 大文件生成 空间受限 分块读取 文件拆分提取 拆分小文件 比较小文件 通过hash拆分文件 拆分小文件-依据hash 求取IP前TopK(还是 ...

  8. 计算机系统要素高清pdf,计算机系统要素:从零开始构建现代计算机[PDF][43.21MB]...

    内容简介 本书通过展现简单但功能强大的计算机系统之构建过程,为读者呈现了一幅完整.严格的计算机应用科学大图景.本书作者认为,理解计算机工作原理的最好方法就是亲自动手,从零开始构建计算机系统. 通过12 ...

  9. 计算机系统要素-从零开始构建现代计算机-答案

    答案 github 地址 这本书主要讲解了计算机原理(1-5章).编译原理(6-11章).操作系统相关知识(12章).不要看内容这么多,其实这本书的内容非常通俗易懂,翻译也很给力.每一章背后都有对应的 ...

最新文章

  1. Spring任务调度之Spring-Task
  2. Linux中printk和strace命令调试的一些技巧
  3. P3128 [USACO15DEC]最大流Max Flow
  4. python items函数用法,Python中dictionary items()系列函数的用法实例
  5. java中你知道这四种代码块吗?
  6. React开发(199):参数请求错误修改请求
  7. 数据库都可以“自动驾驶”了,传统DBA何去何从?
  8. 【Elasticsearch】使用 Grok 和 Elasticsearch 为数据添加结构
  9. python difflib详解_在 Python 中使用 difflib 比较字符串
  10. revit API 实现可停靠窗口
  11. SQL优化之not in
  12. PLC不用编程,以太网方式与多台智能仪表、变频器等串口设备通讯(基于智能网关)
  13. 这是我看过最棒的MEMS介绍文章,从原理制造到应用全讲透(强推)
  14. 史上最全App瘦身实践
  15. 论文必备:深度学习中的网络结构是怎么画的
  16. 如何用人工智能自动玩游戏
  17. kindle所支持的格式
  18. 阿里域名+腾讯云服务器组合部署网站
  19. 2019.4.summary
  20. VSE++: Improving Visual-Semantic Embeddings with Hard Negatives

热门文章

  1. Triton针对工业系统的形势分析以及检测手段 || 后附今日情报资源
  2. 张矩:信息安全创业必知手册
  3. 领导力培训课程鱼龙混杂,还不如看这本经典领导力书籍来得实在!
  4. 代餐行业鱼龙混杂暴利驱动微商形成产业链
  5. 中国联通客户端被曝Bug:无密码随便登陆
  6. 电脑用户须知 忘记分级审查密码怎么办(转)
  7. 【论文笔记】:作物分类--多时相极化SAR数据的旱地作物分类研究
  8. k3s 快速入门 - 集群搭建
  9. 闹钟Android实验报告,定时闹钟我的实验报告.doc
  10. 不懂用户,怎么做新媒体运营