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 shapefile

Base = declarative_base()


@dataclass
class Shp2Postgres:
    shp_path: str
    table_name: str = 'shp'
    pg_db: str = 'arcgis'
    engine: create_engine = create_engine(f'postgresql+psycopg2://username:password@localhost/{pg_db}')
    file: shapefile.Reader = None
    words: list = None
    shape_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.shapeTypeName

        class ShpTable(Base):
            __tablename__ = self.table_name
            id = Column(Integer(), primary_key=True, autoincrement=True, nullable=False, comment='id')
            geometry = Column(Geometry(geometry_type=self.shape_name, srid=4326), comment='空间信息')

        self.ShpTable = ShpTable
        self.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)

运行以下

数据库中表如下

创建成功。

最后

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言数据在内存中的存储

1.整数在内存中的存储 我们知道数据在内存中都是以2进制的形式存储的;比如int,char,double,float这些类型的数据都是以2进制的形式去存储的,那么这些数据又是如何去存入/取出的呢? 前面我们知道,整数分为有符号整数和无符号整数…

关键字、标志符、变量

1、关键字 1.1、定义 定义:被JAVA语言赋予了特殊含义,用作专门用途的字符串(或单词) 特点:全部关键字都是小写字母 上源码: 代码中定义类的关键字class,定义一个订单控制器类 ​​​​​​​…

搭建React开发环境-webpack实现

周末在家学会React前端知识,记录下来,方便备查。 webpack版本:webpack5 编译器:vscode 第一步、新建项目及初始化 1)新建项目文件夹 可命名为 my_webpack 2)初始化项目 使用命令 npm init -y,…

Android getApplication()、getApplicationContext的区别

在Android中,getApplication()和getApplicationContext()是两种获取应用程序上下文的方法,但它们有一些细微的区别。 getApplication()方法: getApplication()方法通常用于Activity或Fragment中,它返回当前Activity或Fragment所属…

深度学习:解决CNN的困境——胶囊网络

从2017年底到2018年初,整个人工智能学术研究领域谈论最多的应该就是被誉为深度学习之父Geoffrey E. Hinton 发表的论文 Dynamic Routing Between Capsules,其中介绍了全新的深度学习模型——胶囊网络(Capsule Network) 1. 普通CNN的困境 虽…

电子学会C/C++编程等级考试2023年12月(三级)真题解析

C/C++编程(1~8级)全部真题・点这里 第1题:因子问题 任给两个正整数N、M,求一个最小的正整数a,使得a和(M-a)都是N的因子。 时间限制:10000 内存限制:65536 输入 包括两个整数N、M。N不超过1,000,000。 输出 输出一个整数a,表示结果。如果某个案例中满足条件的正整数不存…

YOLOv5改进 | 主干篇 | CSWinTransformer交叉形窗口网络改进特征融合层

一、本文介绍 本文给大家带来的改进机制是CSWin Transformer,其基于Transformer架构,创新性地引入了交叉形窗口自注意力机制,用于有效地并行处理图像的水平和垂直条带,形成交叉形窗口以提高计算效率。它还提出了局部增强位置编码(LePE),更好地处理局部位置信息,我将其…

新手练习项目 5:简易计算器(C++)

名人说:莫听穿林打叶声,何妨吟啸且徐行。—— 苏轼《定风波莫听穿林打叶声》 Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder) 目录 一、效果图二、代码(带注释)三、说明 一、效果图 二、代码(带…

【Spring实战】26 使用Spring Security 保护 Spring Boot Admin

文章目录 1. 定义1.集成流程1)添加 Spring Boot Admin 依赖2)配置 Spring Boot Admin3)启动 Spring Boot Admin 服务4)访问 Spring Boot Admin 服务5)添加 Spring Security 依赖6)配置 Spring Security7&am…

计算机网络实验(二):Wireshark网络协议分析

一、实验名称:Wireshark网络协议分析 二、实验原理 HTTP协议分析 1.超文本传输协议(Hypertext Transfer Protocol, HTTP)是万维网(World Wide Web)的传输机制,允许浏览器通过连接Web服务器浏览网页。目…

CAN物理层协议介绍

目录 ​编辑 1. CAN协议简介 2. CAN物理层 3. 通讯节点 4. 差分信号 5. CAN协议中的差分信号 1. CAN协议简介 CAN是控制器局域网络(Controller Area Network)的简称,它是由研发和生产汽车电子产品著称的德国BOSCH公司开发的,并最终成为国际标准(ISO11519) &#xff0…

求更新后的路由表

假定网络中的路由器B的路由表有如下的项目 (这三列分别表示“目的网络“距离”和“下一跳路由器”): 现在B收到从C发来的路由信息(这两列分别表示“目的网络”和“距离”): 试求出路由器B更新后的路由表(详细说明每一个步骤)。 (1)首先把收到的路由信息的"距离"1: …

【AI视野·今日NLP 自然语言处理论文速览 第七十一期】Fri, 5 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Fri, 5 Jan 2024 Totally 28 papers 👉上期速览✈更多精彩请移步主页 Daily Computation and Language Papers LLaMA Pro: Progressive LLaMA with Block Expansion Authors Chengyue Wu, Yukang Gan, Yixiao Ge, Zeyu Lu, …

Fowsniff

靶场搭建 遇到扫描不到的情况,可以尝试改靶机的网络为NAT模式,在靶机启动时按”esc“,进入Advanced options for Ubantu,选择recovery mode,选择network,按方向键”→“,OK,然后res…

JVM工作原理与实战(九):类加载器-启动类加载器

专栏导航 JVM工作原理与实战 RabbitMQ入门指南 从零开始了解大数据 目录 专栏导航 前言 一、启动类加载器 二、通过启动类加载器去加载用户jar包 1.放入jre/lib目录进行扩展 2.使用参数进行扩展 总结 前言 JVM作为Java程序的运行环境,其负责解释和执行字节码…

基于 STM32 的 MPU6050 姿态计算方法及应用

基于STM32的MPU6050姿态计算方法可以通过融合陀螺仪和加速度计的数据来实现。在本文中,我们将介绍通过MPU6050获取姿态数据,并结合姿态解算算法实现姿态估计的方法,并提供相应的代码示例。 1. 硬件连接及库配置 首先,我们需要将…

算法第十三天-解码方法

解码方法 题目要求 解题思路 来自【宫水三叶】 基本分析 我们称一个解码内容为一个item。 根据题意,每个item可以由一个数字组成,也可以由两个数字组成。 数据范围为100,很具有迷惑性,可能会有不少同学会想使用DFS进行暴力搜索…

当大型语言模型(LLM)遇上知识图谱:两大技术优势互补

1 引言 大型语言模型(LLM)已经很强了,但还可以更强。通过结合知识图谱,LLM 有望解决缺乏事实知识、幻觉和可解释性等诸多问题;而反过来 LLM 也能助益知识图谱,让其具备强大的文本和语言理解能力。而如果能…

2024--Django平台开发-Web框架和Django基础(二)---Mysql多版本共存(Mac系统)

MySQL多版本共存(Mac系统) 想要在Mac系统上同时安装【MySQL5.7 】【MySQL8.0】版本,需要进行如下的操作和配置。 想要同时安装两个版本可以采取如下方案: 方案1:【讲解】 MySQL57,用安装包进行安装。 MyS…

Python 自学(五) 之字符串及正则表达式

目录 1. 字符串的分割合并 split() join() P132 2. 字符串的检索 count() find() index() startswith() endswith() P134 3. 去除空格和特殊字符 strip() lstrip() rstrip() P139 4. 格式化字符串 format() P142 5. 字符串编码…