shp文件与数据库(创建表)

前言

第三方库准备

shp文件是什么?笔者就不多做解释。后面将使用python的一些第三方库

1、sqlalchemy

2、pyshp

3、geoalchemy2

4、geopandas

这四个是主要的库,具体怎么使用可以参考相关教程,当然还有其他库,后面在介绍。

数据库准备

shp文件一般包含空间数据,所以选用的数据库是PostgreSQL。具体操作不多说。

shp文件准备

打开阿里云数据可视化平台,DataV.GeoAtlas地理小工具系列 (aliyun.com)

比如选择成都市,如下图。

可以其中类型中选择下载,直接下载json文件,也可以通过对json API 发送请求,得到json数据。

代码如下。

import requests
import json
r=requests.get(url='https://geo.datav.aliyun.com/areas_v3/bound/geojson?code=510100_full')
str_data=json.dumps(r.json(),ensure_ascii=False)
with open('成都.json','w',encoding='utf-8') as f:f.write(str_data)

修改code参数,就可以得到其他地区的数据。

后面可以通过网站把json文件转shp文件,如下这个网站,JSON to SHP Converter Online - MyGeodata Cloud,当然也可以通过python把json转shp文件,很简单,代码如下。

import geopandas as gpd
data = gpd.read_file('成都市.json')
data.to_file('成都', driver='ESRI Shapefile', encoding='utf-8')

运行是成功的,如果有如下警告,可以忽略,不存在。

则会在当前目录下生成shp及相关的文件,如下图

通过arcmap打开shp文件,在通过arcmap修改一下属性,显示的结果如图。

打开属性表,可以看到数据,如下图所示。

正文

读取shp文件,有多种方法,可以通过peopandas,或者pyshp(shapefile)读取,因为要创建表,笔者使用pyshp来读取shp文件。

得到列

代码如下。

import shapefile
file=shapefile.Reader('成都/成都.shp')
fileds=file.fields
for i in fileds:print(i)
shapes=file.shape()
print(shapes.shapeTypeName)

打印的数据如下。

('DeletionFlag', 'C', 1, 0)
['adcode', 'N', 18, 0]
['name', 'C', 80, 0]
['childrenNu', 'N', 18, 0]
['level', 'C', 80, 0]
['parent', 'C', 80, 0]
['subFeature', 'N', 18, 0]
POLYGON

分析数据的意思

DeletionFlag没有用,可以删除,POLYGON,对应的空间数据是面,还有其他类型,如下图所示

具体含义可自行搜索。以['adcode', 'N', 18, 0]为例

'adcode' 是字段名。
'N' 是字段类型,表示数值类型,可以是整数或浮点数。
18 是字段长度,表示这个字段可以存储的最大字符数。
0 是小数位数,表示数值可以有的小数位数。在这个例子中,小数位数为 0,所以这个字段应该是整数类型。

还有其他字段类型,如下所示。

字段索引字段类型
C字符,文字
N数字,带或不带小数
F浮动(与“N”相同)
L逻辑,表示布尔值True / False值
D日期
M备忘录,在GIS中没有意义,而是xbase规范的一部分

所以,可以总结出表的属性分别有


id(自己建立),geometry,adcode,name,childrenNu,level,parent,subFeature

和arcmap中看到的一致。

创建表

创建表可以自己使用sql语句,笔者直接使用已有的轮子,sqlalchemy,先对怎么创建表举个例子

示例——创建学生表

代码如下。

from sqlalchemy import create_engine,Integer,String,Column
from sqlalchemy.orm import declarative_base
# 构造基础类
Base = declarative_base()
# 创建交互引擎
engine = create_engine('mysql+pymysql://username:password@localhost:3306/database')# 表的定义
class Student(Base):__tablename__ = 'student'id = Column(Integer(), primary_key=True, autoincrement=True, nullable=False, comment='学生id')name = Column(String(16), nullable=False, comment='学生姓名')# 执行创建
Base.metadata.create_all(engine)

需要安装pymysql库,如果是PostgreSQL,需要安装psycopg2库。

创建shp文件中的表

代码如下。

from geoalchemy2 import Geometry
# Geometry 空间数据类型
from sqlalchemy.schema import CreateTable
from sqlalchemy.orm import declarative_base
from sqlalchemy import Table, Column, Integer, VARCHAR, create_engine, BigInteger, Numeric, DATE, Boolean
from dataclasses import dataclass, fields
import shapefileBase = declarative_base()@dataclass
class Shp2Postgres:shp_path: strtable_name: str = 'shp'pg_db: str = 'arcgis'engine: create_engine = create_engine(f'postgresql+psycopg2://username:password@localhost/{pg_db}')file: shapefile.Reader = Nonewords: list = Noneshape_name: str = None""":param shp_path: shp文件路径:param table_name: 表名:param pg_db: 数据库名:param engine: 数据库引擎:param file: shp文件:param words: shp文件字段:param shape_name: shp文件类型:param ShpTable: shp文件对应的表"""def __post_init__(self):self.file = shapefile.Reader(self.shp_path)self.words = self.file.fields[1:]self.shape_name = self.file.shapeTypeNameclass ShpTable(Base):__tablename__ = self.table_nameid = Column(Integer(), primary_key=True, autoincrement=True, nullable=False, comment='id')geometry = Column(Geometry(geometry_type=self.shape_name, srid=4326), comment='空间信息')self.ShpTable = ShpTableself.add_column()def add_column(self):"""添加字段:return:"""for field in self.words:name = field[0]_type = field[1]length = field[2]decimal = field[3]match _type:case 'N':_type = BigInteger()case 'C':_type = VARCHAR(length)case 'F':_type = Numeric(length, decimal)case 'L':_type = Boolean()case 'D':_type = DATE()case 'M':_type = VARCHAR(255)case _:_type = VARCHAR(255)setattr(self.ShpTable, name, Column(_type, comment=name, name=name, quote=False))def execute(self):"""执行创建:return:"""# 执行创建Base.metadata.create_all(self.engine)# 打印创建表的sql语句table = CreateTable(self.ShpTable.__table__).compile(self.engine)print(table)

运行以下

数据库中表如下

创建成功。

最后

下一篇接着写,怎么插入数数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/605213.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信源编码与信道转移矩阵

目录 一. 信息论模型 二. 点对点通信模型 三. 信源编码 四. 信道转移矩阵 4.1 二进制对称信道 4.2 二进制擦除信道 五. 小结 (1)信道直射与反射 (2)信道散射 (3) 信道时变性 一. 信息论模型 194…

【AI视野·今日Robot 机器人论文速览 第七十一期】Fri, 5 Jan 2024

AI视野今日CS.Robotics 机器人学论文速览 Fri, 5 Jan 2024 Totally 11 papers 👉上期速览✈更多精彩请移步主页 Daily Robotics Papers Machine Learning in Robotic Ultrasound Imaging: Challenges and Perspectives Authors Yuan Bi, Zhongliang Jiang, Felix D…

redis可视化工具 RedisInsight

redis可视化工具 RedisInsight 1、RedisInsight是什么2、下载RedisInsight3、使用RedisInsight4、其他redsi可视化工具 1、RedisInsight是什么 RedisInsight 是一个用于管理和监控 Redis 数据库的图形用户界面(GUI)工具。它是由 Redis Labs 开发的&…

idea使用ssh连接docker,并通过Dockerfile文件,直接在idea中启动docker应用,并进行远程debug

idea使用ssh连接docker,并通过Dockerfile文件,直接在idea中启动docker应用,并进行远程debug 第一步: idea通过ssh连接docker第二步:使用Dockerfile文件在远程启动应用第三步: 远程debug 容器运行的好处是减轻本地运行的负担(本地电…

NSSCTF 2048

开启环境: 按F12查看网络,看到2048.js文件,打开 修改score>20000或者直接运行:(控制台输入) alert(String.fromCharCode(24685,21916,33,102,108,97,103,123,53,51,49,54,48,99,56,56,56,101,50,53,99,51,102,56,50,56,98,50,51,101,51,49,54,97,55,97,101,48,56,51,125)); …

Quartus II 13.1的安装及使用

Quartus II 13.1的安装及使用_quartus13.1-CSDN博客1.3 Verilog 环境搭建 | 菜鸟教程 学习 Verilog 做仿真时,可选择不同仿真环境。FPGA 开发环境有 Xilinx 公司的 ISE(目前已停止更新),VIVADO;因特尔公司的 Quartu…

Marching Cubes算法再回顾

1,确定包含等值面的体元 首先介绍一下 体元的概念,体元是三维图像中由相邻的八个体素点组成的正方体方格,英语也叫 Cube,体元中角点函数值分为两种情况,一种是大于等于给定等值面的值 C0 ,则将角点设为 1 称该角点在等值面内部&a…

本地部署 gemini-openai-proxy,使用 Google Gemini 实现 Openai API

本地部署 gemini-openai-proxy,使用Google Gemini 实现 Openai API 0. 背景1. 申请 Google Gemini API key2. (Optional)Google Gemini 模型说明3. gemini-openai-proxy Github 地址4. 本地部署 gemini-openai-proxy5. 测试 0. 背景 使用 Google Gemini 实现 Opena…

Java 之 CAS(CompareAndSwap)底层原理详解

目录 一. 前言 二. CAS 底层原理 2.1. 代码实例 2.2. 源码分析 2.3. 底层汇编 2.4. ABA 问题 三. 总结 3.1. CAS 缺点 3.2. CAS 会导致 ABA 问题 一. 前言 CAS 的全称是 Compare-And-Swap,它是 CPU 并发原语。它的功能是判断内存某个位置的值是否为预期值。…

MySQL 8.0 开关 Redo Logging

一 前言 前几天有客户测试使用云数据库的时候提出 要禁止mydumper 关闭redo log的操作 (说白了就是导入数据时保持MySQL 实例的redo logging功能), 这才想起 在 MySQL 8.0.21 版本中,开启了一个新特性 “Redo Logging 动态开关”。 在新实例导数据的场…

【IPC通信--消息队列】

消息队列(也叫做报文队列)是一个消息的链表。可以把消息看作一个记录,具有特定的格式以及特定的优先级。对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息;对消息队列有读权限的进程则可以从消息队列中读走消息…

[C#]Onnxruntime部署Chinese CLIP实现以文搜图以文找图功能

【官方框架地址】 https://github.com/OFA-Sys/Chinese-CLIP 【算法介绍】 在当今的大数据时代,文本信息处理已经成为了计算机科学领域的核心议题之一。为了高效地处理海量的文本数据,自然语言处理(NLP)技术应运而生。而在诸多N…

电子实验室设备:从零开始配置实验室(一)

本文译自 Electronics Lab Equipment: Kitting out a Lab from Scratch 随着多次国际迁徙以及在几家公司(或其分支机构)工作,尤其是在没有强大电子工程团队的情况下,我不得不为自己和客户设置多个电子实验室。那些计划进行内部测试…

网页设计与制作web前端设计html+css+js成品。电脑网站制作代开发。vscodeDrea 【企业公司宣传网站(HTML静态网页项目实战)附源码】

网页设计与制作web前端设计htmlcssjs成品。电脑网站制作代开发。vscodeDrea 【企业公司宣传网站(HTML静态网页项目实战)附源码】 https://www.bilibili.com/video/BV1Hp4y1o7RY/?share_sourcecopy_web&vd_sourced43766e8ddfffd1f1a1165a3e72d7605

【C++】STL 算法 ⑥ ( 二元谓词 | std::sort 算法简介 | 为 std::sort 算法设置 二元谓词 排序规则 )

文章目录 一、二元谓词1、二元谓词简介2、 std::sort 算法简介3、 代码示例 - 为 std::sort 算法设置 二元谓词 排序规则 一、二元谓词 1、二元谓词简介 " 谓词 ( Predicate ) " 是一个 返回 布尔 bool 类型值 的 函数对象 / 仿函数 或 Lambda 表达式 / 普通函数 , …

逆置算法和数组循环移动算法

元素逆置 概述:其实就是将 第一个元素和最后一个元素交换,第二个元素和倒数第二个元素交换,依次到中间位置。用途:可用于数组的移动,字符串反转,链表反转操作,栈和队列反转等操作。 逆置图解 …

2024年1月7日15:09:50

2024年1月7日15:09:55复习:我今天学了有价值的东西,那就是在瓦罗兰特拿到了三杀 2024年1月7日15:11:10学习了如何使用vivopad2的键盘 可以稍微用一下 2024年1月7日15:17:58 学习一个编程的题目 2024年1月7日15:31:27不用机械键盘打字效率就是比不用低…

深入理解堆(Heap):一个强大的数据结构

. 个人主页:晓风飞 专栏:数据结构|Linux|C语言 路漫漫其修远兮,吾将上下而求索 文章目录 前言堆的实现基本操作结构体定义初始化堆(HeapInit)销毁堆(HeapDestroy) 重要函数交换函数(…

Talk | EMNLP 2023 最佳长论文:以标签为锚-从信息流动的视角分析上下文学习

本期为TechBeat人工智能社区第561期线上Talk。 北京时间1月4日(周四)20:00,北京大学博士生—王乐安的Talk已准时在TechBeat人工智能社区开播! 他与大家分享的主题是: “以标签为锚-从信息流动的视角分析上下文学习”,介绍了他的团队在上下文学…

STM32深入系列02——BootLoader分析与实现

文章目录 1. STM32程序升级方法1.1 ST-Link / J-link下载1.2 ISP(In System Programing)1.3 IAP(In Applicating Programing)1.3.1 正常程序运行流程1.3.2 有IAP时程序运行流程 2. STM32 Bootloader实现2.1 方式一:Boo…