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

news2024/9/21 10:32:30

前言

第三方库准备

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)

运行以下

数据库中表如下

创建成功。

最后

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

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

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

相关文章

uniapp 微信小程序跳转外部链接

一、背景: 开发小程序时,跳转到内部路径通常会使用:uni.navigateTo,uni.redirectTo,uni.reLaunch,uni.switchTab等方法,可以跳转到pages.json中已经注册的页面 uni.navigateTo(OBJECT) | uni-…

【KingbaseES】DataGrip配置链接KingbaseES V8R6数据库

新建驱动 填写内容如下: defaultjdbc:kingbase8://{host::localhost}:[{port::54321}]/[{:database::test}] 点击OK保存 测试链接 出现上图证明已经能链接了,保存链接看看数据库是否有我们的数据 发现好像什么都没有 再尝试,发现现在可以…

前端发开的性能优化 请求级:请求前(资源预加载和预读取)

预加载 预加载:是优化网页性能的重要技术,其目的就是在页面加载过程中先提前请求和获取相关的资源信息,减少用户的等待时间,提高用户的体验性。预加载的操作可以尝试去解决一些类似于减少首次内容渲染的时间,提升关键资…

ArkTS - 数据持久化

一、概述 应用数据持久化,是指应用将内存中的数据通过文件或数据库的形式保存到设备上。内存中的数据形态通常是任意的数据结构或数据对象,存储介质上的数据形态可能是文本、数据库、二进制文件等。 持久(Persistence)&#xff0…

如何查看崩溃日志

​ 目录 描述 思路 查看ipa包崩溃日志 简单查看手机崩溃信息几种方式 方式1:手机设置查看崩溃日志 方式2: Xocde工具 方式3: 第三方软件克魔助手 环境配置 实时日志 奔溃日志分析 方式四:控制台资源库 线上崩溃日志 线上监听crash的几种方式 方式1: 三…

GEC6818科大讯飞离线语音识别

GEC6818科大讯飞离线语音识别 文章目录 GEC6818科大讯飞离线语音识别一、 下载科大讯飞离线语音SDK二、 解压文件夹后三、与GEC6818开发板一起使用3.1 使用科大讯飞的离线语音在ubantu中运行,作为服务端进行关键字的识别3.2 call.bnf-->hehe.bnf3.3 asr_offine_s…

JavaWeb基础(1)- Html与JavaScript(JavaScript基础语法、变量、数据类型、运算符、函数、对象、事件监听、正则表达式)

JavaWeb基础(1)- Html与JavaScript(JavaScript基础语法、变量、数据类型、运算符、函数、对象、事件监听、正则表达式) 文章目录 JavaWeb基础(1)- Html与JavaScript(JavaScript基础语法、变量、数据类型、运算符、函数、对象、事件…

什么是软件安全性测试?如何进行安全测试?

一、什么是软件安全性测试? 软件安全性测试是指对软件系统中的安全漏洞进行检测和评估的过程。其目的是为了确保软件系统在面对各种安全威胁时能够保持其功能的完整性、可用性和机密性。 二、软件安全性测试可以通过以下几个步骤来进行: 1. 需求分析&a…

强化学习8——在冰壶环境中使用策略迭代和价值迭代算法

冰壶环境 环境介绍 OpenAI Gym库中包含了很多有名的环境,冰湖是 OpenAI Gym 库中的一个环境,和悬崖漫步环境相似,大小为44的网格,每个网格是一个状态,智能体起点状态S在左上角,目标状G态在右下角&#xf…

计算机毕业设计----SSM BBS论坛

项目介绍 本项目包含前后台,前台为普通用户登录,后台为管理员登录; 管理员角色包含以下功能: 管理员登录,删除或者编辑用户的帖子,后台管理,友情链接管理,用户管理,版块管理,网站设置,用户设置,版块主题管理等功能。 用户角色…

fpmarkets盘点成功交易者的十个习惯(一)

在交易中能够盈利一次,fpmarkets认为这种情况100%的交易者都会做到,但是要做到每次交易都能盈利,即使是巴菲特也做到,我们只需要做到整体盈利就可以了,那么如何做到呢?今天fpmarkets就总结一下成功交易者的…

斑马斑马跳

欢迎来到程序小院 斑马斑马跳 玩法:行走的斑马,点击鼠标左键斑马左右跳动,左右两侧有大树,和移动的小鸟, 撞到大树和小鸟游戏结束,统计分数,快去斑马跳吧^^。开始游戏https://www.ormcc.com/pl…

2024农历新年是什么时候?电脑如何设置农历新年提醒

元旦的钟声已经远去,2024年的阳历新年就这样悄无声息地开始了。但对于我们很多人来说,真正的“过年”氛围,还得等到农历新年的到来。那么,今年的农历新年究竟是什么时候呢?答案是2月10日。 每当想到农历新年&#xff…

浅析进程优先级(上)

什么是进程优先级? 进程优先级:将处理器资源分配给进程的先后顺序 Linux 中每个进程都有相应的优先级 (优先级可能动态改变) 进程优先级决定进程 何时执行 和 获得处理器的时间 进程优先级通常表现为一个整数值 (数值大小决定优先级高低) Linux 中的…

寻找两个相交链表的相交节点

分析: 如图所示, A 长度为mkB长度为nk张三,李四两人分别从A和B的起始点相同速度出发,无论谁到达终点时,都从另一条队列的起点再次出发。假定起始,张三沿着A走,李四沿着B走。当李四到达终点后&a…

计算机毕业设计选题分享-node.js旅游景点分享网站03796(赠送源码数据库)JAVA、PHP,node.js,C++、python,大屏数据可视化等

node.js旅游景点分享网站 摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。旅游景点分享网站设计,主要的模块包括查看后台首页、轮播图(轮播图管理)、网站公告…

list-watch和节点亲和性和node亲和性

k8s的集群调度 scheduler:负责调度资源,把pod调度到node节点 预算策略 优先策略 1、list-watch k8s集群当中,通过list-watch的机制进行每个组件的协作,保持数据同步,每个组件之间解耦 kubectl配置文件,向APIserv…

城堡世界定制

城堡世界是一款移动应用程序,通常在手机上使用。 该游戏的主要功能丰富多样,用户可以通过购买不同的城堡卡来开启自己的城堡,这不仅可以满足玩家对个性化的追求,还可以让玩家在游戏中获得更多的乐趣。 作为一家专注于互联网领域的…

Linux进程通信——system V进程间通信

目录 system V共享内存 共享内存的原理 共享内存的建立与释放 共享内存的创建 shmget 共享内存的释放 shmctl 共享内存的关联 shmat 共享内存的去关联 shmdt 用共享内存实现serve和client的简单通信 共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的…

分治法:分而治之

排序算法中的快速排序,归并排序都用了分治思想 题目描述: 题目地址:LeetCode 50 数组中的第K个最大元素 题目描述: 题目地址:LeetCode 215